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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 628 - (hide annotations)
Wed Apr 9 10:09:15 2003 UTC (21 years, 11 months ago) by jonathan
Original Path: trunk/thuban/Thuban/Model/table.py
File MIME type: text/x-python
File size: 5158 byte(s)
(Table.field_range): New. Retrive the
        maximum and minimum values over the entire table for a given
        field.
(Table.GetUniqueValues): New. Retrieve all the unique values
        in the table for a given field.

1 bh 590 # Copyright (c) 2001, 2002, 2003 by Intevation GmbH
2 bh 6 # 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 jonathan 474 FIELDTYPE_INT = "int"
18     FIELDTYPE_STRING = "string"
19     FIELDTYPE_DOUBLE = "double"
20 bh 6
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 bh 286 # 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 bh 590 # well. If that succeeds the read/write DBF file will be used for
42     # all IO afterwards.
43 bh 286 #
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 bh 6 def __init__(self, filename):
50     self.filename = filename
51 bh 284 self.dbf = dbflib.DBFFile(filename)
52 bh 6
53 bh 286 # If true, self.dbf is open for writing.
54     self._writable = 0
55    
56 bh 257 def Destroy(self):
57     self.dbf.close()
58     self.dbf = None
59    
60 bh 6 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 jonathan 467 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 jonathan 628 def field_range(self, fieldName):
89     """Finds the first occurences of the minimum and maximum values
90     in the table for the given field.
91    
92     This assumes that the standard comparison operators (<, >, etc.)
93     will work for the given data.
94    
95     Returns a tuple ((min, rec), (max, rec)) where:
96     min is the minimum value
97     max is the maximum value
98     rec is the record number where the value was found. One
99     should check that the record number of min is not
100     the same as the record number of max.
101    
102     Returns None if there are no records
103    
104     """
105    
106    
107     count = self.record_count()
108    
109     if count == 0:
110     return None
111    
112     rec = self.read_record(0)
113    
114     min = rec[fieldName]
115     min_rec = 0
116    
117     max = rec[fieldName]
118     max_rec = 0
119    
120     for i in range(1, count):
121     rec = self.read_record(i)
122     data = rec[fieldName]
123    
124     if data < min:
125     min = data
126     min_rec = rec
127     elif data > max:
128     max = data
129     max_rec = rec
130    
131     return ((min, min_rec), (max, max_rec))
132    
133     def GetUniqueValues(self, fieldName):
134     """Return a list of all unique entries in the table for the given
135     field name.
136     """
137    
138     dict = {}
139    
140     for i in range(0, self.record_count()):
141     rec = self.read_record(i)
142     data = rec[fieldName]
143    
144     if not dict.has_key(data):
145     dict[data] = 0
146    
147     return dict.keys()
148    
149 bh 6 def read_record(self, record):
150     """Return the record no. record as a dict mapping field names to values
151     """
152     return self.dbf.read_record(record)
153    
154 bh 274 def write_record(self, record, values):
155     """Write the values into the record
156    
157     The values parameter may either be a dictionary or a sequence.
158    
159     If it's a dictionary the keys must be the names of the fields
160     and their value must have a suitable type. Only the fields
161     actually contained in the dictionary are written. Fields for
162     which there's no item in the dict are not modified.
163    
164     If it's a sequence, all fields must be present in the right
165     order.
166     """
167 bh 286 if not self._writable:
168     new_dbf = dbflib.DBFFile(self.filename, "r+b")
169     self.dbf.close()
170     self.dbf = new_dbf
171     self._writable = 1
172     self.dbf.write_record(record, values)
173     self.dbf.commit()
174 jonathan 467

Properties

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

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26