Add support for querys
This commit is contained in:
parent
93bfb3cb78
commit
b7dbbc1ebb
|
@ -302,14 +302,17 @@ def _date_to_struct(value):
|
||||||
|
|
||||||
|
|
||||||
def _struct_to_date(value):
|
def _struct_to_date(value):
|
||||||
|
d = None
|
||||||
if isinstance(value, Time):
|
if isinstance(value, Time):
|
||||||
d = datetime.time(value.Hours, value.Minutes, value.Seconds)
|
d = datetime.time(value.Hours, value.Minutes, value.Seconds)
|
||||||
elif isinstance(value, Date):
|
elif isinstance(value, Date):
|
||||||
d = datetime.date(value.Year, value.Month, value.Day)
|
if value != Date():
|
||||||
|
d = datetime.date(value.Year, value.Month, value.Day)
|
||||||
elif isinstance(value, DateTime):
|
elif isinstance(value, DateTime):
|
||||||
d = datetime.datetime(
|
if value.Year > 0:
|
||||||
value.Year, value.Month, value.Day,
|
d = datetime.datetime(
|
||||||
value.Hours, value.Minutes, value.Seconds)
|
value.Year, value.Month, value.Day,
|
||||||
|
value.Hours, value.Minutes, value.Seconds)
|
||||||
return d
|
return d
|
||||||
|
|
||||||
|
|
||||||
|
@ -977,16 +980,74 @@ class FirebirdDatabase(Database):
|
||||||
return cursor
|
return cursor
|
||||||
|
|
||||||
def last_insert_id(self, cursor, query_type=None):
|
def last_insert_id(self, cursor, query_type=None):
|
||||||
# ~ debug(cursor)
|
# ~ debug('LAST_ID', cursor)
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
|
def rows_affected(self, cursor):
|
||||||
|
return self._db.rows_affected
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def path(self):
|
def path(self):
|
||||||
return self._db.path
|
return self._db.path
|
||||||
|
|
||||||
|
|
||||||
|
class BaseQuery(object):
|
||||||
|
PY_TYPES = {
|
||||||
|
'SQL_LONG': 'getLong',
|
||||||
|
'SQL_VARYING': 'getString',
|
||||||
|
'SQL_FLOAT': 'getFloat',
|
||||||
|
'SQL_BOOLEAN': 'getBoolean',
|
||||||
|
'SQL_TYPE_DATE': 'getDate',
|
||||||
|
'SQL_TYPE_TIME': 'getTime',
|
||||||
|
'SQL_TIMESTAMP': 'getTimestamp',
|
||||||
|
}
|
||||||
|
TYPES_DATE = ('SQL_TYPE_DATE', 'SQL_TYPE_TIME', 'SQL_TIMESTAMP')
|
||||||
|
|
||||||
|
def __init__(self, query):
|
||||||
|
self._query = query
|
||||||
|
self._meta = query.MetaData
|
||||||
|
self._cols = self._meta.ColumnCount
|
||||||
|
self._names = query.Columns.ElementNames
|
||||||
|
self._data = self._get_data()
|
||||||
|
|
||||||
|
def __iter__(self):
|
||||||
|
self._index = 0
|
||||||
|
return self
|
||||||
|
|
||||||
|
def __next__(self):
|
||||||
|
try:
|
||||||
|
row = self._data[self._index]
|
||||||
|
except IndexError:
|
||||||
|
raise StopIteration
|
||||||
|
self._index += 1
|
||||||
|
return row
|
||||||
|
|
||||||
|
def _to_python(self, index):
|
||||||
|
type_field = self._meta.getColumnTypeName(index)
|
||||||
|
value = getattr(self._query, self.PY_TYPES[type_field])(index)
|
||||||
|
if type_field in self.TYPES_DATE:
|
||||||
|
value = _struct_to_date(value)
|
||||||
|
return value
|
||||||
|
|
||||||
|
def _get_data(self):
|
||||||
|
data = []
|
||||||
|
while self._query.next():
|
||||||
|
row = [self._to_python(i) for i in range(1, self._cols + 1)]
|
||||||
|
data.append(tuple(row))
|
||||||
|
return data
|
||||||
|
|
||||||
|
@property
|
||||||
|
def tuples(self):
|
||||||
|
return tuple(self._data)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def dicts(self):
|
||||||
|
data = [dict(zip(self._names, row)) for row in self.tuples]
|
||||||
|
return tuple(data)
|
||||||
|
|
||||||
|
|
||||||
class LOBase(object):
|
class LOBase(object):
|
||||||
TYPES = {
|
DB_TYPES = {
|
||||||
str: 'setString',
|
str: 'setString',
|
||||||
int: 'setInt',
|
int: 'setInt',
|
||||||
float: 'setFloat',
|
float: 'setFloat',
|
||||||
|
@ -1009,11 +1070,23 @@ class LOBase(object):
|
||||||
# ~ setPropertyValue
|
# ~ setPropertyValue
|
||||||
# ~ setRef
|
# ~ setRef
|
||||||
|
|
||||||
|
PY_TYPES = {
|
||||||
|
'SQL_LONG': 'getLong',
|
||||||
|
'SQL_VARYING': 'getString',
|
||||||
|
'SQL_FLOAT': 'getFloat',
|
||||||
|
'SQL_BOOLEAN': 'getBoolean',
|
||||||
|
'SQL_TYPE_DATE': 'getDate',
|
||||||
|
'SQL_TYPE_TIME': 'getTime',
|
||||||
|
'SQL_TIMESTAMP': 'getTimestamp',
|
||||||
|
}
|
||||||
|
TYPES_DATE = ('SQL_TYPE_DATE', 'SQL_TYPE_TIME', 'SQL_TIMESTAMP')
|
||||||
|
|
||||||
def __init__(self, obj, args={}):
|
def __init__(self, obj, args={}):
|
||||||
self._obj = obj
|
self._obj = obj
|
||||||
self._type = BASE
|
self._type = BASE
|
||||||
self._path = args.get('path', '')
|
self._path = args.get('path', '')
|
||||||
self._dbc = create_instance('com.sun.star.sdb.DatabaseContext')
|
self._dbc = create_instance('com.sun.star.sdb.DatabaseContext')
|
||||||
|
self._rows_affected = 0
|
||||||
if self._path:
|
if self._path:
|
||||||
self._name = Path(self._path).name
|
self._name = Path(self._path).name
|
||||||
path_url = _path_url(self._path)
|
path_url = _path_url(self._path)
|
||||||
|
@ -1058,6 +1131,10 @@ class LOBase(object):
|
||||||
tables = [t.Name.lower() for t in self._con.getTables()]
|
tables = [t.Name.lower() for t in self._con.getTables()]
|
||||||
return tables
|
return tables
|
||||||
|
|
||||||
|
@property
|
||||||
|
def rows_affected(self):
|
||||||
|
return self._rows_affected
|
||||||
|
|
||||||
def register(self):
|
def register(self):
|
||||||
if not self.is_registered:
|
if not self.is_registered:
|
||||||
path_url = _path_url(self._path)
|
path_url = _path_url(self._path)
|
||||||
|
@ -1087,27 +1164,80 @@ class LOBase(object):
|
||||||
db.create_tables(tables)
|
db.create_tables(tables)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
def _validate_sql(self, sql, params):
|
||||||
|
for p in params:
|
||||||
|
sql = sql.replace('?', str(p), 1)
|
||||||
|
return sql
|
||||||
|
|
||||||
def cursor(self, sql, params):
|
def cursor(self, sql, params):
|
||||||
|
print(1, sql)
|
||||||
|
if sql.startswith('SELECT'):
|
||||||
|
sql = self._validate_sql(sql, params)
|
||||||
|
cursor = self._con.prepareStatement(sql)
|
||||||
|
return cursor
|
||||||
|
|
||||||
|
if not params:
|
||||||
|
cursor = self._con.createStatement()
|
||||||
|
return cursor
|
||||||
|
|
||||||
cursor = self._con.prepareStatement(sql)
|
cursor = self._con.prepareStatement(sql)
|
||||||
for i, v in enumerate(params, 1):
|
for i, v in enumerate(params, 1):
|
||||||
t = type(v)
|
t = type(v)
|
||||||
if not t in self.TYPES:
|
if not t in self.DB_TYPES:
|
||||||
error('Type not support')
|
error('Type not support')
|
||||||
debug((i, t, v, self.TYPES[t]))
|
debug((i, t, v, self.DB_TYPES[t]))
|
||||||
getattr(cursor, self.TYPES[t])(i, v)
|
getattr(cursor, self.DB_TYPES[t])(i, v)
|
||||||
return cursor
|
return cursor
|
||||||
|
|
||||||
|
@catch_exception
|
||||||
def execute(self, sql, params):
|
def execute(self, sql, params):
|
||||||
debug(sql, params)
|
debug(sql, params)
|
||||||
if params:
|
cursor = self.cursor(sql, params)
|
||||||
cursor = self.cursor(sql, params)
|
|
||||||
cursor.execute()
|
if sql.startswith('SELECT'):
|
||||||
|
result = cursor.executeQuery()
|
||||||
|
elif params:
|
||||||
|
result = cursor.executeUpdate()
|
||||||
|
self._rows_affected = result
|
||||||
|
self.save()
|
||||||
else:
|
else:
|
||||||
cursor = self._con.createStatement()
|
result = cursor.execute(sql)
|
||||||
cursor.execute(sql)
|
self.save()
|
||||||
self.save()
|
|
||||||
return cursor
|
print('RESULT', result)
|
||||||
|
return result
|
||||||
|
|
||||||
|
def _to_python(self, meta, query, index):
|
||||||
|
i = index + 1
|
||||||
|
type_field = meta.getColumnTypeName(i)
|
||||||
|
value = getattr(query, self.PY_TYPES[type_field])(i)
|
||||||
|
if type_field in self.TYPES_DATE:
|
||||||
|
value = _struct_to_date(value)
|
||||||
|
return value
|
||||||
|
|
||||||
|
def _query_to_python(self, query):
|
||||||
|
data = []
|
||||||
|
meta = query.MetaData
|
||||||
|
cols = meta.ColumnCount
|
||||||
|
while query.next():
|
||||||
|
row = [self._to_python(meta, query, i) for i in range(cols)]
|
||||||
|
data.append(row)
|
||||||
|
return data
|
||||||
|
|
||||||
|
def select(self, sql):
|
||||||
|
debug('SELECT', sql)
|
||||||
|
if not sql.startswith('SELECT'):
|
||||||
|
return ()
|
||||||
|
|
||||||
|
cursor = self._con.prepareStatement(sql)
|
||||||
|
query = cursor.executeQuery()
|
||||||
|
# ~ data = self._query_to_python(query)
|
||||||
|
return BaseQuery(query)
|
||||||
|
|
||||||
|
def get_query(self, query):
|
||||||
|
sql, args = query.sql()
|
||||||
|
sql = self._validate_sql(sql, args)
|
||||||
|
return self.select(sql)
|
||||||
|
|
||||||
|
|
||||||
class LOMath(LODocument):
|
class LOMath(LODocument):
|
||||||
|
|
Loading…
Reference in New Issue