some speadup in dal parse 1.5x

This commit is contained in:
mdipierro
2012-08-26 11:50:48 -05:00
parent 0ac105840e
commit c67d3070f2
2 changed files with 49 additions and 28 deletions
+1 -1
View File
@@ -1 +1 @@
Version 2.00.0 (2012-08-26 10:41:21) dev
Version 2.00.0 (2012-08-26 11:50:44) dev
+48 -27
View File
@@ -1783,36 +1783,37 @@ class BaseAdapter(ConnectionPool):
db = self.db
virtualtables = []
new_rows = []
tmps = []
for colname in colnames:
if not regex_table_field.match(colname):
tmps.append(None)
else:
(tablename, fieldname) = colname.split('.')
table = db[tablename]
field = table[fieldname]
tmps.append((tablename,fieldname,table,field))
for (i,row) in enumerate(rows):
new_row = Row()
for j,colname in enumerate(colnames):
value = row[j]
if not regex_table_field.match(colnames[j]):
if not '_extra' in new_row:
new_row['_extra'] = Row()
new_row['_extra'][colnames[j]] = \
self.parse_value(value, fields[j].type,blob_decode)
new_column_name = \
regex_select_as_parser.search(colnames[j])
if not new_column_name is None:
column_name = new_column_name.groups(0)
setattr(new_row,column_name[0],value)
else:
(tablename, fieldname) = colname.split('.')
table = db[tablename]
field = table[fieldname]
if not tablename in new_row:
for (j,colname) in enumerate(colnames):
value = row[j]
tmp = tmps[j]
if tmp:
(tablename,fieldname,table,field) = tmp
if tablename in new_row:
colset = new_row[tablename]
else:
colset = new_row[tablename] = Row()
if tablename not in virtualtables:
virtualtables.append(tablename)
else:
colset = new_row[tablename]
value = self.parse_value(value,field.type,blob_decode)
if field.filter_out: value = field.filter_out(value)
value = self.parse_value(value,field.type,
blob_decode)
if field.filter_out:
value = field.filter_out(value)
colset[fieldname] = value
if field.type == 'id':
# temporary hack to deal with GoogleDatastoreAdapter
# temporary hack to deal with
# GoogleDatastoreAdapter
# references
if isinstance(self, GoogleDatastoreAdapter):
id = value.key().id_or_name()
@@ -1826,12 +1827,26 @@ class BaseAdapter(ConnectionPool):
colset.delete_record = (
lambda t = table, i = id:
t._db(t._id==i).delete())
for (referee_table, referee_name) in table._referenced_by:
for (referee_table, referee_name) \
in table._referenced_by:
s = db[referee_table][referee_name]
referee_link = db._referee_name and \
db._referee_name % dict(table=referee_table,field=referee_name)
if referee_link and not referee_link in colset:
db._referee_name % dict(
table=referee_table,field=referee_name)
if referee_link and \
not referee_link in colset:
colset[referee_link] = Set(db, s == id)
else:
if not '_extra' in new_row:
new_row['_extra'] = Row()
new_row['_extra'][colname] = \
self.parse_value(value,
fields[j].type,blob_decode)
new_column_name = \
regex_select_as_parser.search(colname)
if not new_column_name is None:
column_name = new_column_name.groups(0)
setattr(new_row,column_name[0],value)
new_rows.append(new_row)
rowsobj = Rows(db, new_rows, colnames, rawrows=rows)
@@ -3136,7 +3151,7 @@ class FireBirdAdapter(BaseAdapter):
def __init__(self,db,uri,pool_size=0,folder=None,db_codec ='UTF-8',
credential_decoder=IDENTITY, driver_args={},
adapter_args={}):
if adapter_args.has_key('driver_name'):
if 'driver_name' in adapter_args:
if adapter_args['driver_name'] == 'kinterbasdb':
self.driver = kinterbasdb
elif adapter_args['driver_name'] == 'firebirdsql':
@@ -3202,7 +3217,7 @@ class FireBirdEmbeddedAdapter(FireBirdAdapter):
credential_decoder=IDENTITY, driver_args={},
adapter_args={}):
if adapter_args.has_key('driver_name'):
if 'driver_name' in adapter_args:
if adapter_args['driver_name'] == 'kinterbasdb':
self.driver = kinterbasdb
elif adapter_args['driver_name'] == 'firebirdsql':
@@ -6314,6 +6329,9 @@ class Row(object):
def __contains__(self,key):
return key in self.__dict__
def update(self, *args, **kwargs):
self.__dict__.update(*args, **kwargs)
def keys(self):
return self.__dict__.keys()
@@ -6998,6 +7016,9 @@ def index():
def __contains__(self, tablename):
return tablename in self.tables
def get(self,key,default):
return self.__dict__.get(key,default)
def __iter__(self):
for tablename in self.tables:
yield self[tablename]