source: branches/samba-3.0/source/tdb/swig/Tdb.py

Last change on this file was 1, checked in by Paul Smedley, 18 years ago

Initial code import

File size: 3.2 KB
Line 
1"""Provide a more Pythonic and object-oriented interface to tdb."""
2
3#
4# Swig interface to Samba
5#
6# Copyright (C) Tim Potter 2006
7#
8# This program is free software; you can redistribute it and/or modify
9# it under the terms of the GNU General Public License as published by
10# the Free Software Foundation; either version 2 of the License, or
11# (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU General Public License for more details.
17#
18# You should have received a copy of the GNU General Public License
19# along with this program; if not, write to the Free Software
20# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21#
22
23import os
24from tdb import *
25
26# Open flags
27
28DEFAULT = TDB_DEFAULT
29CLEAR_IF_FIRST = TDB_CLEAR_IF_FIRST
30INTERNAL = TDB_INTERNAL
31NOLOCK = TDB_NOLOCK
32NOMMAP = TDB_NOMMAP
33
34# Class representing a TDB file
35
36class Tdb:
37
38 # Create and destroy Tdb objects
39
40 def __init__(self, name, hash_size = 0, flags = TDB_DEFAULT,
41 open_flags = os.O_RDWR | os.O_CREAT, mode = 0600):
42 self.tdb = tdb_open(name, hash_size, flags, open_flags, mode)
43 if self.tdb is None:
44 raise IOError, tdb_errorstr(self.tdb)
45
46 def __del__(self):
47 self.close()
48
49 def close(self):
50 if hasattr(self, 'tdb') and self.tdb is not None:
51 if tdb_close(self.tdb) == -1:
52 raise IOError, tdb_errorstr(self.tdb)
53 self.tdb = None
54
55 # Random access to keys, values
56
57 def __getitem__(self, key):
58 result = tdb_fetch(self.tdb, key)
59 if result is None:
60 raise KeyError, '%s: %s' % (key, tdb_errorstr(self.tdb))
61 return result
62
63 def __setitem__(self, key, item):
64 if tdb_store(self.tdb, key, item) == -1:
65 raise IOError, tdb_errorstr(self.tdb)
66
67 def __delitem__(self, key):
68 if not tdb_exists(self.tdb, key):
69 raise KeyError, '%s: %s' % (key, tdb_errorstr(self.tdb))
70 tdb_delete(self.tdb, key)
71
72 def has_key(self, key):
73 return tdb_exists(self.tdb, key)
74
75 # Tdb iterator
76
77 class TdbIterator:
78 def __init__(self, tdb):
79 self.tdb = tdb
80 self.key = None
81
82 def __iter__(self):
83 return self
84
85 def next(self):
86 if self.key is None:
87 self.key = tdb_firstkey(self.tdb)
88 if self.key is None:
89 raise StopIteration
90 return self.key
91 else:
92 self.key = tdb_nextkey(self.tdb, self.key)
93 if self.key is None:
94 raise StopIteration
95 return self.key
96
97 def __iter__(self):
98 return Tdb.TdbIterator(self.tdb)
99
100 # Implement other dict functions using TdbIterator
101
102 def keys(self):
103 return [k for k in iter(self)]
104
105 def values(self):
106 return [self[k] for k in iter(self)]
107
108 def items(self):
109 return [(k, self[k]) for k in iter(self)]
110
111 def __len__(self):
112 return len(self.keys())
113
114 def clear(self):
115 for k in iter(self):
116 del(self[k])
Note: See TracBrowser for help on using the repository browser.