ยปCore Development>Code coverage>Lib/bsddb/dbrecio.py

Python code coverage for Lib/bsddb/dbrecio.py

#countcontent
1n/a
2n/a"""
3n/aFile-like objects that read from or write to a bsddb record.
4n/a
5n/aThis implements (nearly) all stdio methods.
6n/a
7n/af = DBRecIO(db, key, txn=None)
8n/af.close() # explicitly release resources held
9n/aflag = f.isatty() # always false
10n/apos = f.tell() # get current position
11n/af.seek(pos) # set current position
12n/af.seek(pos, mode) # mode 0: absolute; 1: relative; 2: relative to EOF
13n/abuf = f.read() # read until EOF
14n/abuf = f.read(n) # read up to n bytes
15n/af.truncate([size]) # truncate file at to at most size (default: current pos)
16n/af.write(buf) # write at current position
17n/af.writelines(list) # for line in list: f.write(line)
18n/a
19n/aNotes:
20n/a- fileno() is left unimplemented so that code which uses it triggers
21n/a an exception early.
22n/a- There's a simple test set (see end of this file) - not yet updated
23n/a for DBRecIO.
24n/a- readline() is not implemented yet.
25n/a
26n/a
27n/aFrom:
28n/a Itamar Shtull-Trauring <itamar@maxnm.com>
29n/a"""
30n/a
31n/aimport errno
32n/aimport string
33n/a
34n/aclass DBRecIO:
35n/a def __init__(self, db, key, txn=None):
36n/a self.db = db
37n/a self.key = key
38n/a self.txn = txn
39n/a self.len = None
40n/a self.pos = 0
41n/a self.closed = 0
42n/a self.softspace = 0
43n/a
44n/a def close(self):
45n/a if not self.closed:
46n/a self.closed = 1
47n/a del self.db, self.txn
48n/a
49n/a def isatty(self):
50n/a if self.closed:
51n/a raise ValueError, "I/O operation on closed file"
52n/a return 0
53n/a
54n/a def seek(self, pos, mode = 0):
55n/a if self.closed:
56n/a raise ValueError, "I/O operation on closed file"
57n/a if mode == 1:
58n/a pos = pos + self.pos
59n/a elif mode == 2:
60n/a pos = pos + self.len
61n/a self.pos = max(0, pos)
62n/a
63n/a def tell(self):
64n/a if self.closed:
65n/a raise ValueError, "I/O operation on closed file"
66n/a return self.pos
67n/a
68n/a def read(self, n = -1):
69n/a if self.closed:
70n/a raise ValueError, "I/O operation on closed file"
71n/a if n < 0:
72n/a newpos = self.len
73n/a else:
74n/a newpos = min(self.pos+n, self.len)
75n/a
76n/a dlen = newpos - self.pos
77n/a
78n/a r = self.db.get(self.key, txn=self.txn, dlen=dlen, doff=self.pos)
79n/a self.pos = newpos
80n/a return r
81n/a
82n/a __fixme = """
83n/a def readline(self, length=None):
84n/a if self.closed:
85n/a raise ValueError, "I/O operation on closed file"
86n/a if self.buflist:
87n/a self.buf = self.buf + string.joinfields(self.buflist, '')
88n/a self.buflist = []
89n/a i = string.find(self.buf, '\n', self.pos)
90n/a if i < 0:
91n/a newpos = self.len
92n/a else:
93n/a newpos = i+1
94n/a if length is not None:
95n/a if self.pos + length < newpos:
96n/a newpos = self.pos + length
97n/a r = self.buf[self.pos:newpos]
98n/a self.pos = newpos
99n/a return r
100n/a
101n/a def readlines(self, sizehint = 0):
102n/a total = 0
103n/a lines = []
104n/a line = self.readline()
105n/a while line:
106n/a lines.append(line)
107n/a total += len(line)
108n/a if 0 < sizehint <= total:
109n/a break
110n/a line = self.readline()
111n/a return lines
112n/a """
113n/a
114n/a def truncate(self, size=None):
115n/a if self.closed:
116n/a raise ValueError, "I/O operation on closed file"
117n/a if size is None:
118n/a size = self.pos
119n/a elif size < 0:
120n/a raise IOError(errno.EINVAL,
121n/a "Negative size not allowed")
122n/a elif size < self.pos:
123n/a self.pos = size
124n/a self.db.put(self.key, "", txn=self.txn, dlen=self.len-size, doff=size)
125n/a
126n/a def write(self, s):
127n/a if self.closed:
128n/a raise ValueError, "I/O operation on closed file"
129n/a if not s: return
130n/a if self.pos > self.len:
131n/a self.buflist.append('\0'*(self.pos - self.len))
132n/a self.len = self.pos
133n/a newpos = self.pos + len(s)
134n/a self.db.put(self.key, s, txn=self.txn, dlen=len(s), doff=self.pos)
135n/a self.pos = newpos
136n/a
137n/a def writelines(self, list):
138n/a self.write(string.joinfields(list, ''))
139n/a
140n/a def flush(self):
141n/a if self.closed:
142n/a raise ValueError, "I/O operation on closed file"
143n/a
144n/a
145n/a"""
146n/a# A little test suite
147n/a
148n/adef _test():
149n/a import sys
150n/a if sys.argv[1:]:
151n/a file = sys.argv[1]
152n/a else:
153n/a file = '/etc/passwd'
154n/a lines = open(file, 'r').readlines()
155n/a text = open(file, 'r').read()
156n/a f = StringIO()
157n/a for line in lines[:-2]:
158n/a f.write(line)
159n/a f.writelines(lines[-2:])
160n/a if f.getvalue() != text:
161n/a raise RuntimeError, 'write failed'
162n/a length = f.tell()
163n/a print 'File length =', length
164n/a f.seek(len(lines[0]))
165n/a f.write(lines[1])
166n/a f.seek(0)
167n/a print 'First line =', repr(f.readline())
168n/a here = f.tell()
169n/a line = f.readline()
170n/a print 'Second line =', repr(line)
171n/a f.seek(-len(line), 1)
172n/a line2 = f.read(len(line))
173n/a if line != line2:
174n/a raise RuntimeError, 'bad result after seek back'
175n/a f.seek(len(line2), 1)
176n/a list = f.readlines()
177n/a line = list[-1]
178n/a f.seek(f.tell() - len(line))
179n/a line2 = f.read()
180n/a if line != line2:
181n/a raise RuntimeError, 'bad result after seek back from EOF'
182n/a print 'Read', len(list), 'more lines'
183n/a print 'File length =', f.tell()
184n/a if f.tell() != length:
185n/a raise RuntimeError, 'bad length'
186n/a f.close()
187n/a
188n/aif __name__ == '__main__':
189n/a _test()
190n/a"""