⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mysqldrivers.pas

📁 MYSQL 连接控件 MYSQL 连接控件
💻 PAS
📖 第 1 页 / 共 4 页
字号:
  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 + -