📄 mysqldrivers.pas
字号:
ER_TABLE_CANT_HANDLE_BLOB = 1163;
ER_TABLE_CANT_HANDLE_AUTO_INCREMENT = 1164;
ER_DELAYED_INSERT_TABLE_LOCKED = 1165;
ER_WRONG_COLUMN_NAME = 1166;
ER_WRONG_KEY_COLUMN = 1167;
ER_WRONG_MRG_TABLE = 1168;
ER_DUP_UNIQUE = 1169;
ER_BLOB_KEY_WITHOUT_LENGTH = 1170;
ER_PRIMARY_CANT_HAVE_NULL = 1171;
ER_TOO_MANY_ROWS = 1172;
ER_REQUIRES_PRIMARY_KEY = 1173;
ER_NO_RAID_COMPILED = 1174;
ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE = 1175;
ER_KEY_DOES_NOT_EXITS = 1176;
ER_CHECK_NO_SUCH_TABLE = 1177;
ER_CHECK_NOT_IMPLEMENTED= 1178;
ER_CANT_DO_THIS_DURING_AN_TRANSACTION = 1179;
ER_ERROR_DURING_COMMIT = 1180;
ER_ERROR_DURING_ROLLBACK= 1181;
ER_ERROR_DURING_FLUSH_LOGS = 1182;
ER_ERROR_DURING_CHECKPOINT = 1183;
ER_NEW_ABORTING_CONNECTION = 1184;
ER_DUMP_NOT_IMPLEMENTED = 1185;
ER_FLUSH_MASTER_BINLOG_CLOSED = 1186;
ER_INDEX_REBUILD = 1187;
ER_MASTER = 1188;
ER_MASTER_NET_READ = 1189;
ER_MASTER_NET_WRITE = 1190;
ER_FT_MATCHING_KEY_NOT_FOUND = 1191;
ER_LOCK_OR_ACTIVE_TRANSACTION = 1192;
ER_UNKNOWN_SYSTEM_VARIABLE = 1193;
ER_CRASHED_ON_USAGE = 1194;
ER_CRASHED_ON_REPAIR = 1195;
ER_WARNING_NOT_COMPLETE_ROLLBACK = 1196;
ER_TRANS_CACHE_FULL = 1197;
ER_SLAVE_MUST_STOP = 1198;
ER_SLAVE_NOT_RUNNING = 1199;
ER_BAD_SLAVE = 1200;
ER_MASTER_INFO = 1201;
ER_SLAVE_THREAD = 1202;
ER_TOO_MANY_USER_CONNECTIONS = 1203;
ER_SET_CONSTANTS_ONLY = 1204;
ER_LOCK_WAIT_TIMEOUT = 1205;
ER_LOCK_TABLE_FULL = 1206;
ER_READ_ONLY_TRANSACTION = 1207;
ER_DROP_DB_WITH_READ_LOCK = 1208;
ER_CREATE_DB_WITH_READ_LOCK = 1209;
ER_WRONG_ARGUMENTS = 1210;
ER_NO_PERMISSION_TO_CREATE_USER = 1211;
ER_UNION_TABLES_IN_DIFFERENT_DIR = 1212;
ER_LOCK_DEADLOCK = 1213;
ER_TABLE_CANT_HANDLE_FULLTEXT = 1214;
ER_CANNOT_ADD_FOREIGN = 1215;
ER_NO_REFERENCED_ROW = 1216;
ER_ROW_IS_REFERENCED = 1217;
ER_CONNECT_TO_MASTER = 1218;
ER_QUERY_ON_MASTER = 1219; ER_ERROR_WHEN_EXECUTING_COMMAND = 1220; ER_WRONG_USAGE = 1221; ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT = 1222; ER_CANT_UPDATE_WITH_READLOCK = 1223; ER_MIXING_NOT_ALLOWED = 1224; ER_DUP_ARGUMENT = 1225; ER_USER_LIMIT_REACHED = 1226; ER_SPECIFIC_ACCESS_DENIED_ERROR = 1227; ER_LOCAL_VARIABLE = 1228; ER_GLOBAL_VARIABLE = 1229; ER_NO_DEFAULT = 1230; ER_WRONG_VALUE_FOR_VAR = 1231; ER_WRONG_TYPE_FOR_VAR = 1232; ER_VAR_CANT_BE_READ = 1233; ER_CANT_USE_OPTION_HERE = 1234; ER_NOT_SUPPORTED_YET = 1235; ER_MASTER_FATAL_ERROR_READING_BINLOG = 1236; ER_SLAVE_IGNORED_TABLE = 1237; ER_INCORRECT_GLOBAL_LOCAL_VAR = 1238; ER_ERROR_MESSAGES = 239;
type
enum_field_types = FIELD_TYPE_DECIMAL..FIELD_TYPE_GEOMETRY;
TMYSQL_FIELD = packed record
name: pChar; // Name of column
org_name: pChar; // Original column name, if an alias
table: pChar; // Table of column if column was a field
org_table: pChar; // Org table name if table was an alias
db: pChar; // Database for table
catalog: pChar; // Catalog for table
def: pChar; // Default value (set by mysql_list_fields)
length: longword; // Width of column
max_length: longword; // Max width of selected set
name_length: longword;
org_name_length: longword;
table_length: longword;
org_table_length: longword;
db_length: longword;
catalog_length: longword;
def_length: longword;
flags: longword; // Div flags
decimals: longword; // Number of decimals in field
charsetnr: longword; // Character set
_type: enum_field_types; // Type of field. Se mysql_com.h for types
end;
PMYSQL_ROW = ^TMYSQL_ROW; // return data as array of strings
TMYSQL_ROW = array[0..MaxInt div SizeOf(PChar) - 1] of PChar;
PMYSQL_LENGTHS = ^TMYSQL_LENGTHS;
TMYSQL_LENGTHS = array[0..MaxInt div SizeOf(longword) - 1] of longword;
mysql_option = (
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,
// 4.1
MYSQL_OPT_PROTOCOL,
MYSQL_SHARED_MEMORY_BASE_NAME,
// 5.0
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);
TMySQLBase = class(TPersistent)
private
FConnection: pointer;
FDriverLoaded: boolean;
FClientVer: integer;
FServerVer: integer;
FReserved: string;
// Lib
mysql_init: function(mysql: pointer): pointer; {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
// Connection
mysql_options: function(mysql: pointer; option: mysql_option; const arg: PChar): longint; {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
{$IFDEF HAVE_SSL}
mysql_ssl_set: function(mysql: pointer; const key: PChar; const cert: PChar; const ca: PChar; const capath: PChar; const cipher: PChar): longint; {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
{$ENDIF}
mysql_real_connect: function(mysql: pointer; const host, user, passwd, db: PChar; port: longword; const unix_socket: PChar; clientflag: longword): pointer; {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
mysql_close: procedure(sock: pointer); {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
// Errors
mysql_errno: function(mysql: pointer): longword;{$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
mysql_error: function(mysql: pointer): PChar;{$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
// Utility
mysql_get_host_info: function(mysql: pointer): PChar; {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
mysql_get_client_info: function: PChar; {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
mysql_get_server_info: function(mysql: pointer): PChar; {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
mysql_get_proto_info: function(mysql: pointer): longword; {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
mysql_ping: function(mysql: pointer): longint; {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
mysql_thread_id: function(mysql: pointer): longword;{$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
mysql_kill: function(mysql: pointer; pid: longword): longint; {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
mysql_info: function(mysql: pointer): PChar; {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
// Databases
mysql_create_db: function(mysql: pointer; const DB: PChar): longint; {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
mysql_select_db: function(mysql: pointer; const db: PChar): longint; {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
mysql_drop_db: function(mysql: pointer; const DB: PChar): longint; {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
// Queries
mysql_real_query: function(mysql: pointer; const q: PChar; length: longword): longint; {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
mysql_use_result: function(mysql: pointer): pointer; {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
mysql_free_result: procedure(res: pointer); {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
mysql_num_fields: function(res: pointer): longword; {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
mysql_num_rows: function(res: pointer): int64; {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
// Fields
mysql_fetch_lengths: function(res: pointer): PMYSQL_LENGTHS; {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
mysql_fetch_field: function(res: pointer): pointer; {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
// Rows
mysql_fetch_row: function(res: pointer): PMYSQL_ROW; {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
// Utility
mysql_real_escape_string: function(mysql: pointer; _to: PChar; const from: PChar; length: longword): longword; {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
mysql_insert_id: function(mysql: pointer): int64;{$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
mysql_refresh: function(mysql: pointer; refresh_options: longword): longint; {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
mysql_affected_rows: function(mysql: pointer): int64;{$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
protected
FOptions: TStrings;
function GetConnection: pointer; virtual;
// Name
procedure SetOptions(Value: TStrings); virtual;
// Loading/Unloading the DLL or Drivers
procedure Load; virtual;
procedure UnLoad; virtual;
procedure BindProc(var Proc: pointer; Handle: integer; const Name: string); virtual;
procedure Bind; virtual;
public
// Instancing
constructor Create(const AOptions: string); virtual;
destructor Destroy; override;
// Errors
function ErrorNo(Conn: pointer): integer; virtual;
function ErrorMsg(Conn: pointer): string; virtual;
// Connection functions
function Open(const AHost: string='localhost'; const AUser: string='root';const APass: string='';const APort: integer=3306;const AOptions: integer=0; const ADB: string = ''): pointer; virtual;
function Info: string; virtual;
procedure Close(var Conn: pointer); virtual;
// Utility connection functions
function ClientInfo: string; virtual;
function HostInfo(Conn: pointer): string; virtual;
function ServerInfo(Conn: pointer): string; virtual;
function ProtoInfo(Conn: pointer): longword; virtual;
function Ping(Conn: pointer): boolean; virtual;
function ThreadID(Conn: pointer): longword; virtual;
procedure Kill(Conn: pointer; const PID: Cardinal); virtual;
function QueryInfo(Conn: pointer): string; virtual;
// Database functions
function CreateDatabase(Conn: pointer; const DB: string = ''): boolean; virtual;
function SelectDatabase(Conn: pointer; const DB: string = ''): boolean; virtual;
function DropDatabase(Conn: pointer; const DB: string = ''): boolean; virtual;
// Table functions
function OpenQuery(Conn: pointer; const SQL: string = ''): pointer; virtual;
procedure CloseQuery(var Res: pointer); virtual;
function RetrieveColCount(Res: pointer): longword; virtual;
function RetrieveRowCount(Res: pointer): int64; virtual;
function RetrieveField(Res: pointer): TMYSQL_FIELD; virtual;
function RetrieveRow(Res: pointer): PMYSQL_ROW; virtual;
function RetrieveRowFieldLenghts(Res: pointer): PMYSQL_LENGTHS; virtual;
// Utility functions
function EscapeStr(const Value: string): string; virtual;
function QuoteIdentifier(const Value: string = ''): boolean; virtual;
function FormatIdentifier(const Value: string = ''): string; virtual;
function IsReservedWord(const Value: string = ''): boolean; virtual;
function LastInsertID(Conn: pointer): string; virtual;
function AffectedRows(Conn: pointer): string; virtual;
function Refresh(Conn: pointer; const AOptions: integer=0): boolean; virtual;
property Connection: pointer read GetConnection;
property ClientVer: integer read FClientVer;
property ServerVer: integer read FServerVer;
property DriverLoad: boolean read FDriverLoaded;
property Options: TStrings read FOptions write FOptions;
end;
{$IFDEF MYSQLDIRECT}
TMySQLDirect = class(TMySQLBase)
protected
procedure Bind; override;
published
property Options: TStrings read FOptions write SetOptions;
end;
{$ENDIF}
TMySQLLibrary = class(TMySQLBase)
private
FClientDLL: string;
FDLLHandle: longword;
protected
function GetClientDLL: string; virtual;
procedure Load; override;
procedure UnLoad; override;
procedure Bind; override;
public
constructor Create(const AOptions: string); override;
destructor Destroy; override;
property DLLHandle: longword read FDLLHandle write FDLLHandle;
published
property ClientDLL: string read GetClientDLL write FClientDLL;
property Options: TStrings read FOptions write SetOptions;
end;
{$IFDEF MYSQLEMBEDDED}
TMySQLEmbedded = class(TMySQLLibrary)
private
mysql_server_init: function(argc: integer; argv: pointer; groups: pointer): integer; {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
mysql_server_end: procedure(); {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
protected
function GetClientDLL: string; override;
procedure Load; override;
procedure UnLoad; override;
procedure Bind; override;
published
property Options: TStrings read FOptions write SetOptions;
end;
{$ENDIF}
type
EMySQLError = class(EDatabaseError)
protected
FNo: integer;
public
constructor Create(Error: integer; Msg: string);
property Error: integer read FNo;
end;
procedure MySQLError(Int: TMySQLBase = nil; Con: pointer=nil; ErrNo: integer = -1; Msg: string = ''; IntVer: integer=-1; ClientVer: integer=-1);
implementation
uses
MySQLStrUtils {$IFDEF MYSQLDIRECT},MySQLDirect{$ENDIF};
constructor EMySQLError.Create(Error: integer; Msg: string);
begin
FNo := Error;
Message := Msg;
end;
procedure MySQLError;
var
EN: integer;
ES: string;
SVer,CVer: string;
begin
try
if Assigned(Int) then begin
CVer := Int.ClientInfo;
if Assigned(Int.Connection) then
SVer := Int.ServerInfo(Int.Connection)
else
SVer := IntToStr(IntVer);
end else begin
CVer := IntToStr(ClientVer);
SVer := IntToStr(IntVer);
end;
if Assigned(Con) then EN := Int.ErrorNo(Con)
else if Assigned(Int) and Assigned(Int.Connection) then EN := Int.ErrorNo(Int.Connection)
else EN := ErrNo;
if Assigned(Con) then ES := Int.ErrorMsg(Con)+': '+Msg
else if Assigned(Int) and Assigned(Int.Connection) then ES := Int.ErrorMsg(Int.Connection)+': '+Msg
else ES := Msg;
if (CVer<>'-1') and (SVer<>'-1') then
Msg := Format(#13#10'Client:%s'#13#10'Server:%s', [CVer, SVer])
else if (CVer>'-1') then
Msg := Format(#13#10'Client:%s', [CVer])
else
Msg := '';
if EN>-1 then Msg := Format('[%d] %s'+Msg, [EN, ES])
else Msg := Format('%s'+Msg, [ES]);
except
raise EMySQLError.Create(ErrNo,Msg);
end;
raise EMySQLError.Create(EN,Msg);
end;
constructor TMySQLBase.Create(const AOptions: string);
begin
inherited Create;
FConnection := nil;
FDriverLoaded := False;
FClientVer := 0;
FServerVer := 0;
FOptions := TStringList.Create;
FOptions.Text := AOptions;
FReserved := ',ACTION,ADD,ALL,ALTER,'
+'ANALYZE,AND,AS,'
+'ASC,ASENSITIVE,AUTO_INCREMENT,'
+'BDB,BEFORE,BERKELEYDB,'
+'BETWEEN,BIGINT,BINARY,BIT,'
+'BLOB,BOTH,BY,'
+'CALL,CASCADE,CASE,'
+'CHANGE,CHAR,CHARACTER,'
+'CHECK,COLLATE,COLUMN,'
+'COLUMNS,CONDITION,CONNECTION,'
+'CONSTRAINT,CONTINUE,CREATE,'
+'CROSS,CURRENT_DATE,CURRENT_TIME,'
+'CURRENT_TIMESTAMP,CURSOR,DATABASE,'
+'DATABASES,DATE,DAY_HOUR,DAY_MICROSECOND,'
+'DAY_MINUTE,DAY_SECOND,DEC,'
+'DECIMAL,DECLARE,DEFAULT,'
+'DELAYED,DELETE,DESC,'
+'DESCRIBE,DETERMINISTIC,DISTINCT,'
+'DISTINCTROW,DIV,DOUBLE,'
+'DROP,ELSE,ELSEIF,'
+'ENCLOSED,ENGINE,ENUM,ESCAPED,EXISTS,'
+'EXIT,EXPLAIN,FALSE,'
+'FETCH,FIELDS,FLOAT,'
+'FOR,FORCE,FOREIGN,'
+'FOUND,FRAC_SECOND,FROM,'
+'FULLTEXT,GRANT,GROUP,'
+'HAVING,HIGH_PRIORITY,HOUR_MICROSECOND,'
+'HOUR_MINUTE,HOUR_SECOND,IF,'
+'IGNORE,IN,INDEX,'
+'INFILE,INNER,INNODB,'
+'INOUT,INSENSITIVE,INSERT,'
+'INT,INTEGER,INTERVAL,'
+'INTO,IO_THREAD,IS,'
+'ITERATE,JOIN,KEY,'
+'KEYS,KILL,LEADING,'
+'LEAVE,LEFT,LIKE,'
+'LIMIT,LINES,LOAD,'
+'LOCALTIME,LOCALTIMESTAMP,LOCK,'
+'LONG,LONGBLOB,LONGTEXT,'
+'LOOP,LOW_PRIORITY,MASTER_SERVER_ID,'
+'MATCH,MEDIUMBLOB,MEDIUMINT,'
+'MEDIUMTEXT,MIDDLEINT,MINUTE_MICROSECOND,'
+'MINUTE_SECOND,MOD,NATURAL,'
+'NOT,NO,NO_WRITE_TO_BINLOG,NULL,'
+'NUMERIC,ON,OPTIMIZE,'
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -