some dal.py indentation work

This commit is contained in:
mdipierro
2012-07-31 12:07:11 -05:00
parent bedd215cfb
commit 2ee0844520
2 changed files with 167 additions and 87 deletions
+1 -1
View File
@@ -1 +1 @@
Version 2.00.0 (2012-07-31 11:22:34) dev
Version 2.00.0 (2012-07-31 12:07:08) dev
+166 -86
View File
@@ -39,7 +39,8 @@ Example of usage:
>>> # from dal import DAL, Field
### create DAL connection (and create DB if it doesn't exist)
>>> db = DAL(('mysql://a:b@localhost/x', 'sqlite://storage.sqlite'), folder=None)
>>> db = DAL(('mysql://a:b@localhost/x', 'sqlite://storage.sqlite'),
... folder=None)
### define a table 'person' (create/alter as necessary)
>>> person = db.define_table('person',Field('name','string'))
@@ -69,7 +70,8 @@ Example of usage:
0
### retrieve multiple records (rows)
>>> people = db(person).select(orderby=person.name, groupby=person.name, limitby=(0,100))
>>> people = db(person).select(orderby=person.name,
... groupby=person.name, limitby=(0,100))
### further filter them
>>> james = people.find(lambda row: row.name == 'James').first()
@@ -89,7 +91,8 @@ Example of usage:
>>> person.drop()
Supported field types:
id string text boolean integer double decimal password upload blob time date datetime
id string text boolean integer double decimal password upload
blob time date datetime
Supported DAL URI strings:
'sqlite://test.db'
@@ -168,7 +171,8 @@ import glob
import traceback
import platform
CALLABLETYPES = (types.LambdaType, types.FunctionType, types.BuiltinFunctionType,
CALLABLETYPES = (types.LambdaType, types.FunctionType,
types.BuiltinFunctionType,
types.MethodType, types.BuiltinMethodType)
@@ -226,7 +230,7 @@ try:
from new import classobj
from google.appengine.ext import db as gae
from google.appengine.api import namespace_manager, rdbms
from google.appengine.api.datastore_types import Key ### needed for belongs on ID
from google.appengine.api.datastore_types import Key ### for belongs on ID
from google.appengine.ext.db.polymodel import PolyModel
drivers.append('google')
except ImportError:
@@ -411,7 +415,8 @@ if 'google' in drivers:
self.round = decimal.Decimal(d)
def get_value_for_datastore(self, model_instance):
value = super(GAEDecimalProperty, self).get_value_for_datastore(model_instance)
value = super(GAEDecimalProperty, self)\
.get_value_for_datastore(model_instance)
if value is None or value == '':
return None
else:
@@ -429,7 +434,8 @@ if 'google' in drivers:
return value
elif isinstance(value, basestring):
return decimal.Decimal(value)
raise gae.BadValueError("Property %s must be a Decimal or string." % self.name)
raise gae.BadValueError("Property %s must be a Decimal or string."\
% self.name)
###################################################################################
# class that handles connection pooling (all adapters are derived from this one)
@@ -496,7 +502,8 @@ class ConnectionPool(object):
def pool_connection(self, f, cursor=True):
"""
this function defines: self.connection and self.cursor (iff cursor is True)
this function defines: self.connection and self.cursor
(iff cursor is True)
if self.pool_size>0 it will try pull the connection from the pool
if the connection is not active (closed by db server) it will loop
if not self.pool_size or no active connections in pool makes a new one
@@ -711,7 +718,8 @@ class BaseAdapter(ConnectionPool):
schema = parms[0]
ftype = "SELECT AddGeometryColumn ('%%(schema)s', '%%(tablename)s', '%%(fieldname)s', %%(srid)s, '%s', %%(dimension)s);" % self.types[geotype]
ftype = ftype % dict(schema=schema, tablename=tablename,
fieldname=field.name, srid=srid, dimension=dimension)
fieldname=field.name, srid=srid,
dimension=dimension)
postcreation_fields.append(ftype)
elif not field.type in self.types:
raise SyntaxError, 'Field: unknown field type: %s for %s' % \
@@ -719,7 +727,8 @@ class BaseAdapter(ConnectionPool):
else:
ftype = self.types[field.type]\
% dict(length=field.length)
if not field.type.startswith('id') and not field.type.startswith('reference'):
if not field.type.startswith('id') and \
not field.type.startswith('reference'):
if field.notnull:
ftype += ' NOT NULL'
else:
@@ -735,11 +744,12 @@ class BaseAdapter(ConnectionPool):
sql=ftype)
if isinstance(field.default,(str,int,float)):
# Caveat: sql_fields and sql_fields_aux differ for default values.
# Caveat: sql_fields and sql_fields_aux
# differ for default values.
# sql_fields is used to trigger migrations and sql_fields_aux
# is used for create tables.
# The reason is that we do not want to trigger a migration simply
# because a default value changes.
# The reason is that we do not want to trigger
# a migration simply because a default value changes.
not_null = self.NOT_NULL(field.default, field.type)
ftype = ftype.replace('NOT NULL', not_null)
sql_fields_aux[field.name] = dict(sql=ftype)
@@ -770,20 +780,25 @@ class BaseAdapter(ConnectionPool):
if hasattr(table,'_primarykey'):
query = "CREATE TABLE %s(\n %s,\n %s) %s" % \
(tablename, fields, self.PRIMARY_KEY(', '.join(table._primarykey)),other)
(tablename, fields,
self.PRIMARY_KEY(', '.join(table._primarykey)),other)
else:
query = "CREATE TABLE %s(\n %s\n)%s" % \
(tablename, fields, other)
if self.uri.startswith('sqlite:///') or self.uri.startswith('spatialite:///'):
path_encoding = sys.getfilesystemencoding() or locale.getdefaultlocale()[1] or 'utf8'
dbpath = self.uri[9:self.uri.rfind('/')].decode('utf8').encode(path_encoding)
if self.uri.startswith('sqlite:///') \
or self.uri.startswith('spatialite:///'):
path_encoding = sys.getfilesystemencoding() \
or locale.getdefaultlocale()[1] or 'utf8'
dbpath = self.uri[9:self.uri.rfind('/')]\
.decode('utf8').encode(path_encoding)
else:
dbpath = self.folder
if not migrate:
return query
elif self.uri.startswith('sqlite:memory') or self.uri.startswith('spatialite:memory'):
elif self.uri.startswith('sqlite:memory')\
or self.uri.startswith('spatialite:memory'):
table._dbt = None
elif isinstance(migrate, str):
table._dbt = os.path.join(dbpath, migrate)
@@ -803,7 +818,8 @@ class BaseAdapter(ConnectionPool):
if not fake_migrate:
self.create_sequence_and_triggers(query,table)
table._db.commit()
# Postgres geom fields are added now, after the table has been created
# Postgres geom fields are added now,
# after the table has been created
for query in postcreation_fields:
self.execute(query)
table._db.commit()
@@ -884,13 +900,14 @@ class BaseAdapter(ConnectionPool):
elif not key in sql_fields:
del sql_fields_current[key]
ftype = sql_fields_old[key]['type']
if self.dbengine in ('postgres',) and ftype.startswith('geometry'):
if self.dbengine in ('postgres',) \
and ftype.startswith('geometry'):
geotype, parms = ftype[:-1].split('(')
schema = parms.split(',')[0]
query = [ "SELECT DropGeometryColumn ('%(schema)s', '%(table)s', '%(field)s');" % \
dict(schema=schema, table=tablename, field=key,) ]
query = [ "SELECT DropGeometryColumn ('%(schema)s', '%(table)s', '%(field)s');" % dict(schema=schema, table=tablename, field=key,) ]
elif not self.dbengine in ('firebird',):
query = ['ALTER TABLE %s DROP COLUMN %s;' % (tablename, key)]
query = ['ALTER TABLE %s DROP COLUMN %s;'
% (tablename, key)]
else:
query = ['ALTER TABLE %s DROP %s;' % (tablename, key)]
metadata_change = True
@@ -1071,13 +1088,16 @@ class BaseAdapter(ConnectionPool):
def ILIKE(self, first, second):
"case in-sensitive like operator"
return '(%s LIKE %s)' % (self.expand(first), self.expand(second, 'string'))
return '(%s LIKE %s)' % (self.expand(first),
self.expand(second, 'string'))
def STARTSWITH(self, first, second):
return '(%s LIKE %s)' % (self.expand(first), self.expand(second+'%', 'string'))
return '(%s LIKE %s)' % (self.expand(first),
self.expand(second+'%', 'string'))
def ENDSWITH(self, first, second):
return '(%s LIKE %s)' % (self.expand(first), self.expand('%'+second, 'string'))
return '(%s LIKE %s)' % (self.expand(first),
self.expand('%'+second, 'string'))
def CONTAINS(self, first, second):
if first.type in ('string', 'text'):
@@ -1089,47 +1109,58 @@ class BaseAdapter(ConnectionPool):
def EQ(self, first, second=None):
if second is None:
return '(%s IS NULL)' % self.expand(first)
return '(%s = %s)' % (self.expand(first), self.expand(second, first.type))
return '(%s = %s)' % (self.expand(first),
self.expand(second, first.type))
def NE(self, first, second=None):
if second is None:
return '(%s IS NOT NULL)' % self.expand(first)
return '(%s <> %s)' % (self.expand(first), self.expand(second, first.type))
return '(%s <> %s)' % (self.expand(first),
self.expand(second, first.type))
def LT(self,first,second=None):
if second is None:
raise RuntimeError, "Cannot compare %s < None" % first
return '(%s < %s)' % (self.expand(first),self.expand(second,first.type))
return '(%s < %s)' % (self.expand(first),
self.expand(second,first.type))
def LE(self,first,second=None):
if second is None:
raise RuntimeError, "Cannot compare %s <= None" % first
return '(%s <= %s)' % (self.expand(first),self.expand(second,first.type))
return '(%s <= %s)' % (self.expand(first),
self.expand(second,first.type))
def GT(self,first,second=None):
if second is None:
raise RuntimeError, "Cannot compare %s > None" % first
return '(%s > %s)' % (self.expand(first),self.expand(second,first.type))
return '(%s > %s)' % (self.expand(first),
self.expand(second,first.type))
def GE(self,first,second=None):
if second is None:
raise RuntimeError, "Cannot compare %s >= None" % first
return '(%s >= %s)' % (self.expand(first),self.expand(second,first.type))
return '(%s >= %s)' % (self.expand(first),
self.expand(second,first.type))
def ADD(self, first, second):
return '(%s + %s)' % (self.expand(first), self.expand(second, first.type))
return '(%s + %s)' % (self.expand(first),
self.expand(second, first.type))
def SUB(self, first, second):
return '(%s - %s)' % (self.expand(first), self.expand(second, first.type))
return '(%s - %s)' % (self.expand(first),
self.expand(second, first.type))
def MUL(self, first, second):
return '(%s * %s)' % (self.expand(first), self.expand(second, first.type))
return '(%s * %s)' % (self.expand(first),
self.expand(second, first.type))
def DIV(self, first, second):
return '(%s / %s)' % (self.expand(first), self.expand(second, first.type))
return '(%s / %s)' % (self.expand(first),
self.expand(second, first.type))
def MOD(self, first, second):
return '(%s %% %s)' % (self.expand(first), self.expand(second, first.type))
return '(%s %% %s)' % (self.expand(first),
self.expand(second, first.type))
def AS(self, first, second):
return '%s AS %s' % (self.expand(first), second)
@@ -1160,7 +1191,8 @@ class BaseAdapter(ConnectionPool):
elif field_type:
return str(self.represent(expression,field_type))
elif isinstance(expression,(list,tuple)):
return ','.join(self.represent(item,field_type) for item in expression)
return ','.join(self.represent(item,field_type) \
for item in expression)
elif isinstance(expression, bool):
return '1' if expression else '0'
else:
@@ -1216,7 +1248,8 @@ class BaseAdapter(ConnectionPool):
sql_w = ' WHERE ' + self.expand(query)
else:
sql_w = ''
sql_v = ','.join(['%s=%s' % (field.name, self.expand(value, field.type)) \
sql_v = ','.join(['%s=%s' % (field.name,
self.expand(value, field.type)) \
for (field, value) in fields])
return 'UPDATE %s SET %s%s;' % (tablename, sql_v, sql_w)
@@ -1254,7 +1287,8 @@ class BaseAdapter(ConnectionPool):
if self.dbengine in ('sqlite', 'spatialite') and counter:
for tablename,fieldname in table._referenced_by:
f = db[tablename][fieldname]
if f.type=='reference '+table._tablename and f.ondelete=='CASCADE':
if f.type=='reference '+table._tablename \
and f.ondelete=='CASCADE':
db(db[tablename][fieldname].belongs(deleted)).delete()
### end special code to handle CASCADE in SQLite & SpatiaLite
return counter
@@ -1291,7 +1325,8 @@ class BaseAdapter(ConnectionPool):
tablenames = self.tables(query)
for field in fields:
if isinstance(field, basestring) and regex_table_field.match(field):
if isinstance(field, basestring) \
and regex_table_field.match(field):
tn,fn = field.split('.')
field = self.db[tn][fn]
for tablename in self.tables(field):
@@ -1329,36 +1364,45 @@ class BaseAdapter(ConnectionPool):
icommand = self.JOIN()
if not isinstance(inner_join, (tuple, list)):
inner_join = [inner_join]
ijoint = [t._tablename for t in inner_join if not isinstance(t,Expression)]
ijoint = [t._tablename for t in inner_join
if not isinstance(t,Expression)]
ijoinon = [t for t in inner_join if isinstance(t, Expression)]
itables_to_merge={} #issue 490
[itables_to_merge.update(dict.fromkeys(self.tables(t))) for t in ijoinon] # issue 490
[itables_to_merge.update(
dict.fromkeys(self.tables(t))) for t in ijoinon]
ijoinont = [t.first._tablename for t in ijoinon]
[itables_to_merge.pop(t) for t in ijoinont if t in itables_to_merge] #issue 490
iimportant_tablenames = ijoint + ijoinont + itables_to_merge.keys() # issue 490
iexcluded = [t for t in tablenames if not t in iimportant_tablenames]
[itables_to_merge.pop(t) for t in ijoinont
if t in itables_to_merge] #issue 490
iimportant_tablenames = ijoint + ijoinont + itables_to_merge.keys()
iexcluded = [t for t in tablenames
if not t in iimportant_tablenames]
if left:
join = attributes['left']
command = self.LEFT_JOIN()
if not isinstance(join, (tuple, list)):
join = [join]
joint = [t._tablename for t in join if not isinstance(t, Expression)]
joint = [t._tablename for t in join
if not isinstance(t, Expression)]
joinon = [t for t in join if isinstance(t, Expression)]
#patch join+left patch (solves problem with ordering in left joins)
tables_to_merge={}
[tables_to_merge.update(dict.fromkeys(self.tables(t))) for t in joinon]
[tables_to_merge.update(
dict.fromkeys(self.tables(t))) for t in joinon]
joinont = [t.first._tablename for t in joinon]
[tables_to_merge.pop(t) for t in joinont if t in tables_to_merge]
important_tablenames = joint + joinont + tables_to_merge.keys()
excluded = [t for t in tablenames if not t in important_tablenames ]
excluded = [t for t in tablenames
if not t in important_tablenames ]
def alias(t):
return str(self.db[t])
if inner_join and not left:
sql_t = ', '.join([alias(t) for t in iexcluded + itables_to_merge.keys()]) # issue 490
sql_t = ', '.join([alias(t) for t in iexcluded + \
itables_to_merge.keys()])
for t in ijoinon:
sql_t += ' %s %s' % (icommand, str(t))
elif not inner_join and left:
sql_t = ', '.join([alias(t) for t in excluded + tables_to_merge.keys()])
sql_t = ', '.join([alias(t) for t in excluded + \
tables_to_merge.keys()])
if joint:
sql_t += ' %s %s' % (command, ','.join([t for t in joint]))
for t in joinon:
@@ -1366,10 +1410,11 @@ class BaseAdapter(ConnectionPool):
elif inner_join and left:
all_tables_in_query = set(important_tablenames + \
iimportant_tablenames + \
tablenames) # issue 490
tables_in_joinon = set(joinont + ijoinont) # issue 490
tables_not_in_joinon = all_tables_in_query.difference(tables_in_joinon) # issue 490
sql_t = ','.join([alias(t) for t in tables_not_in_joinon]) # issue 490
tablenames)
tables_in_joinon = set(joinont + ijoinont)
tables_not_in_joinon = \
all_tables_in_query.difference(tables_in_joinon)
sql_t = ','.join([alias(t) for t in tables_not_in_joinon])
for t in ijoinon:
sql_t += ' %s %s' % (icommand, str(t))
if joint:
@@ -1404,7 +1449,8 @@ class BaseAdapter(ConnectionPool):
if limitby:
(lmin, lmax) = limitby
sql_o += ' LIMIT %i OFFSET %i' % (lmax - lmin, lmin)
return 'SELECT %s %s FROM %s%s%s;' % (sql_s, sql_f, sql_t, sql_w, sql_o)
return 'SELECT %s %s FROM %s%s%s;' % \
(sql_s, sql_f, sql_t, sql_w, sql_o)
def select(self, query, fields, attributes):
"""
@@ -1442,7 +1488,8 @@ class BaseAdapter(ConnectionPool):
if isinstance(distinct,(list, tuple)):
distinct = xorify(distinct)
sql_d = self.expand(distinct)
return 'SELECT count(DISTINCT %s) FROM %s%s;' % (sql_d, sql_t, sql_w)
return 'SELECT count(DISTINCT %s) FROM %s%s;' % \
(sql_d, sql_t, sql_w)
return 'SELECT count(*) FROM %s%s;' % (sql_t, sql_w)
def count(self, query, distinct=None):
@@ -1588,7 +1635,10 @@ class BaseAdapter(ConnectionPool):
return type(None)
def rowslice(self, rows, minimum=0, maximum=None):
""" By default this function does nothing; overload when db does not do slicing. """
"""
By default this function does nothing;
overload when db does not do slicing.
"""
return rows
def parse_value(self, value, field_type, blob_decode=True):
@@ -1603,7 +1653,7 @@ class BaseAdapter(ConnectionPool):
value = field_type.decoder(value)
if not isinstance(field_type, str) or value is None:
return value
elif field_type in ('string', 'text', 'password', 'upload', 'dict'): # ???
elif field_type in ('string', 'text', 'password', 'upload', 'dict'):
return value
elif field_type.startswith('geo'):
return value
@@ -1641,7 +1691,8 @@ class BaseAdapter(ConnectionPool):
def parse_datetime(self, value, field_type):
if not isinstance(value, datetime.datetime):
date_part, time_part = (str(value).replace('T',' ')+' ').split(' ',1)
date_part, time_part = (
str(value).replace('T',' ')+' ').split(' ',1)
(y, m, d) = map(int,date_part.split('-'))
time_parts = time_part and time_part.split(':')[:3] or (0,0,0)
while len(time_parts)<3: time_parts.append(0)
@@ -1746,8 +1797,12 @@ class BaseAdapter(ConnectionPool):
colset.gae_item = value
else:
id = value
colset.update_record = lambda _ = (colset, table, id), **a: update_record(_, a)
colset.delete_record = lambda t = table, i = id: t._db(t._id==i).delete()
colset.update_record = (
lambda _ = (colset, table, id), **a:
update_record(_, a))
colset.delete_record = (
lambda t = table, i = id:
t._db(t._id==i).delete())
for (referee_table, referee_name) in table._referenced_by:
s = db[referee_table][referee_name]
referee_link = db._referee_name and \
@@ -1760,8 +1815,10 @@ class BaseAdapter(ConnectionPool):
for tablename in virtualtables:
### new style virtual fields
table = db[tablename]
fields_virtual = [(f,v) for (f,v) in table.items() if isinstance(v,FieldVirtual)]
fields_lazy = [(f,v) for (f,v) in table.items() if isinstance(v,FieldLazy)]
fields_virtual = [(f,v) for (f,v) in table.items()
if isinstance(v,FieldVirtual)]
fields_lazy = [(f,v) for (f,v) in table.items()
if isinstance(v,FieldLazy)]
if fields_virtual or fields_lazy:
for row in rowsobj.records:
box = row[tablename]
@@ -1845,13 +1902,15 @@ class SQLiteAdapter(BaseAdapter):
self.folder = folder
self.db_codec = db_codec
self.find_or_make_work_folder()
path_encoding = sys.getfilesystemencoding() or locale.getdefaultlocale()[1] or 'utf8'
path_encoding = sys.getfilesystemencoding() \
or locale.getdefaultlocale()[1] or 'utf8'
if uri.startswith('sqlite:memory'):
dbpath = ':memory:'
else:
dbpath = uri.split('://')[1]
if dbpath[0] != '/':
dbpath = os.path.join(self.folder.decode(path_encoding).encode('utf8'), dbpath)
dbpath = os.path.join(
self.folder.decode(path_encoding).encode('utf8'), dbpath)
if not 'check_same_thread' in driver_args:
driver_args['check_same_thread'] = False
if not 'detect_types' in driver_args:
@@ -1908,13 +1967,15 @@ class SpatiaLiteAdapter(SQLiteAdapter):
self.db_codec = db_codec
self.find_or_make_work_folder()
self.srid = srid
path_encoding = sys.getfilesystemencoding() or locale.getdefaultlocale()[1] or 'utf8'
path_encoding = sys.getfilesystemencoding() \
or locale.getdefaultlocale()[1] or 'utf8'
if uri.startswith('spatialite:memory'):
dbpath = ':memory:'
else:
dbpath = uri.split('://')[1]
if dbpath[0] != '/':
dbpath = os.path.join(self.folder.decode(path_encoding).encode('utf8'), dbpath)
dbpath = os.path.join(
self.folder.decode(path_encoding).encode('utf8'), dbpath)
if not 'check_same_thread' in driver_args:
driver_args['check_same_thread'] = False
if not 'detect_types' in driver_args:
@@ -1947,28 +2008,36 @@ class SpatiaLiteAdapter(SQLiteAdapter):
return 'AsText(%s)' %(self.expand(first))
def ST_CONTAINS(self, first, second):
return 'Contains(%s,%s)' %(self.expand(first), self.expand(second, first.type))
return 'Contains(%s,%s)' %(self.expand(first),
self.expand(second, first.type))
def ST_DISTANCE(self, first, second):
return 'Distance(%s,%s)' %(self.expand(first), self.expand(second, first.type))
return 'Distance(%s,%s)' %(self.expand(first),
self.expand(second, first.type))
def ST_EQUALS(self, first, second):
return 'Equals(%s,%s)' %(self.expand(first), self.expand(second, first.type))
return 'Equals(%s,%s)' %(self.expand(first),
self.expand(second, first.type))
def ST_INTERSECTS(self, first, second):
return 'Intersects(%s,%s)' %(self.expand(first), self.expand(second, first.type))
return 'Intersects(%s,%s)' %(self.expand(first),
self.expand(second, first.type))
def ST_OVERLAPS(self, first, second):
return 'Overlaps(%s,%s)' %(self.expand(first), self.expand(second, first.type))
return 'Overlaps(%s,%s)' %(self.expand(first),
self.expand(second, first.type))
def ST_SIMPLIFY(self, first, second):
return 'Simplify(%s,%s)' %(self.expand(first), self.expand(second, 'double'))
return 'Simplify(%s,%s)' %(self.expand(first),
self.expand(second, 'double'))
def ST_TOUCHES(self, first, second):
return 'Touches(%s,%s)' %(self.expand(first), self.expand(second, first.type))
return 'Touches(%s,%s)' %(self.expand(first),
self.expand(second, first.type))
def ST_WITHIN(self, first, second):
return 'Within(%s,%s)' %(self.expand(first), self.expand(second, first.type))
return 'Within(%s,%s)' %(self.expand(first),
self.expand(second, first.type))
def represent(self, obj, fieldtype):
if fieldtype.startswith('geo'):
@@ -2003,21 +2072,26 @@ class JDBCSQLiteAdapter(SQLiteAdapter):
self.folder = folder
self.db_codec = db_codec
self.find_or_make_work_folder()
path_encoding = sys.getfilesystemencoding() or locale.getdefaultlocale()[1] or 'utf8'
path_encoding = sys.getfilesystemencoding() \
or locale.getdefaultlocale()[1] or 'utf8'
if uri.startswith('sqlite:memory'):
dbpath = ':memory:'
else:
dbpath = uri.split('://')[1]
if dbpath[0] != '/':
dbpath = os.path.join(self.folder.decode(path_encoding).encode('utf8'), dbpath)
dbpath = os.path.join(
self.folder.decode(path_encoding).encode('utf8'), dbpath)
def connect(dbpath=dbpath,driver_args=driver_args):
return self.driver.connect(java.sql.DriverManager.getConnection('jdbc:sqlite:'+dbpath), **driver_args)
return self.driver.connect(
java.sql.DriverManager.getConnection('jdbc:sqlite:'+dbpath),
**driver_args)
self.pool_connection(connect)
self.after_connection()
def after_connection(self):
# FIXME http://www.zentus.com/sqlitejdbc/custom_functions.html for UDFs
self.connection.create_function('web2py_extract', 2, SQLiteAdapter.web2py_extract)
self.connection.create_function('web2py_extract', 2,
SQLiteAdapter.web2py_extract)
def execute(self, a):
return self.log_execute(a)
@@ -2060,11 +2134,13 @@ class MySQLAdapter(BaseAdapter):
return 'RAND()'
def SUBSTRING(self,field,parameters):
return 'SUBSTRING(%s,%s,%s)' % (self.expand(field), parameters[0], parameters[1])
return 'SUBSTRING(%s,%s,%s)' % (self.expand(field),
parameters[0], parameters[1])
def _drop(self,table,mode):
# breaks db integrity but without this mysql does not drop table
return ['SET FOREIGN_KEY_CHECKS=0;','DROP TABLE %s;' % table,'SET FOREIGN_KEY_CHECKS=1;']
return ['SET FOREIGN_KEY_CHECKS=0;','DROP TABLE %s;' % table,
'SET FOREIGN_KEY_CHECKS=1;']
def distributed_transaction_begin(self,key):
self.execute('XA START;')
@@ -5782,17 +5858,21 @@ class IMAPAdapter(NoSQLAdapter):
else:
unmark.append(flag)
result, data = self.connection.select(self.connection.mailbox_names[tablename])
result, data = self.connection.select(
self.connection.mailbox_names[tablename])
string_query = "(%s)" % query
result, data = self.connection.search(None, string_query)
store_list = [item.strip() for item in data[0].split() if item.strip().isdigit()]
store_list = [item.strip() for item in data[0].split()
if item.strip().isdigit()]
# change marked flags
for number in store_list:
result = None
if len(mark) > 0:
result, data = self.connection.store(number, "+FLAGS", "(%s)" % " ".join(mark))
result, data = self.connection.store(
number, "+FLAGS", "(%s)" % " ".join(mark))
if len(unmark) > 0:
result, data = self.connection.store(number, "-FLAGS", "(%s)" % " ".join(unmark))
result, data = self.connection.store(
number, "-FLAGS", "(%s)" % " ".join(unmark))
if result == "OK":
rowcount += 1
return rowcount