Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion interbase/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@
'SQL_ARRAY', 'SQL_BLOB', 'SQL_DOUBLE', 'SQL_D_FLOAT', 'SQL_FLOAT',
'SQL_INT64', 'SQL_LONG', 'SQL_QUAD', 'SQL_SHORT', 'SQL_TEXT',
'SQL_TIMESTAMP', 'SQL_TYPE_DATE', 'SQL_TYPE_TIME', 'SQL_VARYING',
'SUBTYPE_DECIMAL', 'SUBTYPE_NUMERIC', 'build_dpb',
'SQL_BOOLEAN', 'SUBTYPE_DECIMAL', 'SUBTYPE_NUMERIC', 'build_dpb',
'charset_map',
'isc_info_end', 'isc_sqlcode', 'bs',
)
1 change: 1 addition & 0 deletions interbase/ibase.py
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,7 @@ def UNCHECKED(type):
SQL_TYPE_TIME = 560
SQL_TYPE_DATE = 570
SQL_INT64 = 580
SQL_BOOLEAN = 590

SQLIND_NULL = (1 << 15)
SQLIND_INSERT = (1 << 0)
Expand Down
31 changes: 30 additions & 1 deletion interbase/ibcore.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@
SHRT_MIN, SHRT_MAX, INT_MIN, INT_MAX, LONG_MIN, LONG_MAX,
SQL_TEXT, SQL_VARYING, SQL_SHORT, SQL_LONG, SQL_FLOAT, SQL_DOUBLE,
SQL_D_FLOAT, SQL_TIMESTAMP, SQL_BLOB, SQL_ARRAY, SQL_TYPE_TIME,
SQL_TYPE_DATE, SQL_INT64, SUBTYPE_NUMERIC, SUBTYPE_DECIMAL,
SQL_TYPE_DATE, SQL_INT64, SQL_BOOLEAN, SUBTYPE_NUMERIC, SUBTYPE_DECIMAL,

SQLIND_NULL, SQLIND_INSERT, SQLIND_UPDATE, SQLIND_DELETE, SQLIND_CHANGE, SQLIND_TRUNCATE, SQLIND_CHANGE_VIEW,

Expand Down Expand Up @@ -422,6 +422,12 @@ def bytes_to_uint(b): # Read as little endian.
raise InternalError
return struct.unpack(fmt, b)[0]

def bytes_to_bool(b): # Read as little endian.
if len(b) == 2:
return struct.unpack('<h', b)[0]
else:
raise InternalError

def bint_to_bytes(val, nbytes): # Convert int value to big endian bytes.
if nbytes == 1:
fmt = 'b'
Expand Down Expand Up @@ -461,6 +467,13 @@ def uint_to_bytes(val, nbytes): # Convert int value to little endian bytes.
raise InternalError
return struct.pack(fmt, val)

def bool_to_bytes(val, nbytes): # Convert bool value to little endian bytes.
int_val = int(bool(val)) # Ensure it's 0 or 1
if nbytes == 2:
return struct.pack('<h', int_val)
else:
raise InternalError

def db_api_error(status_vector):
return status_vector[0] == 1 and status_vector[1] > 0

Expand Down Expand Up @@ -2134,6 +2147,8 @@ def __get_external_data_type_name(self, dialect, data_type, subtype,
return 'SMALLINT'
elif data_type == SQL_LONG:
return 'INTEGER'
elif data_type == SQL_BOOLEAN:
return 'BOOLEAN'
elif data_type == SQL_INT64:
return 'BIGINT'
elif data_type == SQL_FLOAT:
Expand All @@ -2159,6 +2174,8 @@ def __get_internal_data_type_name(self, data_type):
return 'SQL_SHORT'
elif data_type == SQL_LONG:
return 'SQL_LONG'
elif data_type == SQL_BOOLEAN:
return 'SQL_BOOLEAN'
elif data_type == SQL_INT64:
return 'SQL_INT64'
elif data_type == SQL_FLOAT:
Expand Down Expand Up @@ -2207,6 +2224,9 @@ def __get_description(self):
elif vartype == SQL_LONG:
vtype = IntType
dispsize = 11
elif vartype == SQL_BOOLEAN:
vtype = bool
dispsize = 5
elif vartype == SQL_INT64:
vtype = LongType
dispsize = 20
Expand Down Expand Up @@ -2371,6 +2391,9 @@ def __coerce_XSQLDA(self, xsqlda):
elif vartype == SQL_LONG:
sqlvar.sqldata = ctypes.cast(ctypes.create_string_buffer(
sqlvar.sqllen),buf_pointer)
elif vartype == SQL_BOOLEAN:
sqlvar.sqldata = ctypes.cast(ctypes.create_string_buffer(
sqlvar.sqllen),buf_pointer)
elif vartype == SQL_INT64:
sqlvar.sqldata = ctypes.cast(ctypes.create_string_buffer(
sqlvar.sqllen),buf_pointer)
Expand Down Expand Up @@ -2453,6 +2476,8 @@ def __XSQLDA2Tuple(self, xsqlda):
# It's scalled integer?
if (sqlvar.sqlsubtype or scale):
value = decimal.Decimal(value) / _tenTo[abs(scale)]
elif vartype == SQL_BOOLEAN:
value = bool(bytes_to_bool(sqlvar.sqldata[:sqlvar.sqllen]))
elif vartype == SQL_TYPE_DATE:
yyyy, mm, dd = self._parse_date(sqlvar.sqldata[:sqlvar.sqllen])
value = datetime.date(yyyy, mm, dd)
Expand Down Expand Up @@ -2889,6 +2914,10 @@ def __Tuple2XSQLDA(self, xsqlda, parameters):
sqlvar.sqldata = ctypes.cast(ctypes.pointer(
ctypes.create_string_buffer(
int_to_bytes(value, sqlvar.sqllen))), buf_pointer)
elif vartype == SQL_BOOLEAN:
sqlvar.sqldata = ctypes.cast(ctypes.pointer(
ctypes.create_string_buffer(
bool_to_bytes(value, sqlvar.sqllen))), buf_pointer)
elif vartype == SQL_TYPE_DATE:
sqlvar.sqldata = ctypes.cast(ctypes.pointer(
ctypes.create_string_buffer(
Expand Down
113 changes: 53 additions & 60 deletions interbase/schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -177,66 +177,59 @@ def gkey2(item):

def isKeyword(ident):
"Returns True if `ident` is InterBase keyword."
return ident in ['ABS', 'ACCENT', 'ACOS', 'ACTION', 'ACTIVE', 'ADD', 'ADMIN',
'AFTER', 'ALL', 'ALTER', 'ALWAYS', 'AND', 'ANY', 'AS', 'ASC',
'ASCENDING', 'ASCII_CHAR', 'ASCII_VAL', 'ASIN', 'AT', 'ATAN',
'ATAN2', 'AUTO', 'AUTONOMOUS', 'AVG', 'BACKUP', 'BEFORE',
'BEGIN', 'BETWEEN', 'BIGINT', 'BIN_AND', 'BIN_NOT', 'BIN_OR',
'BIN_SHL', 'BIN_SHR', 'BIN_XOR', 'BIT_LENGTH', 'BLOB', 'BLOCK',
'BOTH', 'BREAK', 'BY', 'CALLER', 'CASCADE', 'CASE', 'CAST',
'CEIL', 'CEILING', 'CHAR', 'CHAR_LENGTH', 'CHAR_TO_UUID',
'CHARACTER', 'CHARACTER_LENGTH', 'CHECK', 'CLOSE', 'COALESCE',
'COLLATE', 'COLLATION', 'COLUMN', 'COMMENT', 'COMMIT',
'COMMITTED', 'COMMON', 'COMPUTED', 'CONDITIONAL', 'CONNECT',
'CONSTRAINT', 'CONTAINING', 'COS', 'COSH', 'COT', 'COUNT',
'CREATE', 'CROSS', 'CSTRING', 'CURRENT', 'CURRENT_CONNECTION',
'CURRENT_DATE', 'CURRENT_ROLE', 'CURRENT_TIME',
'CURRENT_TIMESTAMP', 'CURRENT_TRANSACTION', 'CURRENT_USER',
'CURSOR', 'DATA', 'DATABASE', 'DATE', 'DATEADD', 'DATEDIFF',
'DAY', 'DEC', 'DECIMAL', 'DECLARE', 'DECODE', 'DEFAULT',
'DELETE', 'DELETING', 'DESC', 'DESCENDING', 'DESCRIPTOR',
'DIFFERENCE', 'DISCONNECT', 'DISTINCT', 'DO', 'DOMAIN',
'DOUBLE', 'DROP', 'ELSE', 'END', 'ENTRY_POINT', 'ESCAPE',
'EXCEPTION', 'EXECUTE', 'EXISTS', 'EXIT', 'EXP', 'EXTERNAL',
'EXTRACT', 'FETCH', 'FILE', 'FILTER', 'FIRST', 'FIRSTNAME',
'FLOAT', 'FLOOR', 'FOR', 'FOREIGN', 'FREE_IT', 'FROM', 'FULL',
'FUNCTION', 'GDSCODE', 'GEN_ID', 'GEN_UUID', 'GENERATED',
'GENERATOR', 'GLOBAL', 'GRANT', 'GRANTED', 'GROUP', 'HASH',
'HAVING', 'HOUR', 'IF', 'IGNORE', 'IIF', 'IN', 'INACTIVE',
'INDEX', 'INNER', 'INPUT_TYPE', 'INSENSITIVE', 'INSERT',
'INSERTING', 'INT', 'INTEGER', 'INTO', 'IS', 'ISOLATION', 'JOIN',
'KEY', 'LAST', 'LASTNAME', 'LEADING', 'LEAVE', 'LEFT', 'LENGTH',
'LEVEL', 'LIKE', 'LIMBO', 'LIST', 'LN', 'LOCK', 'LOG', 'LOG10',
'LONG', 'LOWER', 'LPAD', 'MANUAL', 'MAPPING', 'MATCHED',
'MATCHING', 'MAX', 'MAXIMUM_SEGMENT', 'MAXVALUE', 'MERGE',
'MIDDLENAME', 'MILLISECOND', 'MIN', 'MINUTE', 'MINVALUE', 'MOD',
'MODULE_NAME', 'MONTH', 'NAMES', 'NATIONAL', 'NATURAL', 'NCHAR',
'NEXT', 'NO', 'NOT', 'NULL', 'NULLIF', 'NULLS', 'NUMERIC',
'OCTET_LENGTH', 'OF', 'ON', 'ONLY', 'OPEN', 'OPTION', 'OR',
'ORDER', 'OS_NAME', 'OUTER', 'OUTPUT_TYPE', 'OVERFLOW',
'OVERLAY', 'PAD', 'PAGE', 'PAGE_SIZE', 'PAGES', 'PARAMETER',
'PASSWORD', 'PI', 'PLACING', 'PLAN', 'POSITION', 'POST_EVENT',
'POWER', 'PRECISION', 'PRESERVE', 'PRIMARY', 'PRIVILEGES',
'PROCEDURE', 'PROTECTED', 'RAND', 'RDB$DB_KEY', 'READ', 'REAL',
'RECORD_VERSION', 'RECREATE', 'RECURSIVE', 'REFERENCES',
'RELEASE', 'REPLACE', 'REQUESTS', 'RESERV', 'RESERVING',
'RESTART', 'RESTRICT', 'RETAIN', 'RETURNING', 'RETURNING_VALUES',
'RETURNS', 'REVERSE', 'REVOKE', 'RIGHT', 'ROLE', 'ROLLBACK',
'ROUND', 'ROW_COUNT', 'ROWS', 'RPAD', 'SAVEPOINT', 'SCALAR_ARRAY',
'SCHEMA', 'SECOND', 'SEGMENT', 'SELECT', 'SENSITIVE', 'SEQUENCE',
'SET', 'SHADOW', 'SHARED', 'SIGN', 'SIMILAR', 'SIN', 'SINGULAR',
'SINH', 'SIZE', 'SKIP', 'SMALLINT', 'SNAPSHOT', 'SOME', 'SORT',
'SOURCE', 'SPACE', 'SQLCODE', 'SQLSTATE', 'SQRT', 'STABILITY',
'START', 'STARTING', 'STARTS', 'STATEMENT', 'STATISTICS',
'SUB_TYPE', 'SUBSTRING', 'SUM', 'SUSPEND', 'TABLE', 'TAN', 'TANH',
'TEMPORARY', 'THEN', 'TIME', 'TIMEOUT', 'TIMESTAMP', 'TO',
'TRAILING', 'TRANSACTION', 'TRIGGER', 'TRIM', 'TRUNC', 'TWO_PHASE',
'TYPE', 'UNCOMMITTED', 'UNDO', 'UNION', 'UNIQUE', 'UPDATE',
'UPDATING', 'UPPER', 'USER', 'USING', 'UUID_TO_CHAR', 'VALUE',
'VALUES', 'VARCHAR', 'VARIABLE', 'VARYING', 'VIEW', 'WAIT', 'WEEK',
'WEEKDAY', 'WHEN', 'WHERE', 'WHILE', 'WITH', 'WORK', 'WRITE',
'YEAR', 'YEARDAY']

return ident in [
'ABS', 'ACCENT', 'ACOS', 'ACTION', 'ACTIVE', 'ADD', 'ADMIN', 'AFTER', 'ALL',
'ALTER', 'ALWAYS', 'AND', 'ANY', 'AS', 'ASC', 'ASCENDING', 'ASCII_CHAR', 'ASCII_VAL',
'ASIN', 'AT', 'ATAN', 'ATAN2', 'AUTO', 'AUTODDL', 'AUTONOMOUS', 'AVG',
'BACKUP', 'BASED', 'BASENAME', 'BASE_NAME', 'BEFORE', 'BEGIN', 'BETWEEN', 'BIGINT',
'BIN_AND', 'BIN_NOT', 'BIN_OR', 'BIN_SHL', 'BIN_SHR', 'BIN_XOR', 'BIT_LENGTH', 'BLOB',
'BLOBEDIT', 'BLOCK', 'BOOLEAN', 'BOTH', 'BREAK', 'BUFFER', 'BY',
'CACHE', 'CALLER', 'CASCADE', 'CASE', 'CAST', 'CEIL', 'CEILING', 'CHAR', 'CHARACTER',
'CHARACTER_LENGTH', 'CHAR_LENGTH', 'CHAR_TO_UUID', 'CHECK', 'CHECK_POINT_LEN',
'CHECK_POINT_LENGTH', 'CLOSE', 'COALESCE', 'COLLATE', 'COLLATION', 'COLUMN', 'COMMENT',
'COMMIT', 'COMMITTED', 'COMMON', 'COMPILETIME', 'COMPUTED', 'CONDITIONAL', 'CONNECT',
'CONSTRAINT', 'CONTAINING', 'CONTINUE', 'COS', 'COSH', 'COT', 'COUNT', 'CREATE', 'CROSS',
'CSTRING', 'CURRENT', 'CURRENT_CONNECTION', 'CURRENT_DATE', 'CURRENT_ROLE', 'CURRENT_TIME',
'CURRENT_TIMESTAMP', 'CURRENT_TRANSACTION', 'CURRENT_USER', 'CURSOR',
'DATA', 'DATABASE', 'DATE', 'DATEADD', 'DATEDIFF', 'DAY', 'DB_KEY', 'DEBUG', 'DEC', 'DECIMAL',
'DECLARE', 'DECODE', 'DECRYPT', 'DEFAULT', 'DELETE', 'DELETING', 'DESC', 'DESCENDING', 'DESCRIBE',
'DESCRIPTOR', 'DIFFERENCE', 'DISCONNECT', 'DISPLAY', 'DISTINCT', 'DO', 'DOMAIN', 'DOUBLE', 'DROP',
'ECHO', 'EDIT', 'ELSE', 'ENCRYPT', 'ENCRYPTION', 'END', 'ENTRY_POINT', 'ESCAPE', 'EVENT',
'EXCEPTION', 'EXECUTE', 'EXISTS', 'EXIT', 'EXP', 'EXTERN', 'EXTERNAL', 'EXTRACT',
'FALSE', 'FETCH', 'FILE', 'FILTER', 'FIRST', 'FIRSTNAME', 'FLOAT', 'FLOOR', 'FOR', 'FOREIGN',
'FOUND', 'FREE_IT', 'FROM', 'FULL', 'FUNCTION',
'GDSCODE', 'GENERATED', 'GENERATOR', 'GEN_ID', 'GEN_UUID', 'GLOBAL', 'GOTO', 'GRANT', 'GRANTED',
'GROUP', 'GROUP_COMMIT_WAIT', 'GROUP_COMMIT_WAIT_TIME',
'HASH', 'HAVING', 'HELP', 'HOUR',
'IF', 'IGNORE', 'IIF', 'IMMEDIATE', 'IN', 'INACTIVE', 'INDEX', 'INDICATOR', 'INIT', 'INNER', 'INPUT',
'INPUT_TYPE', 'INSENSITIVE', 'INSERT', 'INSERTING', 'INT', 'INTEGER', 'INTO', 'IS', 'ISOLATION', 'ISQL',
'JOIN',
'KEY',
'LAST', 'LASTNAME', 'LC_MESSAGES', 'LC_TYPE', 'LEADING', 'LEAVE', 'LEFT', 'LENGTH', 'LEV', 'LEVEL', 'LIKE',
'LIMBO', 'LIST', 'LN', 'LOCK', 'LOG', 'LOG10', 'LOGFILE', 'LOG_BUFFER_SIZE', 'LOG_BUF_SIZE', 'LONG', 'LOWER', 'LPAD',
'MANUAL', 'MAPPING', 'MATCHED', 'MATCHING', 'MAX', 'MAXIMUM', 'MAXIMUM_SEGMENT', 'MAXVALUE', 'MAX_SEGMENT',
'MERGE', 'MESSAGE', 'MIDDLENAME', 'MILLISECOND', 'MIN', 'MINIMUM', 'MINUTE', 'MINVALUE', 'MOD', 'MODULE_NAME', 'MONTH',
'NAMES', 'NATIONAL', 'NATURAL', 'NCHAR', 'NEXT', 'NO', 'NOAUTO', 'NOT', 'NULL', 'NULLIF', 'NULLS', 'NUMERIC',
'NUM_LOG_BUFFERS', 'NUM_LOG_BUFS',
'OCTET_LENGTH', 'OF', 'ON', 'ONLY', 'OPEN', 'OPTION', 'OR', 'ORDER', 'OS_NAME', 'OUTER', 'OUTPUT', 'OUTPUT_TYPE', 'OVERFLOW', 'OVERLAY',
'PAD', 'PAGE', 'PAGELENGTH', 'PAGES', 'PAGE_SIZE', 'PARAMETER', 'PARAMETERS', 'PASSWORD', 'PERCENT', 'PI',
'PLACING', 'PLAN', 'POSITION', 'POST_EVENT', 'POWER', 'PRECISION', 'PREPARE', 'PRESERVE', 'PRIMARY', 'PRIVILEGES',
'PROCEDURE', 'PROTECTED', 'PUBLIC',
'QUIT',
'RAND', 'RAW_PARTITIONS', 'RDB$DB_KEY', 'READ', 'REAL', 'RECORD_VERSION', 'RECREATE', 'RECURSIVE', 'REFERENCES',
'RELEASE', 'REPLACE', 'REQUESTS', 'RESERV', 'RESERVING', 'RESTART', 'RESTRICT', 'RETAIN', 'RETURN', 'RETURNING',
'RETURNING_VALUES', 'RETURNS', 'REVERSE', 'REVOKE', 'RIGHT', 'ROLE', 'ROLLBACK', 'ROUND', 'ROW', 'ROWS', 'ROW_COUNT',
'RPAD', 'RUNTIME',
'SAVEPOINT', 'SCALAR_ARRAY', 'SCHEMA', 'SECOND', 'SEGMENT', 'SELECT', 'SENSITIVE', 'SEQUENCE', 'SET', 'SHADOW', 'SHARED',
'SHELL', 'SHOW', 'SIGN', 'SIMILAR', 'SIN', 'SINGULAR', 'SINH', 'SIZE', 'SKIP', 'SMALLINT', 'SNAPSHOT', 'SOME', 'SORT',
'SOURCE', 'SPACE', 'SQLCODE', 'SQLERROR', 'SQLSTATE', 'SQLWARNING', 'SQRT', 'STABILITY', 'START', 'STARTING', 'STARTS',
'STATEMENT', 'STATIC', 'STATISTICS', 'SUBSTRING', 'SUB_TYPE', 'SUM', 'SUSPEND',
'TABLE', 'TABLESPACE', 'TAN', 'TANH', 'TEMPORARY', 'TERMINATOR', 'THEN', 'TIES', 'TIME', 'TIMEOUT', 'TIMESTAMP', 'TO',
'TRAILING', 'TRANSACTION', 'TRANSLATE', 'TRANSLATION', 'TRIGGER', 'TRIM', 'TRUE', 'TRUNC', 'TWO_PHASE', 'TYPE',
'UNCOMMITTED', 'UNDO', 'UNION', 'UNIQUE', 'UNKNOWN', 'UPDATE', 'UPDATING', 'UPPER', 'USER', 'USING', 'UUID_TO_CHAR',
'VALUE', 'VALUES', 'VARCHAR', 'VARIABLE', 'VARYING', 'VERSION', 'VIEW',
'WAIT', 'WEEK', 'WEEKDAY', 'WHEN', 'WHENEVER', 'WHERE', 'WHILE', 'WITH', 'WORK', 'WRITE',
'YEAR', 'YEARDAY']

def escape_single_quotes(text):
return text.replace("'", "''")
Expand Down