/[thuban]/branches/WIP-pyshapelib-bramz/Thuban/Model/table.py
ViewVC logotype

Contents of /branches/WIP-pyshapelib-bramz/Thuban/Model/table.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 590 - (show annotations)
Wed Apr 2 15:03:19 2003 UTC (21 years, 11 months ago) by bh
Original Path: trunk/thuban/Thuban/Model/table.py
File MIME type: text/x-python
File size: 3576 byte(s)
Remove unnecessary import. Fix a typo.

1 # Copyright (c) 2001, 2002, 2003 by Intevation GmbH
2 # Authors:
3 # Bernhard Herzog <[email protected]>
4 #
5 # This program is free software under the GPL (>=v2)
6 # Read the file COPYING coming with Thuban for details.
7
8 """
9 Classes for handling tables of data.
10 """
11
12 __version__ = "$Revision$"
13
14 import dbflib
15
16 # the field types supported by a Table instance.
17 FIELDTYPE_INT = "int"
18 FIELDTYPE_STRING = "string"
19 FIELDTYPE_DOUBLE = "double"
20
21
22 # map the dbflib constants for the field types to our constants
23 dbflib_fieldtypes = {dbflib.FTString: FIELDTYPE_STRING,
24 dbflib.FTInteger: FIELDTYPE_INT,
25 dbflib.FTDouble: FIELDTYPE_DOUBLE}
26
27 class Table:
28
29 """
30 Represent a table of data.
31
32 Currently this is basically just a wrapper around dbflib.
33 """
34
35 # Implementation strategy regarding writing to a DBF file:
36 #
37 # Most of the time Thuban only needs to read from a table and it is
38 # important that Thuban can work with read-only files. Therefore the
39 # DBF file is opened only for reading initially. Only when
40 # write_record is called we try to open the DBF file for writing as
41 # well. If that succeeds the read/write DBF file will be used for
42 # all IO afterwards.
43 #
44 # It's important to use the same DBF file object for both reading
45 # and writing to make sure that reading a records after writing
46 # returns the new values. With two separate objects this wouldn't
47 # work because a DBF file object buffers some data
48
49 def __init__(self, filename):
50 self.filename = filename
51 self.dbf = dbflib.DBFFile(filename)
52
53 # If true, self.dbf is open for writing.
54 self._writable = 0
55
56 def Destroy(self):
57 self.dbf.close()
58 self.dbf = None
59
60 def record_count(self):
61 """Return the number of records"""
62 return self.dbf.record_count()
63
64 def field_count(self):
65 """Return the number of fields in a record"""
66 return self.dbf.field_count()
67
68 def field_info(self, field):
69 """Return a tuple (type, name, width, prec) for the field no. field
70
71 type is the data type of the field, name the name, width the
72 field width in characters and prec the decimal precision.
73 """
74 type, name, width, prec = self.dbf.field_info(field)
75 type = dbflib_fieldtypes[type]
76 return type, name, width, prec
77
78 def field_info_by_name(self, fieldName):
79 count = self.field_count()
80
81 for i in range(count):
82 info = self.field_info(i)
83 if info[1] == fieldName:
84 return info
85
86 return None
87
88 def read_record(self, record):
89 """Return the record no. record as a dict mapping field names to values
90 """
91 return self.dbf.read_record(record)
92
93 def write_record(self, record, values):
94 """Write the values into the record
95
96 The values parameter may either be a dictionary or a sequence.
97
98 If it's a dictionary the keys must be the names of the fields
99 and their value must have a suitable type. Only the fields
100 actually contained in the dictionary are written. Fields for
101 which there's no item in the dict are not modified.
102
103 If it's a sequence, all fields must be present in the right
104 order.
105 """
106 if not self._writable:
107 new_dbf = dbflib.DBFFile(self.filename, "r+b")
108 self.dbf.close()
109 self.dbf = new_dbf
110 self._writable = 1
111 self.dbf.write_record(record, values)
112 self.dbf.commit()
113

Properties

Name Value
svn:eol-style native
svn:keywords Author Date Id Revision

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26