18 |
# $Source$ |
# $Source$ |
19 |
# $Id$ |
# $Id$ |
20 |
|
|
|
import os |
|
|
import weakref |
|
21 |
from sqlite import connect |
from sqlite import connect |
22 |
|
|
23 |
from base import TitledObject |
from base import TitledObject |
160 |
""" |
""" |
161 |
return self.column_map.has_key(col) |
return self.column_map.has_key(col) |
162 |
|
|
163 |
def ReadRowAsDict(self, index): |
def RowIdToOrdinal(self, gid): |
164 |
|
"""Return the row ordinal given its id |
165 |
|
|
166 |
|
At the moment the transient tables are only used for tables that |
167 |
|
don't distinguish between row number and row id, so the value is |
168 |
|
returned unchanged. |
169 |
|
""" |
170 |
|
return gid |
171 |
|
|
172 |
|
def RowOrdinalToId(self, num): |
173 |
|
"""Return the rowid for given its ordinal |
174 |
|
|
175 |
|
At the moment the transient tables are only used for tables that |
176 |
|
don't distinguish between row number and row id, so the value is |
177 |
|
returned unchanged. |
178 |
|
""" |
179 |
|
return num |
180 |
|
|
181 |
|
def ReadRowAsDict(self, index, row_is_ordinal = 0): |
182 |
|
"""Return the entire row as a dictionary with column names as keys |
183 |
|
|
184 |
|
The row_is_ordinal is ignored because at the moment the |
185 |
|
transient tables are only used for DBF files where it doesn't |
186 |
|
matter. |
187 |
|
""" |
188 |
# Implementation Strategy: Executing a completely new select |
# Implementation Strategy: Executing a completely new select |
189 |
# statement every time this method is called is too slow. The |
# statement every time this method is called is too slow. The |
190 |
# most important usage is to read the records more or less |
# most important usage is to read the records more or less |
232 |
self.read_record_last_row = index |
self.read_record_last_row = index |
233 |
return dict(zip(self.orig_names, result)) |
return dict(zip(self.orig_names, result)) |
234 |
|
|
235 |
def ReadValue(self, row, col): |
def ReadValue(self, row, col, row_is_ordinal = 0): |
236 |
"""Return the value of the specified row and column |
"""Return the value of the specified row and column |
237 |
|
|
238 |
The col parameter may be the index of the column or its name. |
The col parameter may be the index of the column or its name. |
239 |
|
|
240 |
|
The row_is_ordinal is ignored because at the moment the |
241 |
|
transient tables are only used for DBF files where it doesn't |
242 |
|
matter. |
243 |
""" |
""" |
244 |
# Depending on the actual access patterns of the table data, it |
# Depending on the actual access patterns of the table data, it |
245 |
# might be a bit faster in some circumstances to not implement |
# might be a bit faster in some circumstances to not implement |
271 |
def Width(self, col): |
def Width(self, col): |
272 |
"""Return the maximum width of values in the column |
"""Return the maximum width of values in the column |
273 |
|
|
274 |
The return value is the the maximum length of string representation |
The return value is the the maximum length of string |
275 |
of the values in the column (represented by index or name).""" |
representation of the values in the column (represented by index |
276 |
|
or name). |
277 |
|
""" |
278 |
max = 0 |
max = 0 |
279 |
|
|
280 |
type = self.column_map[col].type |
type = self.column_map[col].type |
281 |
iname = self.column_map[col].internal_name |
iname = self.column_map[col].internal_name |
282 |
cursor = self.db.cursor() |
cursor = self.db.cursor() |
285 |
if not values: |
if not values: |
286 |
return None |
return None |
287 |
|
|
288 |
if type == sql_type_map[table.FIELDTYPE_DOUBLE]: |
if type == table.FIELDTYPE_DOUBLE: |
289 |
format = "%.12f" |
format = "%.12f" |
290 |
elif type == sql_type_map[table.FIELDTYPE_INT]: |
elif type == table.FIELDTYPE_INT: |
291 |
format = "%d" |
format = "%d" |
292 |
else: |
else: |
293 |
format = "%s" |
format = "%s" |
530 |
def NumColumns(self): |
def NumColumns(self): |
531 |
return self.table.NumColumns() |
return self.table.NumColumns() |
532 |
|
|
533 |
def ReadRowAsDict(self, record): |
def RowIdToOrdinal(self, gid): |
534 |
|
"""Return the row ordinal given its id""" |
535 |
|
if self.t_table is not None: |
536 |
|
return self.t_table.RowIdToOrdinal(gid) |
537 |
|
else: |
538 |
|
return self.table.RowIdToOrdinal(gid) |
539 |
|
|
540 |
|
def RowOrdinalToId(self, num): |
541 |
|
"""Return the rowid for given its ordinal""" |
542 |
|
if self.t_table is not None: |
543 |
|
return self.t_table.RowOrdinalToId(num) |
544 |
|
else: |
545 |
|
return self.table.RowOrdinalToId(num) |
546 |
|
|
547 |
|
def ReadRowAsDict(self, record, row_is_ordinal = 0): |
548 |
"""Return the record no. record as a dict mapping field names to values |
"""Return the record no. record as a dict mapping field names to values |
549 |
""" |
""" |
550 |
if self.t_table is not None: |
if self.t_table is not None: |
551 |
return self.t_table.ReadRowAsDict(record) |
return self.t_table.ReadRowAsDict(record, |
552 |
|
row_is_ordinal = row_is_ordinal) |
553 |
else: |
else: |
554 |
return self.table.ReadRowAsDict(record) |
return self.table.ReadRowAsDict(record, |
555 |
|
row_is_ordinal = row_is_ordinal) |
556 |
|
|
557 |
def ReadValue(self, row, col): |
def ReadValue(self, row, col, row_is_ordinal = 0): |
558 |
"""Return the value of the specified row and column |
"""Return the value of the specified row and column |
559 |
|
|
560 |
The col parameter may be the index of the column or its name. |
The col parameter may be the index of the column or its name. |
561 |
""" |
""" |
562 |
if self.t_table is not None: |
if self.t_table is not None: |
563 |
return self.t_table.ReadValue(row, col) |
return self.t_table.ReadValue(row, col, |
564 |
|
row_is_ordinal = row_is_ordinal) |
565 |
else: |
else: |
566 |
return self.table.ReadValue(row, col) |
return self.table.ReadValue(row, col, |
567 |
|
row_is_ordinal = row_is_ordinal) |
568 |
|
|
569 |
def copy_to_transient(self): |
def copy_to_transient(self): |
570 |
"""Internal: Create a transient table and copy the data into it""" |
"""Internal: Create a transient table and copy the data into it""" |