Skip to content

Commit bb5de6f

Browse files
authored
Fix boolean types (#9)
* Bool type mappings * Bool type resolution * Boolean type constant name update * Boolean as 2 bytes only * Mergin docwiki keyword list to existing list
1 parent 0059b4b commit bb5de6f

File tree

4 files changed

+85
-62
lines changed

4 files changed

+85
-62
lines changed

interbase/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@
120120
'SQL_ARRAY', 'SQL_BLOB', 'SQL_DOUBLE', 'SQL_D_FLOAT', 'SQL_FLOAT',
121121
'SQL_INT64', 'SQL_LONG', 'SQL_QUAD', 'SQL_SHORT', 'SQL_TEXT',
122122
'SQL_TIMESTAMP', 'SQL_TYPE_DATE', 'SQL_TYPE_TIME', 'SQL_VARYING',
123-
'SUBTYPE_DECIMAL', 'SUBTYPE_NUMERIC', 'build_dpb',
123+
'SQL_BOOLEAN', 'SUBTYPE_DECIMAL', 'SUBTYPE_NUMERIC', 'build_dpb',
124124
'charset_map',
125125
'isc_info_end', 'isc_sqlcode', 'bs',
126126
)

interbase/ibase.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,7 @@ def UNCHECKED(type):
239239
SQL_TYPE_TIME = 560
240240
SQL_TYPE_DATE = 570
241241
SQL_INT64 = 580
242+
SQL_BOOLEAN = 590
242243

243244
SQLIND_NULL = (1 << 15)
244245
SQLIND_INSERT = (1 << 0)

interbase/ibcore.py

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@
9191
SHRT_MIN, SHRT_MAX, INT_MIN, INT_MAX, LONG_MIN, LONG_MAX,
9292
SQL_TEXT, SQL_VARYING, SQL_SHORT, SQL_LONG, SQL_FLOAT, SQL_DOUBLE,
9393
SQL_D_FLOAT, SQL_TIMESTAMP, SQL_BLOB, SQL_ARRAY, SQL_TYPE_TIME,
94-
SQL_TYPE_DATE, SQL_INT64, SUBTYPE_NUMERIC, SUBTYPE_DECIMAL,
94+
SQL_TYPE_DATE, SQL_INT64, SQL_BOOLEAN, SUBTYPE_NUMERIC, SUBTYPE_DECIMAL,
9595

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

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

425+
def bytes_to_bool(b): # Read as little endian.
426+
if len(b) == 2:
427+
return struct.unpack('<h', b)[0]
428+
else:
429+
raise InternalError
430+
425431
def bint_to_bytes(val, nbytes): # Convert int value to big endian bytes.
426432
if nbytes == 1:
427433
fmt = 'b'
@@ -461,6 +467,13 @@ def uint_to_bytes(val, nbytes): # Convert int value to little endian bytes.
461467
raise InternalError
462468
return struct.pack(fmt, val)
463469

470+
def bool_to_bytes(val, nbytes): # Convert bool value to little endian bytes.
471+
int_val = int(bool(val)) # Ensure it's 0 or 1
472+
if nbytes == 2:
473+
return struct.pack('<h', int_val)
474+
else:
475+
raise InternalError
476+
464477
def db_api_error(status_vector):
465478
return status_vector[0] == 1 and status_vector[1] > 0
466479

@@ -2134,6 +2147,8 @@ def __get_external_data_type_name(self, dialect, data_type, subtype,
21342147
return 'SMALLINT'
21352148
elif data_type == SQL_LONG:
21362149
return 'INTEGER'
2150+
elif data_type == SQL_BOOLEAN:
2151+
return 'BOOLEAN'
21372152
elif data_type == SQL_INT64:
21382153
return 'BIGINT'
21392154
elif data_type == SQL_FLOAT:
@@ -2159,6 +2174,8 @@ def __get_internal_data_type_name(self, data_type):
21592174
return 'SQL_SHORT'
21602175
elif data_type == SQL_LONG:
21612176
return 'SQL_LONG'
2177+
elif data_type == SQL_BOOLEAN:
2178+
return 'SQL_BOOLEAN'
21622179
elif data_type == SQL_INT64:
21632180
return 'SQL_INT64'
21642181
elif data_type == SQL_FLOAT:
@@ -2207,6 +2224,9 @@ def __get_description(self):
22072224
elif vartype == SQL_LONG:
22082225
vtype = IntType
22092226
dispsize = 11
2227+
elif vartype == SQL_BOOLEAN:
2228+
vtype = bool
2229+
dispsize = 5
22102230
elif vartype == SQL_INT64:
22112231
vtype = LongType
22122232
dispsize = 20
@@ -2371,6 +2391,9 @@ def __coerce_XSQLDA(self, xsqlda):
23712391
elif vartype == SQL_LONG:
23722392
sqlvar.sqldata = ctypes.cast(ctypes.create_string_buffer(
23732393
sqlvar.sqllen),buf_pointer)
2394+
elif vartype == SQL_BOOLEAN:
2395+
sqlvar.sqldata = ctypes.cast(ctypes.create_string_buffer(
2396+
sqlvar.sqllen),buf_pointer)
23742397
elif vartype == SQL_INT64:
23752398
sqlvar.sqldata = ctypes.cast(ctypes.create_string_buffer(
23762399
sqlvar.sqllen),buf_pointer)
@@ -2453,6 +2476,8 @@ def __XSQLDA2Tuple(self, xsqlda):
24532476
# It's scalled integer?
24542477
if (sqlvar.sqlsubtype or scale):
24552478
value = decimal.Decimal(value) / _tenTo[abs(scale)]
2479+
elif vartype == SQL_BOOLEAN:
2480+
value = bool(bytes_to_bool(sqlvar.sqldata[:sqlvar.sqllen]))
24562481
elif vartype == SQL_TYPE_DATE:
24572482
yyyy, mm, dd = self._parse_date(sqlvar.sqldata[:sqlvar.sqllen])
24582483
value = datetime.date(yyyy, mm, dd)
@@ -2889,6 +2914,10 @@ def __Tuple2XSQLDA(self, xsqlda, parameters):
28892914
sqlvar.sqldata = ctypes.cast(ctypes.pointer(
28902915
ctypes.create_string_buffer(
28912916
int_to_bytes(value, sqlvar.sqllen))), buf_pointer)
2917+
elif vartype == SQL_BOOLEAN:
2918+
sqlvar.sqldata = ctypes.cast(ctypes.pointer(
2919+
ctypes.create_string_buffer(
2920+
bool_to_bytes(value, sqlvar.sqllen))), buf_pointer)
28922921
elif vartype == SQL_TYPE_DATE:
28932922
sqlvar.sqldata = ctypes.cast(ctypes.pointer(
28942923
ctypes.create_string_buffer(

interbase/schema.py

Lines changed: 53 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -177,66 +177,59 @@ def gkey2(item):
177177

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

241234
def escape_single_quotes(text):
242235
return text.replace("'", "''")

0 commit comments

Comments
 (0)