unit dbstructures; // ------------------------------------- // Server constants, variables and data types // ------------------------------------- interface uses Classes, Graphics, Windows, SysUtils, gnugettext, Vcl.Forms; const // General declarations MYSQL_ERRMSG_SIZE = 512; SQLSTATE_LENGTH = 5; SCRAMBLE_LENGTH = 20; MYSQL_PORT = 3306; LOCAL_HOST = 'localhost'; NAME_LEN = 64; PROTOCOL_VERSION = 10; FRM_VER = 6; // Field's flags NOT_NULL_FLAG = 1; PRI_KEY_FLAG = 2; UNIQUE_KEY_FLAG = 4; MULTIPLE_KEY_FLAG = 8; BLOB_FLAG = 16; UNSIGNED_FLAG = 32; ZEROFILL_FLAG = 64; BINARY_FLAG = 128; ENUM_FLAG = 256; AUTO_INCREMENT_FLAG = 512; TIMESTAMP_FLAG = 1024; SET_FLAG = 2048; NUM_FLAG = 32768; PART_KEY_FLAG = 16384; GROUP_FLAG = 32768; UNIQUE_FLAG = 65536; BINCMP_FLAG = 131072; // Client connection options CLIENT_LONG_PASSWORD = 1; CLIENT_FOUND_ROWS = 2; // Found instead of affected rows CLIENT_LONG_FLAG = 4; CLIENT_CONNECT_WITH_DB = 8; CLIENT_NO_SCHEMA = 16; // Don't allow database.table.column CLIENT_COMPRESS = 32; CLIENT_ODBC = 64; CLIENT_LOCAL_FILES = 128; CLIENT_IGNORE_SPACE = 256; // Ignore spaces before '(' CLIENT_PROTOCOL_41 = 512; CLIENT_INTERACTIVE = 1024; CLIENT_SSL = 2048; // Switch to SSL after handshake CLIENT_IGNORE_SIGPIPE = 4096; CLIENT_TRANSACTIONS = 8192; CLIENT_RESERVED = 16384; CLIENT_SECURE_CONNECTION = 32768; CLIENT_MULTI_STATEMENTS = 65536; CLIENT_MULTI_RESULTS = 131072; CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS = 4194304; CLIENT_SSL_VERIFY_SERVER_CERT = 67108864; CLIENT_REMEMBER_OPTIONS = 134217728; COLLATION_BINARY = 63; // Equivalent to COLLATION_BINARY, this is what a new driver returns when connected to a pre-4.1 server. COLLATION_NONE = 0; { SQLite Result Codes result code definitions Many SQLite functions return an integer result code from the set shown here in order to indicate success or failure. New error codes may be added in future versions of SQLite. See also: [extended result code definitions] } SQLITE_OK = 0; // Successful result // beginning-of-error-codes SQLITE_ERROR = 1; // Generic error SQLITE_INTERNAL = 2; // Internal logic error in SQLite SQLITE_PERM = 3; // Access permission denied SQLITE_ABORT = 4; // Callback routine requested an abort SQLITE_BUSY = 5; // The database file is locked SQLITE_LOCKED = 6; // A table in the database is locked SQLITE_NOMEM = 7; // A malloc() failed SQLITE_READONLY = 8; // Attempt to write a readonly database SQLITE_INTERRUPT = 9; // Operation terminated by sqlite3_interrupt()*/ SQLITE_IOERR = 10; // Some kind of disk I/O error occurred SQLITE_CORRUPT = 11; // The database disk image is malformed SQLITE_NOTFOUND = 12; // Unknown opcode in sqlite3_file_control() SQLITE_FULL = 13; // Insertion failed because database is full SQLITE_CANTOPEN = 14; // Unable to open the database file SQLITE_PROTOCOL = 15; // Database lock protocol error SQLITE_EMPTY = 16; // Internal use only SQLITE_SCHEMA = 17; // The database schema changed SQLITE_TOOBIG = 18; // String or BLOB exceeds size limit SQLITE_CONSTRAINT = 19; // Abort due to constraint violation SQLITE_MISMATCH = 20; // Data type mismatch SQLITE_MISUSE = 21; // Library used incorrectly SQLITE_NOLFS = 22; // Uses OS features not supported on host SQLITE_AUTH = 23; // Authorization denied SQLITE_FORMAT = 24; // Not used SQLITE_RANGE = 25; // 2nd parameter to sqlite3_bind out of range SQLITE_NOTADB = 26; // File opened that is not a database file SQLITE_NOTICE = 27; // Notifications from sqlite3_log() SQLITE_WARNING = 28; // Warnings from sqlite3_log() SQLITE_ROW = 100; // sqlite3_step() has another row ready SQLITE_DONE = 101; // sqlite3_step() has finished executing { SQLite Flags These constants define various flags that can be passed into "prepFlags" parameter of the [sqlite3_prepare_v3()] and [sqlite3_prepare16_v3()] interfaces. New flags may be added in future releases of SQLite. } SQLITE_PREPARE_PERSISTENT = $01; // prepared statement will be retained for a long time and probably reused many times SQLITE_PREPARE_NORMALIZE = $02; // no-op SQLITE_PREPARE_NO_VTAB = $04; // return an error (error code SQLITE_ERROR) if the statement uses any virtual tables { SQLite Fundamental Datatypes Every value in SQLite has one of five fundamental datatypes: 64-bit signed integer 64-bit IEEE floating point number string BLOB NULL } SQLITE_INTEGER = 1; SQLITE_FLOAT = 2; SQLITE_BLOB = 4; SQLITE_NULL = 5; SQLITE_TEXT = 3; SQLITE3_TEXT = 3; { CAPI3REF: Database Connection Configuration Options These constants are the available integer configuration options that can be passed as the second argument to the [sqlite3_db_config()] interface. } SQLITE_DBCONFIG_MAINDBNAME = 1000; // const char* SQLITE_DBCONFIG_LOOKASIDE = 1001; // void* int int SQLITE_DBCONFIG_ENABLE_FKEY = 1002; // int int* SQLITE_DBCONFIG_ENABLE_TRIGGER = 1003; // int int* SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER = 1004; // int int* SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION = 1005; // int int* SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE = 1006; // int int* SQLITE_DBCONFIG_ENABLE_QPSG = 1007; // int int* SQLITE_DBCONFIG_TRIGGER_EQP = 1008; // int int* SQLITE_DBCONFIG_RESET_DATABASE = 1009; // int int* SQLITE_DBCONFIG_DEFENSIVE = 1010; // int int* SQLITE_DBCONFIG_WRITABLE_SCHEMA = 1011; // int int* SQLITE_DBCONFIG_LEGACY_ALTER_TABLE = 1012; // int int* SQLITE_DBCONFIG_DQS_DML = 1013; // int int* SQLITE_DBCONFIG_DQS_DDL = 1014; // int int* SQLITE_DBCONFIG_ENABLE_VIEW = 1015; // int int* SQLITE_DBCONFIG_MAX = 1015; // Largest DBCONFIG type PUSED_MEM=^USED_MEM; USED_MEM = packed record next: PUSED_MEM; left: Integer; size: Integer; end; PERR_PROC = ^ERR_PROC; ERR_PROC = procedure; PMEM_ROOT = ^MEM_ROOT; MEM_ROOT = packed record free: PUSED_MEM; used: PUSED_MEM; pre_alloc: PUSED_MEM; min_malloc: Integer; block_size: Integer; block_num: Integer; first_block_usage: Integer; error_handler: PERR_PROC; end; NET = record vio: Pointer; buff: PAnsiChar; buff_end: PAnsiChar; write_pos: PAnsiChar; read_pos: PAnsiChar; fd: Integer; max_packet: Cardinal; max_packet_size: Cardinal; pkt_nr: Cardinal; compress_pkt_nr: Cardinal; write_timeout: Cardinal; read_timeout: Cardinal; retry_count: Cardinal; fcntl: Integer; compress: Byte; remain_in_buf: LongInt; length: LongInt; buf_length: LongInt; where_b: LongInt; return_status: Pointer; reading_or_writing: Char; save_char: Char; no_send_ok: Byte; last_error: array[1..MYSQL_ERRMSG_SIZE] of Char; sqlstate: array[1..SQLSTATE_LENGTH + 1] of Char; last_errno: Cardinal; error: Char; query_cache_query: Pointer; report_error: Byte; return_errno: Byte; end; PMYSQL_FIELD = ^MYSQL_FIELD; MYSQL_FIELD = record name: PAnsiChar; // Name of column org_name: PAnsiChar; // Name of original column (added after 3.23.58) table: PAnsiChar; // Table of column if column was a field org_table: PAnsiChar; // Name of original table (added after 3.23.58 db: PAnsiChar; // table schema (added after 3.23.58) catalog: PAnsiChar; // table catalog (added after 3.23.58) def: PAnsiChar; // Default value (set by mysql_list_fields) length: LongInt; // Width of column max_length: LongInt; // Max width of selected set // added after 3.23.58 name_length: Cardinal; org_name_length: Cardinal; table_length: Cardinal; org_table_length: Cardinal; db_length: Cardinal; catalog_length: Cardinal; def_length: Cardinal; //*********************** flags: Cardinal; // Div flags decimals: Cardinal; // Number of decimals in field charsetnr: Cardinal; // char set number (added in 4.1) _type: Cardinal; // Type of field. Se mysql_com.h for types end; MYSQL_ROW = array[0..$ffff] of PAnsiChar; PMYSQL_ROW = ^MYSQL_ROW; PMYSQL_ROWS = ^MYSQL_ROWS; MYSQL_ROWS = record next: PMYSQL_ROWS; data: PMYSQL_ROW; end; MYSQL_DATA = record Rows: Int64; Fields: Cardinal; Data: PMYSQL_ROWS; Alloc: MEM_ROOT; end; PMYSQL_DATA = ^MYSQL_DATA; PMYSQL = ^MYSQL; MYSQL = record _net: NET; connector_fd: Pointer; host: PAnsiChar; user: PAnsiChar; passwd: PAnsiChar; unix_socket: PAnsiChar; server_version: PAnsiChar; host_info: PAnsiChar; info: PAnsiChar; db: PAnsiChar; charset: PAnsiChar; fields: PMYSQL_FIELD; field_alloc: MEM_ROOT; affected_rows: Int64; insert_id: Int64; extra_info: Int64; thread_id: LongInt; packet_length: LongInt; port: Cardinal; client_flag: LongInt; server_capabilities: LongInt; protocol_version: Cardinal; field_count: Cardinal; server_status: Cardinal; server_language: Cardinal; warning_count: Cardinal; options: Cardinal; status: Byte; free_me: Byte; reconnect: Byte; scramble: array[1..SCRAMBLE_LENGTH+1] of Char; rpl_pivot: Byte; master: PMYSQL; next_slave: PMYSQL; last_used_slave: PMYSQL; last_used_con: PMYSQL; stmts: Pointer; methods: Pointer; thd: Pointer; unbuffered_fetch_owner: PByte; end; MYSQL_RES = record row_count: Int64; field_count, current_field: Integer; fields: PMYSQL_FIELD; data: PMYSQL_DATA; data_cursor: PMYSQL_ROWS; field_alloc: MEM_ROOT; row: PMYSQL_ROW; // If unbuffered read current_row: PMYSQL_ROW; // buffer to current row lengths: PLongInt; // column lengths of current row handle: PMYSQL; // for unbuffered reads eof: Byte; // Used my mysql_fetch_row is_ps: Byte; end; PMYSQL_RES = ^MYSQL_RES; TMySQLOption = ( MYSQL_OPT_CONNECT_TIMEOUT, MYSQL_OPT_COMPRESS, MYSQL_OPT_NAMED_PIPE, MYSQL_INIT_COMMAND, MYSQL_READ_DEFAULT_FILE, MYSQL_READ_DEFAULT_GROUP, MYSQL_SET_CHARSET_DIR, MYSQL_SET_CHARSET_NAME, MYSQL_OPT_LOCAL_INFILE, MYSQL_OPT_PROTOCOL, MYSQL_SHARED_MEMORY_BASE_NAME, MYSQL_OPT_READ_TIMEOUT, MYSQL_OPT_WRITE_TIMEOUT, MYSQL_OPT_USE_RESULT, MYSQL_OPT_USE_REMOTE_CONNECTION, MYSQL_OPT_USE_EMBEDDED_CONNECTION, MYSQL_OPT_GUESS_CONNECTION, MYSQL_SET_CLIENT_IP, MYSQL_SECURE_AUTH, MYSQL_REPORT_DATA_TRUNCATION, MYSQL_OPT_RECONNECT, MYSQL_OPT_SSL_VERIFY_SERVER_CERT, MYSQL_PLUGIN_DIR, MYSQL_DEFAULT_AUTH, MYSQL_OPT_BIND, MYSQL_OPT_SSL_KEY, MYSQL_OPT_SSL_CERT, MYSQL_OPT_SSL_CA, MYSQL_OPT_SSL_CAPATH, MYSQL_OPT_SSL_CIPHER, MYSQL_OPT_SSL_CRL, MYSQL_OPT_SSL_CRLPATH, // Connection attribute options MYSQL_OPT_CONNECT_ATTR_RESET, MYSQL_OPT_CONNECT_ATTR_ADD, MYSQL_OPT_CONNECT_ATTR_DELETE, MYSQL_SERVER_PUBLIC_KEY, MYSQL_ENABLE_CLEARTEXT_PLUGIN, MYSQL_OPT_CAN_HANDLE_EXPIRED_PASSWORDS, MYSQL_OPT_SSL_ENFORCE, MYSQL_OPT_MAX_ALLOWED_PACKET, MYSQL_OPT_NET_BUFFER_LENGTH, MYSQL_OPT_TLS_VERSION, MYSQL_OPT_SSL_MODE, MYSQL_OPT_GET_SERVER_PUBLIC_KEY, // MariaDB specific MYSQL_PROGRESS_CALLBACK=5999, MYSQL_OPT_NONBLOCK, // MariaDB Connector/C specific MYSQL_DATABASE_DRIVER=7000, MARIADB_OPT_SSL_FP, // deprecated, use MARIADB_OPT_TLS_PEER_FP instead MARIADB_OPT_SSL_FP_LIST, // deprecated, use MARIADB_OPT_TLS_PEER_FP_LIST instead MARIADB_OPT_TLS_PASSPHRASE, // passphrase for encrypted certificates MARIADB_OPT_TLS_CIPHER_STRENGTH, MARIADB_OPT_TLS_VERSION, MARIADB_OPT_TLS_PEER_FP, // single finger print for server certificate verification MARIADB_OPT_TLS_PEER_FP_LIST, // finger print white list for server certificate verification MARIADB_OPT_CONNECTION_READ_ONLY, MYSQL_OPT_CONNECT_ATTRS, // for mysql_get_optionv MARIADB_OPT_USERDATA, MARIADB_OPT_CONNECTION_HANDLER, MARIADB_OPT_PORT, MARIADB_OPT_UNIXSOCKET, MARIADB_OPT_PASSWORD, MARIADB_OPT_HOST, MARIADB_OPT_USER, MARIADB_OPT_SCHEMA, MARIADB_OPT_DEBUG, MARIADB_OPT_FOUND_ROWS, MARIADB_OPT_MULTI_RESULTS, MARIADB_OPT_MULTI_STATEMENTS, MARIADB_OPT_INTERACTIVE, MARIADB_OPT_PROXY_HEADER ); // MySQL data types TDBDatatypeIndex = (dbdtTinyint, dbdtSmallint, dbdtMediumint, dbdtInt, dbdtUint, dbdtBigint, dbdtSerial, dbdtBigSerial, dbdtFloat, dbdtDouble, dbdtDecimal, dbdtNumeric, dbdtReal, dbdtDoublePrecision, dbdtMoney, dbdtSmallmoney, dbdtDate, dbdtTime, dbdtYear, dbdtDatetime, dbdtDatetime2, dbdtDatetimeOffset, dbdtSmalldatetime, dbdtTimestamp, dbdtInterval, dbdtChar, dbdtNchar, dbdtVarchar, dbdtNvarchar, dbdtTinytext, dbdtText, dbdtNtext, dbdtMediumtext, dbdtLongtext, dbdtJson, dbdtJsonB, dbdtCidr, dbdtInet, dbdtMacaddr, dbdtBinary, dbdtVarbinary, dbdtTinyblob, dbdtBlob, dbdtMediumblob, dbdtLongblob, dbdtImage, dbdtEnum, dbdtSet, dbdtBit, dbdtVarBit, dbdtBool, dbdtRegClass, dbdtRegProc, dbdtUnknown, dbdtCursor, dbdtSqlvariant, dbdtTable, dbdtUniqueidentifier, dbdtHierarchyid, dbdtXML, dbdtPoint, dbdtLinestring, dbdtLineSegment, dbdtPolygon, dbdtGeometry, dbdtBox, dbdtPath, dbdtCircle, dbdtMultipoint, dbdtMultilinestring, dbdtMultipolygon, dbdtGeometrycollection ); // MySQL data type categorization TDBDatatypeCategoryIndex = (dtcInteger, dtcReal, dtcText, dtcBinary, dtcTemporal, dtcSpatial, dtcOther); // MySQL native column type constants. See include/mysql.h.pp in the server code TMySQLType = (mytDecimal, mytTiny, mytShort, mytLong, mytFloat, mytDouble, mytNull, mytTimestamp, mytLonglong, mytInt24, mytDate, mytTime, mytDatetime, mytYear, mytNewdate, mytVarchar, mytBit, mytTimestamp2, mytDatetime2, mytTime2, mytJson=245, mytNewdecimal, mytEnum, mytSet, mytTinyblob, mytMediumblob, mytLongblob, mytBlob, mytVarstring, mytString, mytGeometry); // MySQL data type structure TDBDatatype = record Index: TDBDatatypeIndex; NativeType: TMySQLType; // See above NativeTypes: String; // Same as above, but for multiple postgresql oid's Name: String; Names: String; Description: String; HasLength: Boolean; // Can have Length- or Set-attribute? RequiresLength: Boolean; // Must have a Length- or Set-attribute? MaxSize: Int64; DefaultSize: Int64; // TEXT and BLOB allow custom length, but we want to leave the default max length away from ALTER TABLE's HasBinary: Boolean; // Can be binary? HasDefault: Boolean; // Can have a default value? LoadPart: Boolean; // Select per SUBSTR() or LEFT() DefLengthSet: String; // Should be set for types which require a length/set Format: String; // Used for date/time values when displaying and generating queries ValueMustMatch: String; Category: TDBDatatypeCategoryIndex; end; // MySQL data type category structure TDBDatatypeCategory = record Index: TDBDatatypeCategoryIndex; Name: String; Color: TColor; NullColor: TColor; end; // PostgreSQL structures TPQConnectStatus = (CONNECTION_OK, CONNECTION_BAD, CONNECTION_STARTED, CONNECTION_MADE, CONNECTION_AWAITING_RESPONSE, CONNECTION_AUTH_OK, CONNECTION_SETENV, CONNECTION_SSL_STARTUP, CONNECTION_NEEDED); PPGconn = Pointer; PPGresult = Pointer; POid = Cardinal; // SQLite structures Psqlite3 = Pointer; Psqlite3_stmt = Pointer; // Server variables TVarScope = (vsGlobal, vsSession, vsBoth); TServerVariable = record Name: String; IsDynamic: Boolean; VarScope: TVarScope; EnumValues: String; end; // Custom exception class for any connection or database related error EDbError = class(Exception) public ErrorCode: Cardinal; constructor Create(const Msg: string; const ErrorCode: Cardinal=0); end; // DLL loading TDbLib = class(TObject) const LIB_PROC_ERROR: Cardinal = 1000; private FDllFile: String; FHandle: HMODULE; procedure AssignProc(var Proc: FARPROC; Name: PAnsiChar; Mandantory: Boolean=True); procedure AssignProcedures; virtual; abstract; public property Handle: HMODULE read FHandle; property DllFile: String read FDllFile; constructor Create(DllFile: String); destructor Destroy; override; end; TMySQLLib = class(TDbLib) mysql_affected_rows: function(Handle: PMYSQL): Int64; stdcall; mysql_character_set_name: function(Handle: PMYSQL): PAnsiChar; stdcall; mysql_close: procedure(Handle: PMYSQL); stdcall; mysql_data_seek: procedure(Result: PMYSQL_RES; Offset: Int64); stdcall; mysql_errno: function(Handle: PMYSQL): Cardinal; stdcall; mysql_error: function(Handle: PMYSQL): PAnsiChar; stdcall; mysql_fetch_field_direct: function(Result: PMYSQL_RES; FieldNo: Cardinal): PMYSQL_FIELD; stdcall; mysql_fetch_field: function(Result: PMYSQL_RES): PMYSQL_FIELD; stdcall; mysql_fetch_lengths: function(Result: PMYSQL_RES): PLongInt; stdcall; mysql_fetch_row: function(Result: PMYSQL_RES): PMYSQL_ROW; stdcall; mysql_free_result: procedure(Result: PMYSQL_RES); stdcall; mysql_get_client_info: function: PAnsiChar; stdcall; mysql_get_server_info: function(Handle: PMYSQL): PAnsiChar; stdcall; mysql_init: function(Handle: PMYSQL): PMYSQL; stdcall; mysql_num_fields: function(Result: PMYSQL_RES): Integer; stdcall; mysql_num_rows: function(Result: PMYSQL_RES): Int64; stdcall; mysql_options: function(Handle: PMYSQL; Option: Integer; arg: PAnsiChar): Integer; stdcall; mysql_optionsv: function(Handle: PMYSQL; Option: Integer; arg, val: PAnsiChar): Integer; stdcall; mysql_ping: function(Handle: PMYSQL): Integer; stdcall; mysql_real_connect: function(Handle: PMYSQL; const Host, User, Passwd, Db: PAnsiChar; Port: Cardinal; const UnixSocket: PAnsiChar; ClientFlag: Cardinal): PMYSQL; stdcall; mysql_real_query: function(Handle: PMYSQL; const Query: PAnsiChar; Length: Cardinal): Integer; stdcall; mysql_ssl_set: function(Handle: PMYSQL; const key, cert, CA, CApath, cipher: PAnsiChar): Byte; stdcall; mysql_stat: function(Handle: PMYSQL): PAnsiChar; stdcall; mysql_store_result: function(Handle: PMYSQL): PMYSQL_RES; stdcall; mysql_thread_id: function(Handle: PMYSQL): Cardinal; stdcall; mysql_next_result: function(Handle: PMYSQL): Integer; stdcall; mysql_set_character_set: function(Handle: PMYSQL; csname: PAnsiChar): Integer; stdcall; mysql_thread_init: function: Byte; stdcall; mysql_thread_end: procedure; stdcall; mysql_warning_count: function(Handle: PMYSQL): Cardinal; stdcall; private procedure AssignProcedures; override; end; TPostgreSQLLib = class(TDbLib) PQconnectdb: function(const ConnInfo: PAnsiChar): PPGconn cdecl; PQerrorMessage: function(const Handle: PPGconn): PAnsiChar cdecl; PQresultErrorMessage: function(const Result: PPGresult): PAnsiChar cdecl; PQresultErrorField: function(const Result: PPGresult; fieldcode: Integer): PAnsiChar; PQfinish: procedure(const Handle: PPGconn); PQstatus: function(const Handle: PPGconn): TPQConnectStatus cdecl; PQsendQuery: function(const Handle: PPGconn; command: PAnsiChar): Integer cdecl; PQgetResult: function(const Handle: PPGconn): PPGresult cdecl; PQbackendPID: function(const Handle: PPGconn): Integer cdecl; PQcmdTuples: function(Result: PPGresult): PAnsiChar; cdecl; PQntuples: function(Result: PPGresult): Integer; cdecl; PQclear: procedure(Result: PPGresult); cdecl; PQnfields: function(Result: PPGresult): Integer; cdecl; PQfname: function(const Result: PPGresult; column_number: Integer): PAnsiChar; cdecl; PQftype: function(const Result: PPGresult; column_number: Integer): POid; cdecl; PQftable: function(const Result: PPGresult; column_number: Integer): POid; cdecl; PQgetvalue: function(const Result: PPGresult; row_number: Integer; column_number: Integer): PAnsiChar; cdecl; PQgetlength: function(const Result: PPGresult; row_number: Integer; column_number: Integer): Integer; cdecl; PQgetisnull: function(const Result: PPGresult; row_number: Integer; column_number: Integer): Integer; cdecl; PQlibVersion: function(): Integer; cdecl; private procedure AssignProcedures; override; end; TSQLiteCollationNeededCallback = procedure(userData: Pointer; ppDb:Psqlite3; eTextRep: Integer; zName: PAnsiChar); cdecl; TSQLiteCollation = function(userData: Pointer; lenA: Integer; strA: PAnsiChar; lenB: Integer; strB: PAnsiChar): Integer; cdecl; TSQLiteLib = class(TDbLib) sqlite3_open: function(const filename: PAnsiChar; var ppDb: Psqlite3): Integer; cdecl; sqlite3_libversion: function(): PAnsiChar; cdecl; sqlite3_close: function(ppDb: Psqlite3): Integer; cdecl; sqlite3_db_config: function (ppDb: Psqlite3; op: Integer): Integer; cdecl varargs; sqlite3_enable_load_extension: function(ppDb: Psqlite3; onoff: Integer): Integer; cdecl; sqlite3_errmsg: function(ppDb: Psqlite3): PAnsiChar; cdecl; sqlite3_errcode: function(ppDb: Psqlite3): Integer; cdecl; sqlite3_prepare_v2: function(ppDb: Psqlite3; zSql: PAnsiChar; nByte: Integer; var ppStmt: Psqlite3_stmt; var pzTail: PAnsiChar): Integer; cdecl; sqlite3_prepare_v3: function(ppDb: Psqlite3; zSql: PAnsiChar; nByte: Integer; prepFlags: Cardinal; var ppStmt: Psqlite3_stmt; var pzTail: PAnsiChar): Integer; cdecl; sqlite3_exec: function(ppDb: Psqlite3; sql: PAnsiChar; callback: Integer; callvack_arg: Pointer; errmsg: PAnsiChar): Integer; cdecl; sqlite3_finalize: function(pStmt: Psqlite3_stmt): Integer; cdecl; sqlite3_step: function(pStmt: Psqlite3_stmt): Integer; cdecl; sqlite3_reset: function(pStmt: Psqlite3_stmt): Integer; cdecl; sqlite3_total_changes: function(ppDb: Psqlite3): Integer; cdecl; sqlite3_column_text: function(pStmt: Psqlite3_stmt; iCol: Integer): PAnsiChar; cdecl; sqlite3_column_count: function(pStmt: Psqlite3_stmt): Integer; cdecl; sqlite3_column_name: function(pStmt: Psqlite3_stmt; N: Integer): PAnsiChar; cdecl; sqlite3_column_decltype: function(pStmt: Psqlite3_stmt; N: Integer): PAnsiChar; cdecl; sqlite3_column_database_name: function(pStmt: Psqlite3_stmt; N: Integer): PAnsiChar; cdecl; sqlite3_column_table_name: function(pStmt: Psqlite3_stmt; N: Integer): PAnsiChar; cdecl; sqlite3_column_origin_name: function(pStmt: Psqlite3_stmt; N: Integer): PAnsiChar; cdecl; sqlite3_column_type: function(pStmt: Psqlite3_stmt; iCol: Integer): Integer; cdecl; sqlite3_next_stmt: function(ppDb: Psqlite3; pStmt: Psqlite3_stmt): Psqlite3_stmt; cdecl; sqlite3_table_column_metadata: function(ppDb: Psqlite3; zDbName, zTableName, zColumnName: PAnsiChar; var pzDataType, pzCollSeq: PAnsiChar; var pNotNull, pPrimaryKey, pAutoinc: Integer ): Integer; cdecl; sqlite3_collation_needed: function(ppDb: Psqlite3; userData: Pointer; Func: TSQLiteCollationNeededCallback): Integer; cdecl; sqlite3_create_collation: function(ppDb: Psqlite3; const zName: PAnsiChar; eTextRep: Integer; pArg: Pointer; xCompare: TSQLiteCollation): Integer; cdecl; private procedure AssignProcedures; override; end; var MySQLKeywords: TStringList; MySQLErrorCodes: TStringList; // MySQL data type categories DatatypeCategories: array[TDBDatatypeCategoryIndex] of TDBDatatypeCategory = ( ( Index: dtcInteger; Name: 'Integer' ), ( Index: dtcReal; Name: 'Real' ), ( Index: dtcText; Name: 'Text' ), ( Index: dtcBinary; Name: 'Binary' ), ( Index: dtcTemporal; Name: 'Temporal (time)' ), ( Index: dtcSpatial; Name: 'Spatial (geometry)' ), ( Index: dtcOther; Name: 'Other' ) ); // MySQL Data Type List and Properties MySQLDatatypes: array [0..37] of TDBDatatype = ( ( Index: dbdtUnknown; NativeTypes: '99999'; Name: 'UNKNOWN'; Description: 'Unknown data type'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Category: dtcOther; ), ( Index: dbdtTinyint; NativeType: mytTiny; Name: 'TINYINT'; Description: 'TINYINT[(M)] [UNSIGNED] [ZEROFILL]' + sLineBreak + 'A very small integer. The signed range is -128 to 127. ' + 'The unsigned range is 0 to 255.'; HasLength: True; RequiresLength: False; MaxSize: 127; HasBinary: False; HasDefault: True; LoadPart: False; Category: dtcInteger; ), ( Index: dbdtSmallint; NativeType: mytShort; Name: 'SMALLINT'; Description: 'SMALLINT[(M)] [UNSIGNED] [ZEROFILL]' + sLineBreak + 'A small integer. The signed range is -32768 to 32767. ' + 'The unsigned range is 0 to 65535.'; HasLength: True; RequiresLength: False; MaxSize: 32767; HasBinary: False; HasDefault: True; LoadPart: False; Category: dtcInteger; ), ( Index: dbdtMediumint; NativeType: mytInt24; Name: 'MEDIUMINT'; Description: 'MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]' + sLineBreak + 'A medium-sized integer. The signed range is -8388608 to 8388607. ' + 'The unsigned range is 0 to 16777215.'; HasLength: True; RequiresLength: False; MaxSize: 8388607; HasBinary: False; HasDefault: True; LoadPart: False; Category: dtcInteger; ), ( Index: dbdtInt; NativeType: mytLong; Name: 'INT'; Description: 'INT[(M)] [UNSIGNED] [ZEROFILL]' + sLineBreak + 'A normal-size integer. The signed range is -2147483648 to 2147483647. ' + 'The unsigned range is 0 to 4294967295.'; HasLength: True; RequiresLength: False; MaxSize: 2147483647; HasBinary: False; HasDefault: True; LoadPart: False; Category: dtcInteger; ), ( Index: dbdtBigint; NativeType: mytLonglong; Name: 'BIGINT'; Description: 'BIGINT[(M)] [UNSIGNED] [ZEROFILL]' + sLineBreak + 'A large integer. The signed range is -9223372036854775808 to ' + '9223372036854775807. The unsigned range is 0 to 18446744073709551615.'; HasLength: True; RequiresLength: False; MaxSize: 9223372036854775807; HasBinary: False; HasDefault: True; LoadPart: False; Category: dtcInteger; ), ( Index: dbdtFloat; NativeType: mytFloat; Name: 'FLOAT'; Description: 'FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]' + sLineBreak + 'A small (single-precision) floating-point number. Allowable values are '+ '-3.402823466E+38 to -1.175494351E-38, 0, and 1.175494351E-38 to '+ '3.402823466E+38. These are the theoretical limits, based on the IEEE '+ 'standard. The actual range might be slightly smaller depending on your '+ 'hardware or operating system.'; HasLength: True; RequiresLength: False; HasBinary: False; HasDefault: True; LoadPart: False; Category: dtcReal; ), ( Index: dbdtDouble; NativeType: mytDouble; Name: 'DOUBLE'; Description: 'DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]' + sLineBreak + 'A normal-size (double-precision) floating-point number. Allowable ' + 'values are -1.7976931348623157E+308 to -2.2250738585072014E-308, 0, and ' + '2.2250738585072014E-308 to 1.7976931348623157E+308. These are the ' + 'theoretical limits, based on the IEEE standard. The actual range might ' + 'be slightly smaller depending on your hardware or operating system.'; HasLength: True; RequiresLength: False; HasBinary: False; HasDefault: True; LoadPart: False; Category: dtcReal; ), ( Index: dbdtDecimal; NativeType: mytNewdecimal; Name: 'DECIMAL'; Description: 'DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]' + sLineBreak + 'A packed "exact" fixed-point number. M is the total number of digits ' + '(the precision) and D is the number of digits after the decimal point ' + '(the scale). The decimal point and (for negative numbers) the "-" sign ' + 'are not counted in M. If D is 0, values have no decimal point or ' + 'fractional part. The maximum number of digits (M) for DECIMAL is 65. ' + 'The maximum number of supported decimals (D) is 30. If D is omitted, ' + 'the default is 0. If M is omitted, the default is 10.'; HasLength: True; RequiresLength: True; MaxSize: 9223372036854775807; HasBinary: False; HasDefault: True; LoadPart: False; DefLengthSet: '20,6'; Category: dtcReal; ), ( Index: dbdtDate; NativeType: mytDate; Name: 'DATE'; Description: 'DATE' + sLineBreak + 'A date. The supported range is ''1000-01-01'' to ''9999-12-31''. MySQL ' + 'displays DATE values in ''YYYY-MM-DD'' format, but allows assignment of ' + 'values to DATE columns using either strings or numbers.'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: True; LoadPart: False; Format: 'yyyy-mm-dd'; Category: dtcTemporal; ), ( Index: dbdtTime; NativeType: mytTime; Name: 'TIME'; Description: 'TIME' + sLineBreak + 'A time. The range is ''-838:59:59'' to ''838:59:59''. MySQL displays TIME ' + 'values in ''HH:MM:SS'' format, but allows assignment of values to TIME ' + 'columns using either strings or numbers.'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: True; LoadPart: False; Format: 'hh:nn:ss'; Category: dtcTemporal; ), ( Index: dbdtYear; NativeType: mytYear; Name: 'YEAR'; Description: 'YEAR[(2|4)]' + sLineBreak + 'A year in two-digit or four-digit format. The default is four-digit ' + 'format. In four-digit format, the allowable values are 1901 to 2155, ' + 'and 0000. In two-digit format, the allowable values are 70 to 69, ' + 'representing years from 1970 to 2069. MySQL displays YEAR values in ' + 'YYYY format, but allows you to assign values to YEAR columns using ' + 'either strings or numbers.'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: True; LoadPart: False; Format: 'yyyy'; Category: dtcTemporal; ), ( Index: dbdtDatetime; NativeType: mytDatetime; Name: 'DATETIME'; Description: 'DATETIME' + sLineBreak + 'A date and time combination. The supported range is ''1000-01-01 ' + '00:00:00'' to ''9999-12-31 23:59:59''. MySQL displays DATETIME values in ' + '''YYYY-MM-DD HH:MM:SS'' format, but allows assignment of values to ' + 'DATETIME columns using either strings or numbers.'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: True; LoadPart: False; Format: 'yyyy-mm-dd hh:nn:ss'; Category: dtcTemporal; ), ( Index: dbdtTimestamp; NativeType: mytTimestamp; Name: 'TIMESTAMP'; Description: 'TIMESTAMP' + sLineBreak + 'A timestamp. The range is ''1970-01-01 00:00:01'' UTC to ''2038-01-09 ' + '03:14:07'' UTC. TIMESTAMP values are stored as the number of seconds ' + 'since the epoch (''1970-01-01 00:00:00'' UTC). A TIMESTAMP cannot ' + 'represent the value ''1970-01-01 00:00:00'' because that is equivalent to ' + '0 seconds from the epoch and the value 0 is reserved for representing ' + '''0000-00-00 00:00:00'', the "zero" TIMESTAMP value.'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: True; LoadPart: False; Format: 'yyyy-mm-dd hh:nn:ss'; Category: dtcTemporal; ), ( Index: dbdtVarchar; NativeType: mytVarstring; Name: 'VARCHAR'; Description: 'VARCHAR(M)' + sLineBreak + 'A variable-length string. M represents the maximum column length in ' + 'characters. The range of M is 0 to 65,535. The effective maximum length ' + 'of a VARCHAR is subject to the maximum row size (65,535 bytes, which is ' + 'shared among all columns) and the character set used. For example, utf8 ' + 'characters can require up to three bytes per character, so a VARCHAR ' + 'column that uses the utf8 character set can be declared to be a maximum ' + 'of 21,844 characters. ' + sLineBreak + sLineBreak + '*Note*: MySQL 5.1 follows the standard SQL specification, and does not ' + 'remove trailing spaces from VARCHAR values.'; HasLength: True; RequiresLength: True; MaxSize: 255; HasBinary: True; // MySQL-Help says the opposite but it's valid for older versions at least. HasDefault: True; LoadPart: True; DefLengthSet: '50'; Category: dtcText; ), ( Index: dbdtChar; NativeType: mytString; Name: 'CHAR'; Description: 'CHAR[(M)]' + sLineBreak + 'A fixed-length string that is always right-padded with spaces to the ' + 'specified length when stored. M represents the column length in ' + 'characters. The range of M is 0 to 255. If M is omitted, the length is 1.' + sLineBreak + sLineBreak + '*Note*: Trailing spaces are removed when CHAR values are retrieved ' + 'unless the PAD_CHAR_TO_FULL_LENGTH SQL mode is enabled.'; HasLength: True; RequiresLength: True; MaxSize: 255; HasBinary: True; HasDefault: True; LoadPart: False; DefLengthSet: '50'; Category: dtcText; ), ( Index: dbdtTinytext; NativeType: mytTinyblob; Name: 'TINYTEXT'; Description: 'TINYTEXT' + sLineBreak + 'A TEXT column with a maximum length of 255 (2^8 - 1) characters. The ' + 'effective maximum length is less if the value contains multi-byte ' + 'characters. Each TINYTEXT value is stored using a one-byte length ' + 'prefix that indicates the number of bytes in the value.'; HasLength: False; RequiresLength: False; MaxSize: 255; HasBinary: True; HasDefault: False; LoadPart: False; Category: dtcText; ), ( Index: dbdtText; NativeType: mytBlob; Name: 'TEXT'; Description: 'TEXT[(M)]' + sLineBreak + 'A TEXT column with a maximum length of 65,535 (2^16 - 1) characters. The ' + 'effective maximum length is less if the value contains multi-byte ' + 'characters. Each TEXT value is stored using a two-byte length prefix ' + 'that indicates the number of bytes in the value. ' + sLineBreak + 'An optional length M can be given for this type. If this is done, MySQL ' + 'creates the column as the smallest TEXT type large enough to hold ' + 'values M characters long.'; HasLength: True; RequiresLength: False; MaxSize: 65535; DefaultSize: 65535; HasBinary: True; HasDefault: False; LoadPart: True; Category: dtcText; ), ( Index: dbdtMediumtext; NativeType: mytMediumblob; Name: 'MEDIUMTEXT'; Description: 'MEDIUMTEXT' + sLineBreak + 'A TEXT column with a maximum length of 16,777,215 (2^24 - 1) characters. ' + 'The effective maximum length is less if the value contains multi-byte ' + 'characters. Each MEDIUMTEXT value is stored using a three-byte length ' + 'prefix that indicates the number of bytes in the value.'; HasLength: False; RequiresLength: False; HasBinary: True; HasDefault: False; LoadPart: True; Category: dtcText; ), ( Index: dbdtLongtext; NativeType: mytLongblob; Name: 'LONGTEXT'; Description: 'LONGTEXT' + sLineBreak + 'A TEXT column with a maximum length of 4,294,967,295 or 4GB (2^32 - 1) ' + 'characters. The effective maximum length is less if the value contains ' + 'multi-byte characters. The effective maximum length of LONGTEXT columns ' + 'also depends on the configured maximum packet size in the client/server ' + 'protocol and available memory. Each LONGTEXT value is stored using a ' + 'four-byte length prefix that indicates the number of bytes in the ' + 'value.'; HasLength: False; RequiresLength: False; HasBinary: True; HasDefault: False; LoadPart: True; Category: dtcText; ), ( Index: dbdtJson; NativeType: mytJson; Name: 'JSON'; Description: 'JSON' + sLineBreak + 'Documents stored in JSON columns are converted to an internal format that '+ 'permits quick read access to document elements. When the server later must '+ 'read a JSON value stored in this binary format, the value need not be parsed '+ 'from a text representation. The binary format is structured to enable the '+ 'server to look up subobjects or nested values directly by key or array index '+ 'without reading all values before or after them in the document.'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Category: dtcText; ), ( Index: dbdtBinary; NativeType: mytString; Name: 'BINARY'; Description: 'BINARY(M)' + sLineBreak + 'The BINARY type is similar to the CHAR type, but stores binary byte ' + 'strings rather than non-binary character strings. M represents the ' + 'column length in bytes.'; HasLength: True; RequiresLength: True; HasBinary: False; HasDefault: True; LoadPart: False; DefLengthSet: '50'; Category: dtcBinary; ), ( Index: dbdtVarbinary; NativeType: mytVarstring; Name: 'VARBINARY'; Description: 'VARBINARY(M)' + sLineBreak + 'The VARBINARY type is similar to the VARCHAR type, but stores binary ' + 'byte strings rather than non-binary character strings. M represents the ' + 'maximum column length in bytes.'; HasLength: True; RequiresLength: True; HasBinary: False; HasDefault: True; LoadPart: True; DefLengthSet: '50'; Category: dtcBinary; ), ( Index: dbdtTinyblob; NativeType: mytTinyblob; Name: 'TINYBLOB'; Description: 'TINYBLOB' + sLineBreak + 'A BLOB column with a maximum length of 255 (2^8 - 1) bytes. Each ' + 'TINYBLOB value is stored using a one-byte length prefix that indicates ' + 'the number of bytes in the value.'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Category: dtcBinary; ), ( Index: dbdtBlob; NativeType: mytBlob; Name: 'BLOB'; Description: 'BLOB[(M)]' + sLineBreak + 'A BLOB column with a maximum length of 65,535 (2^16 - 1) bytes. Each ' + 'BLOB value is stored using a two-byte length prefix that indicates the ' + 'number of bytes in the value. ' + sLineBreak + 'An optional length M can be given for this type. If this is done, MySQL ' + 'creates the column as the smallest BLOB type large enough to hold ' + 'values M bytes long.'; HasLength: True; RequiresLength: False; MaxSize: 65535; DefaultSize: 65535; HasBinary: False; HasDefault: False; LoadPart: True; Category: dtcBinary; ), ( Index: dbdtMediumblob; NativeType: mytMediumblob; Name: 'MEDIUMBLOB'; Description: 'MEDIUMBLOB' + sLineBreak + 'A BLOB column with a maximum length of 16,777,215 (2^24 - 1) bytes. Each ' + 'MEDIUMBLOB value is stored using a three-byte length prefix that ' + 'indicates the number of bytes in the value.'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: True; Category: dtcBinary; ), ( Index: dbdtLongblob; NativeType: mytLongblob; Name: 'LONGBLOB'; Description: 'LONGBLOB' + sLineBreak + 'A BLOB column with a maximum length of 4,294,967,295 or 4GB (2^32 - 1) ' + 'bytes. The effective maximum length of LONGBLOB columns depends on the ' + 'configured maximum packet size in the client/server protocol and ' + 'available memory. Each LONGBLOB value is stored using a four-byte ' + 'length prefix that indicates the number of bytes in the value.'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: True; Category: dtcBinary; ), ( Index: dbdtEnum; NativeType: mytEnum; Name: 'ENUM'; Description: 'ENUM(''value1'',''value2'',...)' + sLineBreak + 'An enumeration. A string object that can have only one value, chosen ' + 'from the list of values ''value1'', ''value2'', ..., NULL or the special '''' ' + 'error value. An ENUM column can have a maximum of 65,535 distinct ' + 'values. ENUM values are represented internally as integers.'; HasLength: True; // Obviously this is not meant as "length", but as "set of values" RequiresLength: True; HasBinary: False; HasDefault: True; LoadPart: False; DefLengthSet: '''Y'',''N'''; Category: dtcOther; ), ( Index: dbdtSet; NativeType: mytSet; Name: 'SET'; Description: 'SET(''value1'',''value2'',...)' + sLineBreak + 'A set. A string object that can have zero or more values, each of which ' + 'must be chosen from the list of values ''value1'', ''value2'', ... A SET ' + 'column can have a maximum of 64 members. SET values are represented ' + 'internally as integers.'; HasLength: True; // Same as for ENUM RequiresLength: True; HasBinary: False; HasDefault: True; LoadPart: False; DefLengthSet: '''Value A'',''Value B'''; Category: dtcOther; ), ( Index: dbdtBit; NativeType: mytBit; Name: 'BIT'; Description: 'BIT[(M)]' + sLineBreak + 'A bit-field type. M indicates the number of bits per value, from 1 to ' + '64. The default is 1 if M is omitted.'; HasLength: True; RequiresLength: False; HasBinary: False; HasDefault: True; LoadPart: False; Category: dtcInteger; ), ( Index: dbdtPoint; NativeType: mytGeometry; Name: 'POINT'; Description: 'POINT(x,y)' + sLineBreak + 'Constructs a WKB Point using its coordinates.'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Category: dtcSpatial; ), ( Index: dbdtLinestring; NativeType: mytGeometry; Name: 'LINESTRING'; Description: 'LINESTRING(pt1,pt2,...)' + sLineBreak + 'Constructs a WKB LineString value from a number of WKB Point arguments. ' + 'If any argument is not a WKB Point, the return value is NULL. If the ' + 'number of Point arguments is less than two, the return value is NULL.'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Category: dtcSpatial; ), ( Index: dbdtPolygon; NativeType: mytGeometry; Name: 'POLYGON'; Description: 'POLYGON(ls1,ls2,...)' + sLineBreak + 'Constructs a WKB Polygon value from a number of WKB LineString ' + 'arguments. If any argument does not represent the WKB of a LinearRing ' + '(that is, not a closed and simple LineString) the return value is NULL.'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Category: dtcSpatial; ), ( Index: dbdtGeometry; NativeType: mytGeometry; Name: 'GEOMETRY'; Description: ''; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Category: dtcSpatial; ), ( Index: dbdtMultipoint; NativeType: mytGeometry; Name: 'MULTIPOINT'; Description: 'MULTIPOINT(pt1,pt2,...)' + sLineBreak + 'Constructs a WKB MultiPoint value using WKB Point arguments. If any ' + 'argument is not a WKB Point, the return value is NULL.'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Category: dtcSpatial; ), ( Index: dbdtMultilinestring; NativeType: mytGeometry; Name: 'MULTILINESTRING'; Description: 'MULTILINESTRING(ls1,ls2,...)' + sLineBreak + 'Constructs a WKB MultiLineString value using WKB LineString arguments. ' + 'If any argument is not a WKB LineString, the return value is NULL.'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Category: dtcSpatial; ), ( Index: dbdtMultipolygon; NativeType: mytGeometry; Name: 'MULTIPOLYGON'; Description: 'MULTIPOLYGON(poly1,poly2,...)' + sLineBreak + 'Constructs a WKB MultiPolygon value from a set of WKB Polygon ' + 'arguments. If any argument is not a WKB Polygon, the return value is ' + 'NULL.'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Category: dtcSpatial; ), ( Index: dbdtGeometrycollection; NativeType: mytGeometry; Name: 'GEOMETRYCOLLECTION'; Description: 'GEOMETRYCOLLECTION(g1,g2,...)' + sLineBreak + 'Constructs a WKB GeometryCollection. If any argument is not a ' + 'well-formed WKB representation of a geometry, the return value is NULL.'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Category: dtcSpatial; ) ); MSSQLDatatypes: array [0..33] of TDBDatatype = ( ( Index: dbdtUnknown; NativeTypes: '99999'; Name: 'UNKNOWN'; Description: 'Unknown data type'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Category: dtcOther; ), ( Index: dbdtTinyint; Name: 'TINYINT'; Description: 'Integer data from 0 through 255.'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: True; LoadPart: False; Category: dtcInteger; ), ( Index: dbdtSmallint; Name: 'SMALLINT'; Description: 'Integer data from -2^15 (-32,768) through 2^15 - 1 (32,767).'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: True; LoadPart: False; Category: dtcInteger; ), ( Index: dbdtInt; Name: 'INT'; Description: 'Integer (whole number) data from -2^31 (-2,147,483,648) through 2^31 - 1 (2,147,483,647).'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: True; LoadPart: False; Category: dtcInteger; ), ( Index: dbdtBigint; Name: 'BIGINT'; Description: 'Integer (whole number) data from -2^63 (-9,223,372,036,854,775,808) through 2^63-1 (9,223,372,036,854,775,807).'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: True; LoadPart: False; Category: dtcInteger; ), ( Index: dbdtBit; Name: 'BIT'; Description: '0 or 1'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: True; LoadPart: False; Category: dtcInteger; ), ( Index: dbdtDecimal; Name: 'DECIMAL'; Description: 'Fixed precision and scale numeric data from -10^38 +1 through 10^38 –1.'; HasLength: True; RequiresLength: True; HasBinary: False; HasDefault: True; LoadPart: False; DefLengthSet: '10,0'; Category: dtcReal; ), ( Index: dbdtNumeric; Name: 'NUMERIC'; Description: 'Functionally equivalent to decimal.'; HasLength: True; RequiresLength: True; HasBinary: False; HasDefault: True; LoadPart: False; DefLengthSet: '10,0'; Category: dtcReal; ), ( Index: dbdtMoney; Name: 'MONEY'; Description: 'Monetary data values from -2^63 (-922,337,203,685,477.5808) through 2^63 - 1 (+922,337,203,685,477.5807), with accuracy to a ten-thousandth of a monetary unit.'; HasLength: True; RequiresLength: False; HasBinary: False; HasDefault: True; LoadPart: False; Category: dtcReal; ), ( Index: dbdtSmallmoney; Name: 'SMALLMONEY'; Description: 'Monetary data values from -214,748.3648 through +214,748.3647, with accuracy to a ten-thousandth of a monetary unit.'; HasLength: True; RequiresLength: False; HasBinary: False; HasDefault: True; LoadPart: False; Category: dtcReal; ), ( Index: dbdtFloat; Name: 'FLOAT'; Description: 'Floating precision number data with the following valid values: -1.79E + 308 through -2.23E - 308, 0 and 2.23E + 308 through 1.79E + 308.'; HasLength: True; RequiresLength: False; HasBinary: False; HasDefault: True; LoadPart: False; Category: dtcReal; ), ( Index: dbdtReal; Name: 'REAL'; Description: 'Floating precision number data with the following valid values: -3.40E + 38 through -1.18E - 38, 0 and 1.18E - 38 through 3.40E + 38.'; HasLength: True; RequiresLength: False; HasBinary: False; HasDefault: True; LoadPart: False; Category: dtcReal; ), ( Index: dbdtTime; Name: 'TIME'; Description: 'The time data type stores time values only, based on a 24-hour clock. '+ 'The time data type has a range of 00:00:00.0000000 through 23:59:59.9999999 with an '+ 'accuracy of 100 nanoseconds. The default value is 00:00:00.0000000 (midnight). The '+ 'time data type supports user-defined fractional second precision, and the storage '+ 'size varies from 3 to 6 bytes, based on the precision specified.'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: True; LoadPart: False; Format: 'hh:nn:ss'; Category: dtcTemporal; ), ( Index: dbdtDate; Name: 'DATE'; Description: 'The date data type has a range of January 1, 01 through December 31, '+ '9999 with an accuracy of 1 day. The default value is January 1, 1900. The storage size '+ 'is 3 bytes.'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: True; LoadPart: False; Format: 'yyyy-mm-dd'; Category: dtcTemporal; ), ( Index: dbdtDatetime; Name: 'DATETIME'; Description: 'Date and time data from January 1, 1753, through December 31, 9999, with an accuracy of three-hundredths of a second, or 3.33 milliseconds.'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: True; LoadPart: False; Format: 'yyyy-mm-dd hh:nn:ss.zzz'; Category: dtcTemporal; ), ( Index: dbdtDatetime2; Name: 'DATETIME2'; Description: 'Date and time data from January 1,1 AD through December 31, 9999 AD, with an accuracy of three-hundredths of a second, or 3.33 milliseconds.'; HasLength: True; RequiresLength: False; HasBinary: False; HasDefault: True; LoadPart: False; Format: 'yyyy-mm-dd hh:nn:ss.zzzzzzz'; Category: dtcTemporal; ), ( Index: dbdtDatetimeOffset; Name: 'DATETIMEOFFSET'; Description: 'Defines a date that is combined with a time of a day that has time zone awareness and is based on a 24-hour clock.'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: True; LoadPart: False; Format: 'yyyy-mm-dd hh:nn:ss.zzzzzzz'; Category: dtcTemporal; ), ( Index: dbdtSmalldatetime; Name: 'SMALLDATETIME'; Description: 'Date and time data from January 1, 1900, through June 6, 2079, with an accuracy of one minute.'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: True; LoadPart: False; Format: 'yyyy-mm-dd hh:nn:ss'; Category: dtcTemporal; ), ( Index: dbdtTimestamp; Name: 'TIMESTAMP'; Description: 'A database-wide unique number that gets updated every time a row gets updated.'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Category: dtcInteger; ), ( Index: dbdtChar; Name: 'CHAR'; Description: 'Fixed-length non-Unicode character data with a maximum length of 8,000 characters.'; HasLength: True; RequiresLength: True; HasBinary: False; HasDefault: True; LoadPart: True; DefLengthSet: '50'; Category: dtcText; ), ( Index: dbdtVarchar; Name: 'VARCHAR'; Description: 'Variable-length non-Unicode data with a maximum of 8,000 characters.'; HasLength: True; RequiresLength: True; HasBinary: False; HasDefault: True; LoadPart: True; DefLengthSet: '50'; Category: dtcText; ), ( Index: dbdtText; Name: 'TEXT'; Description: 'Variable-length non-Unicode data with a maximum length of 2^31 - 1 (2,147,483,647) characters.'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: True; Category: dtcText; ), ( Index: dbdtNchar; Name: 'NCHAR'; Description: 'Fixed-length Unicode data with a maximum length of 4,000 characters.'; HasLength: True; RequiresLength: True; HasBinary: False; HasDefault: True; LoadPart: True; DefLengthSet: '50'; Category: dtcText; ), ( Index: dbdtNvarchar; Name: 'NVARCHAR'; Description: 'Variable-length Unicode data with a maximum length of 4,000 characters. sysname is a system-supplied user-defined data type that is functionally equivalent to nvarchar(128) and is used to reference database object names.'; HasLength: True; RequiresLength: True; HasBinary: False; HasDefault: True; LoadPart: True; DefLengthSet: '50'; Category: dtcText; ), ( Index: dbdtNtext; Name: 'NTEXT'; Description: 'Variable-length Unicode data with a maximum length of 2^30 - 1 (1,073,741,823) characters.'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: True; Category: dtcText; ), ( Index: dbdtBinary; Name: 'BINARY'; Description: 'Fixed-length binary data with a maximum length of 8,000 bytes.'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: True; Category: dtcBinary; ), ( Index: dbdtVarbinary; Name: 'VARBINARY'; Description: 'Variable-length binary data with a maximum length of 8,000 bytes.'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: True; Category: dtcBinary; ), ( Index: dbdtImage; Name: 'IMAGE'; Description: 'Variable-length binary data with a maximum length of 2^31 - 1 (2,147,483,647) bytes.'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Category: dtcBinary; ), ( Index: dbdtCursor; Name: 'CURSOR'; Description: 'A reference to a cursor.'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Category: dtcOther; ), ( Index: dbdtSqlvariant; Name: 'SQL_VARIANT'; Description: 'A data type that stores values of various SQL Server-supported data types, except text, ntext, timestamp, and sql_variant.'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Category: dtcOther; ), ( Index: dbdtTable; Name: 'TABLE'; Description: 'A special data type used to store a result set for later processing .'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Category: dtcOther; ), ( Index: dbdtUniqueidentifier; Name: 'UNIQUEIDENTIFIER'; Description: 'A globally unique identifier (GUID).'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Category: dtcOther; ), ( Index: dbdtHierarchyid; Name: 'HIERARCHYID'; Description: 'Represents a position in a hierarchy.'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Category: dtcOther; ), ( Index: dbdtXML; Name: 'XML'; Description: 'Lets you store XML documents and fragments.'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Category: dtcOther; ) ); PostgreSQLDatatypes: Array[0..37] of TDBDatatype = ( ( Index: dbdtUnknown; NativeTypes: '99999'; Name: 'UNKNOWN'; Description: 'Unknown data type'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Category: dtcOther; ), ( Index: dbdtSmallint; NativeTypes: '21'; Name: 'SMALLINT'; Names: 'smallint|int2'; Description: 'Small-range integer. Range: -32768 to +32767. Storage Size: 2 Bytes.'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; ValueMustMatch: '^\d{1,5}$'; Category: dtcInteger; ), ( Index: dbdtInt; // 26 = oid, 28 = xid NativeTypes: '23|26|28'; Name: 'INTEGER'; Names: 'integer|int4|int|oid|xid'; Description: 'Typical choice for integer. Range: -2147483648 to +2147483647. Storage Size: 4 Bytes.'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; ValueMustMatch: '^\d{1,10}$'; Category: dtcInteger; ), ( Index: dbdtBigint; NativeTypes: '20'; Name: 'BIGINT'; Names: 'bigint|int8'; Description: 'Large-range integer. Range: -9223372036854775808 to 9223372036854775807. Storage Size: 8 Bytes.'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; ValueMustMatch: '^\d{1,19}$'; Category: dtcInteger; ), ( Index: dbdtSerial; Name: 'SERIAL'; Names: 'serial|serial4'; Description: 'Autoincrementing integer. Range: 1 to 2147483647. Storage Size: 4 Bytes.'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Category: dtcInteger; ), ( Index: dbdtBigSerial; Name: 'BIGSERIAL'; Names: 'bigserial|serial8'; Description: 'Large autoincrementing integer. Range: 1 to 9223372036854775807. Storage Size: 8 Bytes.'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Category: dtcInteger; ), ( Index: dbdtVarBit; NativeTypes: '1562'; Name: 'BIT VARYING'; Names: 'bit varying|varbit'; Description: 'Variable-length bit string.'; HasLength: True; RequiresLength: False; HasBinary: False; HasDefault: True; LoadPart: False; Category: dtcInteger; ), ( Index: dbdtBit; NativeTypes: '1560'; Name: 'BIT'; Names: 'bit'; Description: 'Fixed-length bit string.'; HasLength: True; RequiresLength: False; HasBinary: False; HasDefault: True; LoadPart: False; Category: dtcInteger; ), ( Index: dbdtNumeric; NativeTypes: '1700'; Name: 'NUMERIC'; Names: 'numeric|float8|decimal'; Description: 'User-specified precision, exact. Range: no limit. Storage Size: variable.'; HasLength: True; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Category: dtcReal; ), ( Index: dbdtReal; NativeTypes: '700'; Name: 'REAL'; Names: 'real|float4'; Description: 'Variable-precision, inexact. Range: 6 decimal digits precision. Storage Size: 4 Bytes.'; HasLength: True; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Category: dtcReal; ), ( Index: dbdtDoublePrecision; NativeTypes: '701|1700'; Name: 'DOUBLE PRECISION'; Names: 'double precision|float8'; Description: 'Variable-precision, inexact. Range: 15 decimal digits precision. Storage Size: 8 Bytes.'; HasLength: True; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Category: dtcReal; ), ( Index: dbdtMoney; NativeTypes: '790'; Name: 'MONEY'; Description: 'Currency amount. Range: -92233720368547758.08 to +92233720368547758.07. Storage Size: 8 Bytes.'; HasLength: True; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Category: dtcReal; ), ( Index: dbdtChar; NativeTypes: '18|1042'; Name: 'CHAR'; Names: 'CHARACTER'; Description: 'Fixed-length, blank padded.'; HasLength: True; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: True; Category: dtcText; ), ( Index: dbdtVarchar; NativeTypes: '18|19|24|1043|1043'; Name: 'VARCHAR'; Names: 'char|bpchar|varchar|name|enum|character varying'; Description: 'Variable-length with limit.'; HasLength: True; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: True; Category: dtcText; ), ( Index: dbdtText; NativeTypes: '25|22|30|143|629|651|719|791|1000|1028|1040|1041|1115|1182|1183|1185|1187|1231|1263|1270|1561|1563|2201|2207|2211|2949|2951|3643|3644|3645|3735|3770'; Name: 'TEXT'; Names: 'text|int2vector|oidvector|bool'; Description: 'Variable unlimited length.'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: True; Category: dtcText; ), ( Index: dbdtCidr; NativeTypes: '650'; Name: 'CIDR'; Names: 'cidr'; Description: 'IPv4 and IPv6 networks. Storage size: 7 or 19 bytes'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Category: dtcText; ), ( Index: dbdtInet; NativeTypes: '869'; Name: 'INET'; Names: 'inet'; Description: 'IPv4 and IPv6 hosts and networks. Storage size: 7 or 19 bytes'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Category: dtcText; ), ( Index: dbdtMacaddr; NativeTypes: '829'; Name: 'MACADDR'; Names: 'macaddr'; Description: 'MAC addresses. Storage size: 6 bytes'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Category: dtcText; ), ( Index: dbdtDate; NativeTypes: '1082'; Name: 'DATE'; Description: 'Calendar date (year, month, day).'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Format: 'yyyy-mm-dd'; Category: dtcTemporal; ), ( Index: dbdtTime; NativeTypes: '1083'; Name: 'TIME'; Description: 'Time of day.'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Format: 'hh:nn:ss'; Category: dtcTemporal; ), ( Index: dbdtDatetime; NativeTypes: '1082|1114|702'; Name: 'TIMESTAMP'; Names: 'timestamp|datetime|abstime|timestamp without time zone'; Description: 'Date and time without timezone, e.g. "2020-06-27 16:24:41".'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Format: 'yyyy-mm-dd hh:nn:ss'; Category: dtcTemporal; ), ( Index: dbdtDatetime2; NativeTypes: '1184'; Name: 'TIMESTAMPTZ'; Names: 'timestamptz|timestamp with time zone'; Description: 'Date and time with time zone, e.g. "2020-06-27 16:24:41+02".'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Format: 'yyyy-mm-dd hh:nn:ss'; Category: dtcTemporal; ), ( Index: dbdtDate; NativeTypes: '1082'; Name: 'DATE'; Description: 'Calendar date (year, month, day).'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Format: 'yyyy-mm-dd'; Category: dtcTemporal; ), ( Index: dbdtInterval; NativeTypes: '1186'; Name: 'INTERVAL'; Description: 'time interval from -178000000 years to 178000000 years'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Format: 'yyyy-mm-dd hh:nn:ss'; Category: dtcTemporal; ), ( Index: dbdtBlob; NativeTypes: '17'; Name: 'BYTEA'; Description: 'Binary data ("byte array").'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: True; Category: dtcBinary; ), ( Index: dbdtPoint; NativeTypes: '600'; Name: 'POINT'; Description: 'Point on a plane (x,y). Storage size: 16 bytes.'; HasLength: True; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Category: dtcSpatial; ), ( Index: dbdtLinestring; NativeTypes: '628'; Name: 'LINE'; Description: 'Infinite line ((x1,y1),(x2,y2)). Storage size: 32 bytes.'; HasLength: True; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Category: dtcSpatial; ), ( Index: dbdtLineSegment; NativeTypes: '601'; Name: 'LSEG'; Description: 'Finite line segment ((x1,y1),(x2,y2)). Storage size: 32 bytes.'; HasLength: True; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Category: dtcSpatial; ), ( Index: dbdtBox; NativeTypes: '603'; Name: 'BOX'; Description: 'Rectangular box ((x1,y1),(x2,y2)). Storage size: 32 bytes.'; HasLength: True; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Category: dtcSpatial; ), ( Index: dbdtPath; NativeTypes: '602'; Name: 'PATH'; Description: 'Closed path (similar to polygon) ((x1,y1),...). Storage size: 16+16n bytes.'; HasLength: True; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Category: dtcSpatial; ), ( Index: dbdtPolygon; NativeTypes: '604'; Name: 'POLYGON'; Description: 'Closed path (similar to polygon) ((x1,y1),...). Storage size: 40+16n bytes.'; HasLength: True; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Category: dtcSpatial; ), ( Index: dbdtCircle; NativeTypes: '718'; Name: 'CIRCLE'; Description: 'Circle <(x,y),r> (center point and radius). Storage size: 24 bytes.'; HasLength: True; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Category: dtcSpatial; ), ( Index: dbdtBool; NativeTypes: '16'; Name: 'BOOLEAN'; Names: 'boolean|bool'; Description: 'State of true or false. Storage size: 1 byte.'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; ValueMustMatch: '^(true|false)$'; Category: dtcOther; ), ( Index: dbdtRegClass; NativeTypes: '2205'; Name: 'REGCLASS'; Names: 'regclass'; Description: 'Relation name'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Category: dtcOther; ), ( Index: dbdtRegProc; NativeTypes: '24'; Name: 'REGPROC'; Names: 'regproc|regprocedure'; Description: 'Function name'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Category: dtcOther; ), ( Index: dbdtJson; NativeTypes: '114'; Name: 'JSON'; Names: 'json'; Description: 'JavaScript Object Notation data'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Category: dtcText; ), ( Index: dbdtJsonB; NativeTypes: '3802'; Name: 'JSONB'; Names: 'jsonb'; Description: 'JavaScript Object Notation data in a binary form'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Category: dtcText; ), ( Index: dbdtUniqueidentifier; NativeTypes: '2950'; Name: 'UUID'; Names: 'uuid'; Description: 'The data type uuid stores Universally Unique Identifiers (UUID) as defined by RFC 4122, ISO/IEC 9834-8:2005, and related standards.'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; ValueMustMatch: '^\{?[a-f0-9]{8}-?[a-f0-9]{4}-?[a-f0-9]{4}-?[a-f0-9]{4}-?[a-f0-9]{12}\}?$'; Category: dtcText; ) ); SQLiteDatatypes: Array[0..15] of TDBDatatype = ( ( Index: dbdtUnknown; Name: 'UNKNOWN'; Description: 'Unknown data type'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Category: dtcOther; ), ( Index: dbdtTinyint; Name: 'TINYINT'; Names: 'INT2|BOOLEAN|BOOL'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: False; Category: dtcInteger; ), ( Index: dbdtInt; Name: 'INTEGER'; Names: 'INT|MEDIUMINT|INT8'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: True; LoadPart: False; Category: dtcInteger; ), ( Index: dbdtUint; Name: 'UINT'; Names: 'UINT'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: True; LoadPart: False; Category: dtcInteger; ), ( Index: dbdtBigint; Name: 'BIGINT'; Names: 'UNSIGNED BIG INT'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: True; LoadPart: False; Category: dtcInteger; ), ( Index: dbdtChar; Name: 'CHAR'; Names: 'CHARACTER|CHAR|NCHAR|NATIVE CHARACTER'; HasLength: True; RequiresLength: True; HasBinary: False; HasDefault: True; LoadPart: True; DefLengthSet: '50'; Category: dtcText; ), ( Index: dbdtVarchar; Name: 'VARCHAR'; Names: 'VARCHAR|VARYING CHARACTER|NVARCHAR|CHARACTER|CHAR|NCHAR|NATIVE CHARACTER'; HasLength: True; RequiresLength: True; HasBinary: False; HasDefault: True; LoadPart: True; DefLengthSet: '50'; Category: dtcText; ), ( Index: dbdtText; Name: 'TEXT'; Names: 'CLOB'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: True; LoadPart: True; Category: dtcText; ), ( Index: dbdtUniqueidentifier; Name: 'UNIQUEIDENTIFIER'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: True; LoadPart: False; Category: dtcBinary; ), ( Index: dbdtBlob; Name: 'BLOB'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: False; LoadPart: True; Category: dtcBinary; ), ( Index: dbdtReal; Name: 'REAL'; Names: 'REAL|NUMERIC|DOUBLE|DOUBLE PRECISION|FLOAT|DECIMAL'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: True; LoadPart: False; Category: dtcReal; ), ( Index: dbdtDate; Name: 'DATE'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: True; LoadPart: False; Category: dtcTemporal; ), ( Index: dbdtTime; Name: 'TIME'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: True; LoadPart: False; Category: dtcTemporal; ), ( Index: dbdtDatetime; Name: 'DATETIME'; HasLength: False; RequiresLength: False; HasBinary: False; HasDefault: True; LoadPart: False; Category: dtcTemporal; ), ( Index: dbdtEnum; NativeType: mytEnum; Name: 'ENUM'; HasLength: True; RequiresLength: True; HasBinary: False; HasDefault: True; LoadPart: False; DefLengthSet: '''Y'',''N'''; Category: dtcOther; ), ( Index: dbdtSet; NativeType: mytSet; Name: 'SET'; HasLength: True; RequiresLength: True; HasBinary: False; HasDefault: True; LoadPart: False; DefLengthSet: '''Value A'',''Value B'''; Category: dtcOther; ) ); MySQLVariables: array [0..417] of TServerVariable = ( ( Name: 'auto_increment_increment'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'auto_increment_offset'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'autocommit'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'automatic_sp_privileges'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'back_log'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'basedir'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'big_tables'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'binlog_cache_size'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'binlog_checksum'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'binlog_direct_non_transactional_updates'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'binlog_format'; IsDynamic: True; VarScope: vsBoth; EnumValues: 'ROW,STATEMENT,MIXED'; ), ( Name: 'binlog_row_image'; IsDynamic: True; VarScope: vsBoth; EnumValues: 'FULL,MINIMAL,NOBLOB'; ), ( Name: 'binlog_stmt_cache_size'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'bulk_insert_buffer_size'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'character_set_client'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'character_set_connection'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'character_set_database[a]'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'character_set_filesystem'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'character_set_results'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'character_set_server'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'character_set_system'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'character_sets_dir'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'collation_connection'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'collation_database[b]'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'collation_server'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'completion_type'; IsDynamic: True; VarScope: vsBoth; EnumValues: 'NO_CHAIN,CHAIN,RELEASE,0,1,2'; ), ( Name: 'concurrent_insert'; IsDynamic: True; VarScope: vsGlobal; EnumValues: 'NEVER,AUTO,ALWAYS,0,1,2'; ), ( Name: 'connect_timeout'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'datadir'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'date_format'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'datetime_format'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'debug'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'debug_sync'; IsDynamic: True; VarScope: vsSession; ), ( Name: 'default_storage_engine'; IsDynamic: True; VarScope: vsBoth; EnumValues: 'FEDERATED,MRG_MYISAM,MyISAM,BLACKHOLE,CSV,MEMORY,ARCHIVE,InnoDB'; ), ( Name: 'default_tmp_storage_engine'; IsDynamic: True; VarScope: vsBoth; EnumValues: 'FEDERATED,MRG_MYISAM,MyISAM,BLACKHOLE,CSV,MEMORY,ARCHIVE,InnoDB'; ), ( Name: 'default_week_format'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'delay_key_write'; IsDynamic: True; VarScope: vsGlobal; EnumValues: 'ON,OFF,ALL'; ), ( Name: 'delayed_insert_limit'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'delayed_insert_timeout'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'delayed_queue_size'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'disable_gtid_unsafe_statements'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'div_precision_increment'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'end_markers_in_json'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'engine_condition_pushdown'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'eq_range_index_dive_limit'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'error_count'; IsDynamic: False; VarScope: vsSession; ), ( Name: 'event_scheduler'; IsDynamic: True; VarScope: vsGlobal; EnumValues: 'ON,OFF,DISABLED'; ), ( Name: 'expire_logs_days'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'external_user'; IsDynamic: False; VarScope: vsSession; ), ( Name: 'flush'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'flush_time'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'foreign_key_checks'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'ft_boolean_syntax'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'ft_max_word_len'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'ft_min_word_len'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'ft_query_expansion_limit'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'ft_stopword_file'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'general_log'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'general_log_file'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'group_concat_max_len'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'gtid_done'; IsDynamic: False; VarScope: vsBoth; ), ( Name: 'gtid_lost'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'gtid_mode'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'gtid_mode'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'gtid_next'; IsDynamic: True; VarScope: vsSession; EnumValues: 'AUTOMATIC,ANONYMOUS'; ), ( Name: 'gtid_owned'; IsDynamic: False; VarScope: vsBoth; ), ( Name: 'have_compress'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'have_crypt'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'have_csv'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'have_dynamic_loading'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'have_geometry'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'have_innodb'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'have_ndbcluster'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'have_openssl'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'have_partitioning'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'have_profiling'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'have_query_cache'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'have_rtree_keys'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'have_ssl'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'have_symlink'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'host_cache_size'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'hostname'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'identity'; IsDynamic: True; VarScope: vsSession; ), ( Name: 'ignore_builtin_innodb'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'init_connect'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'init_file'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'init_slave'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_adaptive_flushing'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_adaptive_hash_index'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_adaptive_max_sleep_delay'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_additional_mem_pool_size'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'innodb_analyze_is_persistent'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_api_enable_binlog'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_api_enable_mdl'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_api_trx_level'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_autoextend_increment'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_autoinc_lock_mode'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'innodb_buffer_pool_dump_at_shutdown'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_buffer_pool_dump_now'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_buffer_pool_filename'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_buffer_pool_instances'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'innodb_buffer_pool_load_abort'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_buffer_pool_load_at_startup'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_buffer_pool_load_now'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_buffer_pool_size'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'innodb_change_buffer_max_size'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_change_buffering'; IsDynamic: True; VarScope: vsGlobal; EnumValues: 'INSERTS,DELETES,PURGES,CHANGES,ALL,NONE'; ), ( Name: 'innodb_checksum_algorithm'; IsDynamic: True; VarScope: vsGlobal; EnumValues: 'INNODB,CRC32,NONE,STRICT_INNODB,STRICT_CRC32,STRICT_NONE'; ), ( Name: 'innodb_checksums'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'innodb_commit_concurrency'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_concurrency_tickets'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_data_file_path'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'innodb_data_home_dir'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'innodb_doublewrite'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'innodb_fast_shutdown'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_file_format'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_file_format_check'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'innodb_file_format_max'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_file_per_table'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_flush_log_at_trx_commit'; IsDynamic: True; VarScope: vsGlobal; EnumValues: '0,1,2'; ), ( Name: 'innodb_flush_method'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'innodb_flush_neighbors'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_force_load_corrupted'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'innodb_force_recovery'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'innodb_ft_aux_table'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_ft_cache_size'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_ft_enable_stopword'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_ft_max_token_size'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_ft_min_token_size'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_ft_num_word_optimize'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_ft_server_stopword_table'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_ft_sort_pll_degree'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_ft_user_stopword_table'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_io_capacity'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_large_prefix'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_lock_wait_timeout'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'innodb_locks_unsafe_for_binlog'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'innodb_log_buffer_size'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'innodb_log_file_size'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'innodb_log_files_in_group'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'innodb_log_group_home_dir'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'innodb_lru_scan_depth'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_max_dirty_pages_pct'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_max_purge_lag'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_mirrored_log_groups'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'innodb_monitor_disable'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_monitor_enable'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_monitor_reset'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_monitor_reset_all'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_old_blocks_pct'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_old_blocks_time'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_open_files'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'innodb_optimize_fulltext_only'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_page_size'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'innodb_print_all_deadlocks'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_purge_batch_size'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'innodb_purge_threads'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'innodb_random_read_ahead'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_read_ahead_threshold'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_read_io_threads'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'innodb_replication_delay'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_rollback_on_timeout'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'innodb_rollback_segments'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_sort_buffer_size'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_spin_wait_delay'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_stats_method'; IsDynamic: True; VarScope: vsBoth; EnumValues: 'NULLS_EQUAL,NULLS_UNEQUAL,NULLS_IGNORED'; ), ( Name: 'innodb_stats_on_metadata'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_stats_persistent_sample_pages'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_stats_sample_pages'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_stats_transient_sample_pages'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_strict_mode'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'innodb_support_xa'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'innodb_sync_array_size'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'innodb_sync_spin_loops'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_table_locks'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'innodb_thread_concurrency'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_thread_sleep_delay'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_undo_directory'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_undo_logs'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_undo_tablespaces'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'innodb_use_native_aio'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'innodb_use_sys_malloc'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'innodb_version'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'innodb_write_io_threads'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'insert_id'; IsDynamic: True; VarScope: vsSession; ), ( Name: 'interactive_timeout'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'join_buffer_size'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'keep_files_on_create'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'key_buffer_size'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'key_cache_age_threshold'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'key_cache_block_size'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'key_cache_division_limit'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'language'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'large_files_support'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'large_page_size'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'large_pages'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'last_insert_id'; IsDynamic: True; VarScope: vsSession; ), ( Name: 'lc_messages'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'lc_messages_dir'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'lc_time_names'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'license'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'local_infile'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'lock_wait_timeout'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'locked_in_memory'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'log'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'log_bin'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'log_bin_basename'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'log_error'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'log_output'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'log_queries_not_using_indexes'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'log_slave_updates'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'log_slow_queries'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'log_throttle_queries_not_using_indexes'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'log_warnings'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'long_query_time'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'low_priority_updates'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'lower_case_file_system'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'lower_case_table_names'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'master_info_repository'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'master_verify_checksum'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'max_allowed_packet'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'max_binlog_cache_size'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'max_binlog_size'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'max_binlog_stmt_cache_size'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'max_connect_errors'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'max_connections'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'max_delayed_threads'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'max_error_count'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'max_heap_table_size'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'max_insert_delayed_threads'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'max_join_size'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'max_length_for_sort_data'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'max_prepared_stmt_count'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'max_relay_log_size'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'max_seeks_for_key'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'max_sort_length'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'max_sp_recursion_depth'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'max_tmp_tables'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'max_user_connections'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'max_write_lock_count'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'memlock'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'metadata_locks_cache_size'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'myisam_data_pointer_size'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'myisam_max_sort_file_size'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'myisam_mmap_size'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'myisam_recover_options'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'myisam_repair_threads'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'myisam_sort_buffer_size'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'myisam_stats_method'; IsDynamic: True; VarScope: vsBoth; EnumValues: 'NULLS_EQUAL,NULLS_UNEQUAL,NULLS_IGNORED'; ), ( Name: 'myisam_use_mmap'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'named_pipe'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'net_buffer_length'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'net_read_timeout'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'net_retry_count'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'net_write_timeout'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'new'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'old'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'old_alter_table'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'old_passwords'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'open_files_limit'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'optimizer_join_cache_level'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'optimizer_prune_level'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'optimizer_search_depth'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'optimizer_switch'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'optimizer_trace'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'optimizer_trace_features'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'optimizer_trace_limit'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'optimizer_trace_max_mem_size'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'optimizer_trace_offset'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'have_partitioning'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'performance_schema'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'performance_schema_accounts_size'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'performance_schema_digests_size'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'performance_schema_events_stages_history_long_size'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'performance_schema_events_stages_history_size'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'performance_schema_events_statements_history_long_size'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'performance_schema_events_statements_history_size'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'performance_schema_events_waits_history_long_size'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'performance_schema_events_waits_history_size'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'performance_schema_hosts_size'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'performance_schema_max_cond_classes'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'performance_schema_max_cond_instances'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'performance_schema_max_file_classes'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'performance_schema_max_file_handles'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'performance_schema_max_file_instances'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'performance_schema_max_mutex_classes'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'performance_schema_max_mutex_instances'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'performance_schema_max_rwlock_classes'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'performance_schema_max_rwlock_instances'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'performance_schema_max_socket_classes'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'performance_schema_max_socket_instances'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'performance_schema_max_stage_classes'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'performance_schema_max_statement_classes'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'performance_schema_max_table_handles'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'performance_schema_max_table_instances'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'performance_schema_max_thread_classes'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'performance_schema_max_thread_instances'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'performance_schema_setup_actors_size'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'performance_schema_setup_objects_size'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'performance_schema_users_size'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'pid_file'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'plugin_dir'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'port'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'preload_buffer_size'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'profiling'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'profiling_history_size'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'protocol_version'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'proxy_user'; IsDynamic: False; VarScope: vsSession; ), ( Name: 'pseudo_thread_id'; IsDynamic: True; VarScope: vsSession; ), ( Name: 'query_alloc_block_size'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'query_cache_limit'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'query_cache_min_res_unit'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'query_cache_size'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'query_cache_type'; IsDynamic: True; VarScope: vsBoth; EnumValues: '0,1,2'; ), ( Name: 'query_cache_wlock_invalidate'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'query_prealloc_size'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'rand_seed1'; IsDynamic: True; VarScope: vsSession; ), ( Name: 'rand_seed2'; IsDynamic: True; VarScope: vsSession; ), ( Name: 'range_alloc_block_size'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'read_buffer_size'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'read_only'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'read_rnd_buffer_size'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'relay_log_basename'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'relay_log_index'; IsDynamic: False; VarScope: vsBoth; ), ( Name: 'relay_log_index'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'relay_log_info_file'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'relay_log_info_repository'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'relay_log_purge'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'relay_log_recovery'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'relay_log_space_limit'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'report_host'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'report_password'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'report_port'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'report_user'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'rpl_semi_sync_master_enabled'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'rpl_semi_sync_master_timeout'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'rpl_semi_sync_master_trace_level'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'rpl_semi_sync_master_wait_no_slave'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'rpl_semi_sync_slave_enabled'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'rpl_semi_sync_slave_trace_level'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'secure_auth'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'secure_file_priv'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'server_id'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'server_uuid'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'shared_memory'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'shared_memory_base_name'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'skip_external_locking'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'skip_name_resolve'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'skip_networking'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'skip_show_database'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'slave_compressed_protocol'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'slave_exec_mode'; IsDynamic: True; VarScope: vsGlobal; EnumValues: 'IDEMPOTENT,STRICT'; ), ( Name: 'slave_load_tmpdir'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'slave_net_timeout'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'slave_parallel_workers'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'slave_skip_errors'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'slave_sql_verify_checksum'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'slave_transaction_retries'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'slave_type_conversions'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'slow_launch_time'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'slow_query_log'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'slow_query_log_file'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'socket'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'sort_buffer_size'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'sql_auto_is_null'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'sql_big_selects'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'sql_big_tables'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'sql_buffer_result'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'sql_log_bin'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'sql_log_off'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'sql_low_priority_updates'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'sql_max_join_size'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'sql_mode'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'sql_notes'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'sql_quote_show_create'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'sql_safe_updates'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'sql_select_limit'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'sql_slave_skip_counter'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'sql_warnings'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'ssl_ca'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'ssl_capath'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'ssl_cert'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'ssl_cipher'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'ssl_crl'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'ssl_crlpath'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'ssl_key'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'storage_engine'; IsDynamic: True; VarScope: vsBoth; EnumValues: 'FEDERATED,MRG_MYISAM,MyISAM,BLACKHOLE,CSV,MEMORY,ARCHIVE,InnoDB'; ), ( Name: 'stored_program_cache'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'sync_binlog'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'sync_frm'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'sync_master_info'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'sync_relay_log'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'sync_relay_log_info'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'system_time_zone'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'table_definition_cache'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'table_open_cache'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'thread_cache_size'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'thread_concurrency'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'thread_handling'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'thread_stack'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'time_format'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'time_zone'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'timed_mutexes'; IsDynamic: True; VarScope: vsGlobal; ), ( Name: 'timestamp'; IsDynamic: True; VarScope: vsSession; ), ( Name: 'tmp_table_size'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'tmpdir'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'transaction_alloc_block_size'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'transaction_prealloc_size'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'tx_isolation'; IsDynamic: True; VarScope: vsBoth; EnumValues: 'READ-UNCOMMITTED,READ-COMMITTED,REPEATABLE-READ,SERIALIZABLE'; ), ( Name: 'tx_read_only'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'unique_checks'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'updatable_views_with_limit'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'version'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'version_comment'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'version_compile_machine'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'version_compile_os'; IsDynamic: False; VarScope: vsGlobal; ), ( Name: 'wait_timeout'; IsDynamic: True; VarScope: vsBoth; ), ( Name: 'warning_count'; IsDynamic: False; VarScope: vsSession; ) ); implementation uses apphelpers; { EDbError } constructor EDbError.Create(const Msg: string; const ErrorCode: Cardinal=0); begin Self.ErrorCode := ErrorCode; inherited Create(Msg); end; { TDbLib } constructor TDbLib.Create(DllFile: String); var msg: String; begin // Load DLL as is (with or without path) inherited Create; FDllFile := DllFile; if not FileExists(FDllFile) then begin msg := f_('File does not exist: %s', [FDllFile]) + sLineBreak + sLineBreak + f_('Please launch %s from the directory where you have installed it. Or just reinstall %s.', [APPNAME, APPNAME] ); Raise EdbError.Create(msg); end; FHandle := LoadLibrary(PWideChar(FDllFile)); if FHandle = 0 then begin msg := f_('Library %s could not be loaded. Please select a different one.', [ExtractFileName(FDllFile)] ); if Windows.GetLastError <> 0 then msg := msg + sLineBreak + sLineBreak + f_('Internal error %d: %s', [Windows.GetLastError, SysErrorMessage(Windows.GetLastError)]); Raise EDbError.Create(msg); end; // Dll was loaded, now initialize required procedures AssignProcedures; end; destructor TDbLib.Destroy; begin if FHandle <> 0 then begin FreeLibrary(FHandle); FHandle := 0; end; inherited; end; procedure TDbLib.AssignProc(var Proc: FARPROC; Name: PAnsiChar; Mandantory: Boolean=True); var msg: String; begin // Map library procedure to internal procedure Proc := GetProcAddress(FHandle, Name); if Proc = nil then begin if Mandantory then begin msg := f_('Library error in %s: Could not find procedure address for "%s"', [ExtractFileName(FDllFile), Name] ); if Windows.GetLastError <> 0 then msg := msg + sLineBreak + sLineBreak + f_('Internal error %d: %s', [Windows.GetLastError, SysErrorMessage(Windows.GetLastError)]); Raise EDbError.Create(msg, LIB_PROC_ERROR); end; end; end; procedure TMySQLLib.AssignProcedures; begin AssignProc(@mysql_affected_rows, 'mysql_affected_rows'); AssignProc(@mysql_character_set_name, 'mysql_character_set_name'); AssignProc(@mysql_close, 'mysql_close'); AssignProc(@mysql_data_seek, 'mysql_data_seek'); AssignProc(@mysql_errno, 'mysql_errno'); AssignProc(@mysql_error, 'mysql_error'); AssignProc(@mysql_fetch_field_direct, 'mysql_fetch_field_direct'); AssignProc(@mysql_fetch_field, 'mysql_fetch_field'); AssignProc(@mysql_fetch_lengths, 'mysql_fetch_lengths'); AssignProc(@mysql_fetch_row, 'mysql_fetch_row'); AssignProc(@mysql_free_result, 'mysql_free_result'); AssignProc(@mysql_get_client_info, 'mysql_get_client_info'); AssignProc(@mysql_get_server_info, 'mysql_get_server_info'); AssignProc(@mysql_init, 'mysql_init'); AssignProc(@mysql_num_fields, 'mysql_num_fields'); AssignProc(@mysql_num_rows, 'mysql_num_rows'); AssignProc(@mysql_ping, 'mysql_ping'); AssignProc(@mysql_options, 'mysql_options'); AssignProc(@mysql_optionsv, 'mysql_optionsv', False); AssignProc(@mysql_real_connect, 'mysql_real_connect'); AssignProc(@mysql_real_query, 'mysql_real_query'); AssignProc(@mysql_ssl_set, 'mysql_ssl_set'); AssignProc(@mysql_stat, 'mysql_stat'); AssignProc(@mysql_store_result, 'mysql_store_result'); AssignProc(@mysql_thread_id, 'mysql_thread_id'); AssignProc(@mysql_next_result, 'mysql_next_result'); AssignProc(@mysql_set_character_set, 'mysql_set_character_set'); AssignProc(@mysql_thread_init, 'mysql_thread_init'); AssignProc(@mysql_thread_end, 'mysql_thread_end'); AssignProc(@mysql_warning_count, 'mysql_warning_count'); end; procedure TPostgreSQLLib.AssignProcedures; begin AssignProc(@PQconnectdb, 'PQconnectdb'); AssignProc(@PQerrorMessage, 'PQerrorMessage'); AssignProc(@PQresultErrorMessage, 'PQresultErrorMessage'); AssignProc(@PQresultErrorField, 'PQresultErrorField'); AssignProc(@PQfinish, 'PQfinish'); AssignProc(@PQstatus, 'PQstatus'); AssignProc(@PQsendQuery, 'PQsendQuery'); AssignProc(@PQgetResult, 'PQgetResult'); AssignProc(@PQbackendPID, 'PQbackendPID'); AssignProc(@PQcmdTuples, 'PQcmdTuples'); AssignProc(@PQntuples, 'PQntuples'); AssignProc(@PQclear, 'PQclear'); AssignProc(@PQnfields, 'PQnfields'); AssignProc(@PQfname, 'PQfname'); AssignProc(@PQftype, 'PQftype'); AssignProc(@PQftable, 'PQftable'); AssignProc(@PQgetvalue, 'PQgetvalue'); AssignProc(@PQgetlength, 'PQgetlength'); AssignProc(@PQgetisnull, 'PQgetisnull'); AssignProc(@PQlibVersion, 'PQlibVersion'); end; procedure TSQLiteLib.AssignProcedures; begin AssignProc(@sqlite3_open, 'sqlite3_open'); AssignProc(@sqlite3_libversion, 'sqlite3_libversion'); AssignProc(@sqlite3_close, 'sqlite3_close'); AssignProc(@sqlite3_db_config, 'sqlite3_db_config'); AssignProc(@sqlite3_enable_load_extension, 'sqlite3_enable_load_extension'); AssignProc(@sqlite3_errmsg, 'sqlite3_errmsg'); AssignProc(@sqlite3_errcode, 'sqlite3_errcode'); AssignProc(@sqlite3_prepare_v2, 'sqlite3_prepare_v2'); AssignProc(@sqlite3_prepare_v3, 'sqlite3_prepare_v3'); AssignProc(@sqlite3_exec, 'sqlite3_exec'); AssignProc(@sqlite3_finalize, 'sqlite3_finalize'); AssignProc(@sqlite3_step, 'sqlite3_step'); AssignProc(@sqlite3_reset, 'sqlite3_reset'); AssignProc(@sqlite3_total_changes, 'sqlite3_total_changes'); AssignProc(@sqlite3_column_text, 'sqlite3_column_text'); AssignProc(@sqlite3_column_count, 'sqlite3_column_count'); AssignProc(@sqlite3_column_name, 'sqlite3_column_name'); AssignProc(@sqlite3_column_decltype, 'sqlite3_column_decltype'); AssignProc(@sqlite3_column_database_name, 'sqlite3_column_database_name'); AssignProc(@sqlite3_column_table_name, 'sqlite3_column_table_name'); AssignProc(@sqlite3_column_origin_name, 'sqlite3_column_origin_name'); AssignProc(@sqlite3_column_type, 'sqlite3_column_type'); AssignProc(@sqlite3_next_stmt, 'sqlite3_next_stmt'); AssignProc(@sqlite3_table_column_metadata, 'sqlite3_table_column_metadata'); AssignProc(@sqlite3_collation_needed, 'sqlite3_collation_needed'); AssignProc(@sqlite3_create_collation, 'sqlite3_create_collation'); end; initialization // Keywords copied from SynHighligherSQL MySQLKeywords := TStringList.Create; MySQLKeywords.CommaText := 'ACCESSIBLE,ACTION,ADD,AFTER,AGAINST,AGGREGATE,ALGORITHM,ALL,ALTER,ANALYZE,AND,ANY,AS,' + 'ASC,ASENSITIVE,AT,AUTO_INCREMENT,AVG_ROW_LENGTH,BACKUP,BEFORE,BEGIN,BENCHMARK,BETWEEN,BINLOG,BIT,' + 'BOOL,BOTH,BY,CACHE,CALL,CASCADE,CASCADED,CASE,CHANGE,CHARACTER,CHARSET,CHECK,' + 'CHECKSUM,CLIENT,COLLATE,COLLATION,COLUMN,COLUMNS,COMMENT,COMMIT,' + 'COMMITTED,COMPLETION,CONCURRENT,CONNECTION,CONSISTENT,CONSTRAINT,' + 'CONVERT,CONTAINS,CONTENTS,CREATE,CROSS,DATA,DATABASE,DATABASES,DAY_HOUR,' + 'DAY_MICROSECOND,DAY_MINUTE,DAY_SECOND,DEALLOCATE,DEC,DEFAULT,DEFINER,DELAYED,DELAY_KEY_WRITE,DELETE,DESC,' + 'DETERMINISTIC,DIRECTORY,DISABLE,DISCARD,DESCRIBE,DISTINCT,DISTINCTROW,' + 'DIV,DROP,DUAL,DUMPFILE,DUPLICATE,EACH,ELSE,ELSEIF,ENABLE,ENCLOSED,END,ENDS,' + 'ENGINE,ENGINES,ESCAPE,ESCAPED,ERRORS,EVENT,EVENTS,EVERY,EXECUTE,EXISTS,' + 'EXPANSION,EXPLAIN,FALSE,FIELDS,FILE,FIRST,FLOAT4,FLOAT8,FLUSH,FOR,FORCE,FOREIGN,FROM,' + 'FULL,FULLTEXT,FUNCTION,FUNCTIONS,GLOBAL,GRANT,GRANTS,GROUP,HAVING,HELP,' + 'HIGH_PRIORITY,HOSTS,HOUR_MICROSECOND,HOUR_MINUTE,HOUR_SECOND,IDENTIFIED,IGNORE,IGNORE_SERVER_IDS,INDEX,INFILE,INNER,INOUT,INSENSITIVE,INSERT,' + 'INSERT_METHOD,INSTALL,INT1,INT2,INT3,INT4,INT8,INTEGER,INTO,IO_THREAD,IS,' + 'ISOLATION,INVOKER,JOIN,KEY,KEYS,KILL,LAST,LEADING,LEAVES,LEVEL,LESS,' + 'LIKE,LIMIT,LINEAR,LINES,LIST,LOAD,LOCAL,LOCK,LOGS,LONG,LOW_PRIORITY,' + 'MASTER,MASTER_HOST,MASTER_HEARTBEAT_PERIOD,MASTER_LOG_FILE,MASTER_LOG_POS,MASTER_CONNECT_RETRY,' + 'MASTER_PASSWORD,MASTER_PORT,MASTER_SSL,MASTER_SSL_CA,MASTER_SSL_CAPATH,' + 'MASTER_SSL_CERT,MASTER_SSL_CIPHER,MASTER_SSL_KEY,MASTER_SSL_VERIFY_SERVER_CERT,MASTER_USER,MATCH,' + 'MAX_ROWS,MAXVALUE,MIDDLEINT,MIN_ROWS,MINUTE_MICROSECOND,MINUTE_SECOND,MOD,MODE,MODIFY,MODIFIES,NAMES,' + 'NATURAL,NEW,NO,NODEGROUP,NOT,NO_WRITE_TO_BINLOG,NULL,NUMERIC,OJ,OFFSET,OLD,ON,OPTIMIZE,OPTION,' + 'OPTIONALLY,OPEN,OR,ORDER,OUT,OUTER,OUTFILE,PACK_KEYS,PARTIAL,PARTITION,' + 'PARTITIONS,PERSISTENT,PLUGIN,PLUGINS,PRECISION,PREPARE,PRESERVE,PRIMARY,PRIVILEGES,PROCEDURE,' + 'PROCESS,PROCESSLIST,PURGE,QUERY,RAID_CHUNKS,RAID_CHUNKSIZE,RAID_TYPE,RANGE,' + 'READ,READS,READ_WRITE,REAL,REBUILD,REFERENCES,REGEXP,RELAY_LOG_FILE,RELAY_LOG_POS,RELEASE,RELOAD,' + 'RENAME,REORGANIZE,REPAIR,REPEATABLE,REPLACE,REPLICATION,REQUIRE,RESIGNAL,RESTRICT,RESET,' + 'RESTORE,RETURN,RETURNS,REVOKE,RLIKE,ROLLBACK,ROLLUP,ROUTINE,ROW,' + 'ROW_FORMAT,ROWS,SAVEPOINT,SCHEDULE,SCHEMA,SCHEMAS,SECOND_MICROSECOND,SECURITY,SELECT,' + 'SENSITIVE,SEPARATOR,SERIALIZABLE,SESSION,SET,SHARE,SHOW,SHUTDOWN,SIGNAL,SIMPLE,SLAVE,SNAPSHOT,SOME,' + 'SONAME,SPECIFIC,SQL,SQLEXCEPTION,SQLSTATE,SQLWARNING,SQL_BIG_RESULT,SQL_BUFFER_RESULT,SQL_CACHE,' + 'SQL_CALC_FOUND_ROWS,SQL_NO_CACHE,SQL_SMALL_RESULT,SPATIAL,SQL_THREAD,SSL,START,' + 'STARTING,STARTS,STATUS,STOP,STORAGE,STRAIGHT_JOIN,SUBPARTITION,' + 'SUBPARTITIONS,SUPER,TABLE,TABLES,TABLESPACE,TEMPORARY,TERMINATED,THAN,' + 'THEN,TO,TRAILING,TRANSACTION,TRIGGER,TRIGGERS,TRUE,TYPE,UNCOMMITTED,UNDO,' + 'UNINSTALL,UNIQUE,UNLOCK,UNSIGNED,UPDATE,UPGRADE,UNION,USAGE,USE,USING,VALUES,VARCHARACTER,' + 'VARIABLES,VARYING,VIEW,VIRTUAL,WARNINGS,WHEN,WHERE,WITH,WORK,WRITE,XOR,YEAR_MONTH,ZEROFILL,' // SQL Plus commands: + 'CLOSE,CONDITION,CONTINUE,CURSOR,DECLARE,DO,EXIT,FETCH,FOUND,GOTO,' + 'HANDLER,ITERATE,LANGUAGE,LEAVE,LOOP,UNTIL,WHILE'; // Error codes copied from perror.exe MySQLErrorCodes := Explode(',', '0=No error,'+ '1=Operation not permitted,'+ '2=No such file or directory,'+ '3=No such process,'+ '4=Interrupted function call,'+ '5=Input/output error,'+ '6=No such device or address,'+ '7=Arg list too long,'+ '8=Exec format error,'+ '9=Bad file descriptor,'+ '10=No child processes,'+ '11=Resource temporarily unavailable,'+ '12=Not enough space,'+ '13=Permission denied,'+ '14=Bad address,'+ '16=Resource device,'+ '17=File exists,'+ '18=Improper link,'+ '19=No such device,'+ '20=Not a directory,'+ '21=Is a directory,'+ '22=Invalid argument,'+ '23=Too many open files in system,'+ '24=Too many open files,'+ '25=Inappropriate I/O control operation,'+ '27=File too large,'+ '28=No space left on device,'+ '29=Invalid seek,'+ '30=Read-only file system,'+ '31=Too many links,'+ '32=Broken pipe,'+ '33=Domain error,'+ '34=Result too large,'+ '36=Resource deadlock avoided,'+ '38=Filename too long,'+ '39=No locks available,'+ '40=Function not implemented,'+ '41=Directory not empty,'+ '42=Illegal byte sequence,'+ '120=Didn''t find key on read or update,'+ '121=Duplicate key on write or update,'+ '123=Someone has changed the row since it was read (while the table was locked to prevent it),'+ '124=Wrong index given to function,'+ '126=Index file is crashed,'+ '127=Record-file is crashed,'+ '128=Out of memory,'+ '130=Incorrect file format,'+ '131=Command not supported by database,'+ '132=Old database file,'+ '133=No record read before update,'+ '134=Record was already deleted (or record file crashed),'+ '135=No more room in record file,'+ '136=No more room in index file,'+ '137=No more records (read after end of file),'+ '138=Unsupported extension used for table,'+ '139=Too big row,'+ '140=Wrong create options,'+ '141=Duplicate unique key or constraint on write or update,'+ '142=Unknown character set used,'+ '143=Conflicting table definitions in sub-tables of MERGE table,'+ '144=Table is crashed and last repair failed,'+ '145=Table was marked as crashed and should be repaired,'+ '146=Lock timed out; Retry transaction,'+ '147=Lock table is full; Restart program with a larger locktable,'+ '148=Updates are not allowed under a read only transactions,'+ '149=Lock deadlock; Retry transaction,'+ '150=Foreign key constraint is incorrectly formed,'+ '151=Cannot add a child row,'+ '152=Cannot delete a parent row'); end.