|
1 // Copyright (C) 1999,2000 Bruce Guenter <bruceg@em.ca> |
|
2 // |
|
3 // This program is free software; you can redistribute it and/or modify |
|
4 // it under the terms of the GNU General Public License as published by |
|
5 // the Free Software Foundation; either version 2 of the License, or |
|
6 // (at your option) any later version. |
|
7 // |
|
8 // This program is distributed in the hope that it will be useful, |
|
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
11 // GNU General Public License for more details. |
|
12 // |
|
13 // You should have received a copy of the GNU General Public License |
|
14 // along with this program; if not, write to the Free Software |
|
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|
16 |
|
17 #include <config.h> |
|
18 #include <errno.h> |
|
19 #include "vpwtable.h" |
|
20 #include <gdbm.h> |
|
21 |
|
22 class gdbm_vpwtable_writer : public vpwtable_writer |
|
23 { |
|
24 private: |
|
25 const mystring& tmpname; |
|
26 const mystring& destname; |
|
27 GDBM_FILE out; |
|
28 bool opened; |
|
29 public: |
|
30 gdbm_vpwtable_writer(const mystring& filename); |
|
31 ~gdbm_vpwtable_writer(); |
|
32 bool operator!() const; |
|
33 bool put(const vpwentry& vpw); |
|
34 bool end(); |
|
35 bool abort(); |
|
36 }; |
|
37 |
|
38 vpwtable_writer* vpwtable::start_write() const |
|
39 { |
|
40 return new gdbm_vpwtable_writer(filename); |
|
41 } |
|
42 |
|
43 gdbm_vpwtable_writer::gdbm_vpwtable_writer(const mystring& filename) |
|
44 : tmpname(filename + ".tmp"), destname(filename), |
|
45 out(gdbm_open((char*)filename.c_str(), 0, GDBM_NEWDB|GDBM_FAST, 0600, 0)), |
|
46 opened(true) |
|
47 { |
|
48 } |
|
49 |
|
50 gdbm_vpwtable_writer::~gdbm_vpwtable_writer() |
|
51 { |
|
52 end(); |
|
53 } |
|
54 |
|
55 bool gdbm_vpwtable_writer::operator!() const |
|
56 { |
|
57 return opened; |
|
58 } |
|
59 |
|
60 bool gdbm_vpwtable_writer::put(const vpwentry& vpw) |
|
61 { |
|
62 mystring name = vpw->name.lower(); |
|
63 datum key = { (char*)name.c_str(), name.length() }; |
|
64 mystring binary = vpw->to_record(); |
|
65 datum data = { (char*)binary.c_str(), binary.length() }; |
|
66 return gdbm_store(out, key, data, GDBM_INSERT) == 0; |
|
67 } |
|
68 |
|
69 bool gdbm_vpwtable_writer::end() |
|
70 { |
|
71 if(!opened) |
|
72 return false; |
|
73 gdbm_sync(out); |
|
74 opened = false; |
|
75 return gdbm_close(out) == 0 && |
|
76 rename(tmpname.c_str(), destname.c_str()) == 0; |
|
77 } |
|
78 |
|
79 bool gdbm_vpwtable_writer::abort() |
|
80 { |
|
81 if(!opened) |
|
82 return false; |
|
83 opened = false; |
|
84 gdbm_close(out); |
|
85 return unlink(tmpname.c_str()) == 0; |
|
86 } |