12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448 |
- {$IFDEF MYSQL57_UP}
- {$DEFINE MYSQL56_UP}
- {$ENDIF}
- {$IFDEF MYSQL56_UP}
- {$DEFINE MYSQL55_UP}
- {$ENDIF}
- {$IFDEF MYSQL55_UP}
- {$DEFINE MYSQL51_UP}
- {$ENDIF}
- {$IFDEF MYSQL51_UP}
- {$DEFINE MYSQL50_UP}
- {$ENDIF}
- {$mode objfpc}{$H+}
- interface
- uses
- Classes, SysUtils,bufdataset,sqldb,db,ctypes,
- {$IFDEF mysql57}
- mysql57dyn;
- {$ELSE}
- {$IFDEF mysql56}
- mysql56dyn;
- {$ELSE}
- {$IFDEF mysql55}
- mysql55dyn;
- {$ELSE}
- {$IFDEF mysql51}
- mysql51dyn;
- {$ELSE}
- {$IfDef mysql50}
- mysql50dyn;
- {$ELSE}
- {$IfDef mysql41}
- mysql41dyn;
- {$ELSE}
- mysql40dyn;
- {$EndIf}
- {$EndIf}
- {$endif}
- {$endif}
- {$ENDIF}
- {$ENDIF}
- Const
- MySQLVersion =
- {$IFDEF mysql57}
- '5.7';
- {$ELSE}
- {$IFDEF mysql56}
- '5.6';
- {$ELSE}
- {$IFDEF mysql55}
- '5.5';
- {$ELSE}
- {$IFDEF mysql51}
- '5.1';
- {$else}
- {$IfDef mysql50}
- '5.0';
- {$ELSE}
- {$IfDef mysql41}
- '4.1';
- {$ELSE}
- '4.0';
- {$EndIf}
- {$EndIf}
- {$endif}
- {$endif}
- {$ENDIF}
- {$ENDIF}
- MariaDBVersion =
- {$IFDEF mysql57}
- '10.';
- {$ELSE}
- {$IFDEF mysql56} // MariaDB 10.0 is compatible with MySQL 5.6
- '10.';
- {$ELSE} // MariaDB 5.1..5.5 presumably report the same version number as MySQL
- MySQLVersion;
- {$ENDIF}
- {$ENDIF}
- Type
- TTransactionName = Class(TSQLHandle)
- protected
- end;
- { TCursorName }
- TCursorName = Class(TSQLCursor)
- protected
- FRes: PMYSQL_RES; { Record pointer }
- FStatement : String;
- Row : MYSQL_ROW;
- Lengths : pculong; { Lengths of the columns of the current row }
- RowsAffected : QWord;
- LastInsertID : QWord;
- ParamBinding : TParamBinding;
- ParamReplaceString : String;
- MapDSRowToMSQLRow : array of integer;
- end;
- { TConnectionName }
- TConnectionName = class (TSQLConnection)
- private
- FSkipLibraryVersionCheck : Boolean;
- FHostInfo: String;
- FServerInfo: String;
- FMySQL : PMySQL;
- {$IFDEF MYSQL50_UP}
- FConnectionCharsetInfo: MY_CHARSET_INFO;
- {$ENDIF}
- function GetClientInfo: string;
- function GetServerStatus: String;
- procedure ConnectMySQL(var HMySQL: PMySQL);
- procedure ExecuteDirectMySQL(const query : string);
- function EscapeString(const Str : string) : string;
- protected
- Procedure ConnectToServer; virtual;
- Procedure SelectDatabase; virtual;
- function MySQLDataType(AField: PMYSQL_FIELD; var NewType: TFieldType; var NewSize: Integer): Boolean;
- function MySQLWriteData(AField: PMYSQL_FIELD; FieldDef: TFieldDef; Source, Dest: PChar; Len: integer; out CreateBlob : boolean): Boolean;
- // SQLConnection methods
- procedure DoInternalConnect; override;
- procedure DoInternalDisconnect; override;
- function GetHandle : pointer; override;
- function GetConnectionCharSet: string; override;
- function GetAsSQLText(Param : TParam) : string; overload; override;
- Function AllocateCursorHandle : TSQLCursor; override;
- Procedure DeAllocateCursorHandle(var cursor : TSQLCursor); override;
- Function AllocateTransactionHandle : TSQLHandle; override;
- function StrToStatementType(s : string) : TStatementType; override;
- procedure PrepareStatement(cursor: TSQLCursor;ATransaction : TSQLTransaction;buf : string; AParams : TParams); override;
- procedure UnPrepareStatement(cursor:TSQLCursor); override;
- procedure FreeFldBuffers(cursor : TSQLCursor); override;
- procedure Execute(cursor: TSQLCursor;atransaction:tSQLtransaction;AParams : TParams); override;
- procedure AddFieldDefs(cursor: TSQLCursor; FieldDefs : TfieldDefs); override;
- function Fetch(cursor : TSQLCursor) : boolean; override;
- function LoadField(cursor : TSQLCursor;FieldDef : TfieldDef;buffer : pointer; out CreateBlob : boolean) : boolean; override;
- procedure LoadBlobIntoBuffer(FieldDef: TFieldDef;ABlobBuf: PBufBlobField; cursor: TSQLCursor;ATransaction : TSQLTransaction); override;
- function GetTransactionHandle(trans : TSQLHandle): pointer; override;
- function Commit(trans : TSQLHandle) : boolean; override;
- function RollBack(trans : TSQLHandle) : boolean; override;
- function StartdbTransaction(trans : TSQLHandle; AParams : string) : boolean; override;
- procedure CommitRetaining(trans : TSQLHandle); override;
- procedure RollBackRetaining(trans : TSQLHandle); override;
- function GetSchemaInfoSQL(SchemaType : TSchemaType; SchemaObjectName, SchemaPattern : string) : string; override;
- procedure UpdateIndexDefs(IndexDefs : TIndexDefs;TableName : string); override;
- function RowsAffected(cursor: TSQLCursor): TRowsCount; override;
- function RefreshLastInsertID(Query : TCustomSQLQuery; Field : TField): Boolean; override;
- Public
- constructor Create(AOwner : TComponent); override;
- {$IFNDEF MYSQL50_UP}
- procedure GetFieldNames(const TableName : string; List : TStrings); override;
- procedure GetTableNames(List : TStrings; SystemTables : Boolean = false); override;
- {$ENDIF}
- function GetConnectionInfo(InfoType:TConnInfoType): string; override;
- Function GetInsertID: int64;
- procedure CreateDB; override;
- procedure DropDB; override;
- Property ServerInfo : String Read FServerInfo;
- Property HostInfo : String Read FHostInfo;
- property ClientInfo: string read GetClientInfo;
- property ServerStatus : String read GetServerStatus;
- published
- Property SkipLibraryVersionCheck : Boolean Read FSkipLibraryVersionCheck Write FSkipLibraryVersionCheck;
- property DatabaseName;
- property HostName;
- property KeepConnection;
- property LoginPrompt;
- property Params;
- property Port stored false;
- property OnLogin;
- end;
- { TMySQLConnectionDef }
- TMySQLConnectionDef = Class(TConnectionDef)
- Class Function TypeName : String; override;
- Class Function ConnectionClass : TSQLConnectionClass; override;
- Class Function Description : String; override;
- Class Function DefaultLibraryName : String; override;
- Class Function LoadFunction : TLibraryLoadFunction; override;
- Class Function UnLoadFunction : TLibraryUnLoadFunction; override;
- Class Function LoadedLibraryName : string; override;
- end;
- {$IFDEF mysql57}
- TMySQL57Connection = Class(TConnectionName);
- TMySQL57ConnectionDef = Class(TMySQLConnectionDef);
- TMySQL57Transaction = Class(TTransactionName);
- TMySQL57Cursor = Class(TCursorName);
- {$ELSE}
- {$IFDEF mysql56}
- TMySQL56Connection = Class(TConnectionName);
- TMySQL56ConnectionDef = Class(TMySQLConnectionDef);
- TMySQL56Transaction = Class(TTransactionName);
- TMySQL56Cursor = Class(TCursorName);
- {$ELSE}
- {$ifdef mysql55}
- TMySQL55Connection = Class(TConnectionName);
- TMySQL55ConnectionDef = Class(TMySQLConnectionDef);
- TMySQL55Transaction = Class(TTransactionName);
- TMySQL55Cursor = Class(TCursorName);
- {$else}
- {$IfDef mysql51}
- TMySQL51Connection = Class(TConnectionName);
- TMySQL51ConnectionDef = Class(TMySQLConnectionDef);
- TMySQL51Transaction = Class(TTransactionName);
- TMySQL51Cursor = Class(TCursorName);
- {$ELSE}
- {$IfDef mysql50}
- TMySQL50Connection = Class(TConnectionName);
- TMySQL50ConnectionDef = Class(TMySQLConnectionDef);
- TMySQL50Transaction = Class(TTransactionName);
- TMySQL50Cursor = Class(TCursorName);
- {$ELSE}
- {$IfDef mysql41}
- TMySQL41Connection = Class(TConnectionName);
- TMySQL41ConnectionDef = Class(TMySQLConnectionDef);
- TMySQL41Transaction = Class(TTransactionName);
- TMySQL41Cursor = Class(TCursorName);
- {$ELSE}
- TMySQL40Connection = Class(TConnectionName);
- TMySQL40ConnectionDef = Class(TMySQLConnectionDef);
- TMySQL40Transaction = Class(TTransactionName);
- TMySQL40Cursor = Class(TCursorName);
- {$EndIf}
- {$endif}
- {$EndIf}
- {$ENDIF}
- {$ENDIF}
- {$ENDIF}
- implementation
- uses
- dbconst,
- StrUtils,
- DateUtils,
- FmtBCD;
- const
- Mysql_Option_Names : array[mysql_option] of string = ('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'
- {$IFDEF MYSQL50_UP}
- ,'MYSQL_REPORT_DATA_TRUNCATION', 'MYSQL_OPT_RECONNECT'
- {$IFDEF mysql51_UP}
- ,'MYSQL_OPT_SSL_VERIFY_SERVER_CERT'
- {$IFDEF mysql55_UP}
- ,'MYSQL_PLUGIN_DIR', 'MYSQL_DEFAULT_AUTH'
- {$IFDEF MYSQL56_UP}
- ,'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'
- ,'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'
- {$IFDEF MYSQL57_UP}
- ,'MYSQL_OPT_SSL_ENFORCE'
- {$ENDIF}
- {$ENDIF}
- {$ENDIF}
- {$ENDIF}
- {$ENDIF}
- );
- Resourcestring
- SErrServerConnectFailed = 'Server connect failed.';
- SErrSetCharsetFailed = 'Failed to set connection character set: %s';
- SErrDatabaseSelectFailed = 'Failed to select database: %s';
- SErrDatabaseCreate = 'Failed to create database: %s';
- SErrDatabaseDrop = 'Failed to drop database: %s';
- SErrNoData = 'No data for record';
- SErrExecuting = 'Error executing query: %s';
- SErrFetchingdata = 'Error fetching row data: %s';
- SErrGettingResult = 'Error getting result set: %s';
- SErrNoQueryResult = 'No result from query.';
- SErrVersionMismatch = '%s can not work with the installed MySQL client version: Expected (%s), got (%s).';
- SErrSettingParameter = 'Error setting parameter "%s"';
- Procedure MySQLError(R : PMySQL; Msg: String; Comp : TComponent);
- Var
- MySQLError, MySQLState : String;
- MySQLErrno: integer;
- begin
- If (R<>Nil) then
- begin
- MySQLError:=StrPas(mysql_error(R));
- MySQLErrno:=mysql_errno(R);
- MySQLState:=StrPas(mysql_sqlstate(R));
- end
- else
- begin
- MySQLError:='';
- MySQLErrno:=0;
- MySQLState:='';
- end;
- raise ESQLDatabaseError.CreateFmt(Msg, [MySQLError], Comp, MySQLErrno, MySQLState);
- end;
- function MysqlOption(const OptionName: string; out AMysql_Option: mysql_option) : boolean;
- var AMysql_Option_i: mysql_option;
- begin
- result := false;
- for AMysql_Option_i:=low(AMysql_Option) to high(AMysql_Option) do
- if sametext(Mysql_Option_Names[AMysql_Option_i],OptionName) then
- begin
- result := true;
- AMysql_Option:=AMysql_Option_i;
- break;
- end;
- end;
- { TConnectionName }
- function TConnectionName.StrToStatementType(s : string) : TStatementType;
- begin
- s:=Lowercase(s);
- if (s='analyze') or (s='check') or (s='checksum') or (s='optimize') or (s='repair') or (s='show') then
- exit(stSelect)
- else if s='call' then
- exit(stExecProcedure)
- else
- Result := inherited StrToStatementType(s);
- end;
- function TConnectionName.GetClientInfo: string;
- begin
- // To make it possible to call this if there's no connection yet
- InitialiseMysql;
- Try
- Result:=strpas(mysql_get_client_info());
- Finally
- ReleaseMysql;
- end;
- end;
- function TConnectionName.GetServerStatus: String;
- begin
- CheckConnected;
- Result := mysql_stat(FMYSQL);
- end;
- Function TConnectionName.GetInsertID: int64;
- begin
- CheckConnected;
- Result:=mysql_insert_id(GetHandle);
- end;
- procedure TConnectionName.ConnectMySQL(var HMySQL: PMySQL);
- Var
- APort : Cardinal;
- i,e: integer;
- AMysql_Option: mysql_option;
- OptStr: string;
- OptInt: cuint;
- Opt: pointer;
- begin
- HMySQL := mysql_init(HMySQL);
- APort:=Abs(StrToIntDef(Params.Values['Port'],0));
- for i := 0 to Params.Count-1 do
- begin
- if MysqlOption(Params.Names[i],AMysql_Option) then
- begin
- OptStr:=Params.ValueFromIndex[i];
- val(OptStr,OptInt,e);
- if e=0 then
- Opt := @OptInt
- else
- Opt := pchar(OptStr);
- if mysql_options(HMySQL,AMysql_Option,Opt) <> 0 then
- MySQLError(HMySQL,Format(SErrSettingParameter,[Params.Names[i]]),Self);
- end;
- end;
- if mysql_real_connect(HMySQL,PChar(HostName),PChar(UserName),PChar(Password),Nil,APort,Nil,CLIENT_MULTI_RESULTS) = nil then //CLIENT_MULTI_RESULTS is required by CALL SQL statement(executes stored procedure), that produces result sets
- MySQLError(HMySQL,SErrServerConnectFailed,Self);
- if (trim(CharSet) <> '') then
- // major_version*10000 + minor_version *100 + sub_version
- if (50007 <= mysql_get_server_version(HMySQL)) then
- begin
- // Only available for MySQL 5.0.7 and later...
- if mysql_set_character_set(HMySQL, PChar(CharSet)) <> 0 then
- MySQLError(HMySQL,SErrSetCharsetFailed,Self);
- end
- else
- if mysql_query(HMySQL,PChar('SET NAMES ''' + EscapeString(CharSet) +'''')) <> 0 then
- MySQLError(HMySQL,SErrExecuting,Self);
- end;
- function TConnectionName.GetAsSQLText(Param: TParam) : string;
- begin
- if (not assigned(Param)) or Param.IsNull then
- Result := 'Null'
- else if Param.DataType in [ftString,ftFixedChar,ftMemo] then
- Result := '''' + EscapeString(GetAsString(Param)) + ''''
- else if Param.DataType in [ftBlob,ftBytes,ftVarBytes] then
- Result := '''' + EscapeString(Param.AsString) + ''''
- else
- Result := inherited GetAsSQLText(Param);
- end;
- Procedure TConnectionName.ConnectToServer;
- begin
- ConnectMySQL(FMySQL);
- FServerInfo := strpas(mysql_get_server_info(FMYSQL));
- FHostInfo := strpas(mysql_get_host_info(FMYSQL));
- {$IFDEF MYSQL50_UP}
- mysql_get_character_set_info(FMYSQL, @FConnectionCharsetInfo);
- {$ENDIF}
- end;
- Procedure TConnectionName.SelectDatabase;
- begin
- if mysql_select_db(FMySQL,pchar(DatabaseName))<>0 then
- MySQLError(FMySQL,SErrDatabaseSelectFailed,Self);
- end;
- procedure TConnectionName.CreateDB;
- begin
- ExecuteDirectMySQL('CREATE DATABASE ' +DatabaseName);
- end;
- procedure TConnectionName.DropDB;
- begin
- ExecuteDirectMySQL('DROP DATABASE ' +DatabaseName);
- end;
- procedure TConnectionName.ExecuteDirectMySQL(const query : string);
- var AMySQL : PMySQL;
- begin
- CheckDisConnected;
- InitialiseMysql;
- try
- AMySQL := nil;
- ConnectMySQL(AMySQL);
- try
- if mysql_query(AMySQL,pchar(query))<>0 then
- MySQLError(AMySQL,SErrExecuting,Self);
- finally
- mysql_close(AMySQL);
- end;
- finally
- ReleaseMysql;
- end;
- end;
- function TConnectionName.EscapeString(const Str: string): string;
- var Len : integer;
- begin
- SetLength(result,length(str)*2+1);
- Len := mysql_real_escape_string(FMySQL,pchar(Result),pchar(Str),length(Str));
- SetLength(result,Len);
- end;
- procedure TConnectionName.DoInternalConnect;
- var
- FullVersion: string;
- begin
- InitialiseMysql;
- if not SkipLibraryVersionCheck then
- begin
- FullVersion:=strpas(mysql_get_client_info());
- // Version string should start with version number:
- // Note: in case of MariaDB version mismatch: tough luck, we report MySQL
- // version only.
- if (pos(MySQLVersion, FullVersion) <> 1) and
- (pos(MariaDBVersion, FullVersion) <> 1) then
- Raise EInOutError.CreateFmt(SErrVersionMisMatch,[ClassName,MySQLVersion,FullVersion]);
- end;
- inherited DoInternalConnect;
- ConnectToServer;
- SelectDatabase;
- end;
- procedure TConnectionName.DoInternalDisconnect;
- begin
- inherited DoInternalDisconnect;
- mysql_close(FMySQL);
- FMySQL:=Nil;
- ReleaseMysql;
- end;
- function TConnectionName.GetHandle: pointer;
- begin
- Result:=FMySQL;
- end;
- function TConnectionName.GetConnectionCharSet: string;
- begin
- Result:=StrPas(mysql_character_set_name(FMySQL));
- end;
- Function TConnectionName.AllocateCursorHandle: TSQLCursor;
- begin
- {$IFDEF mysql57}
- Result:=TMySQL57Cursor.Create;
- {$ELSE}
- {$IFDEF mysql56}
- Result:=TMySQL56Cursor.Create;
- {$ELSE}
- {$IfDef mysql55}
- Result:=TMySQL55Cursor.Create;
- {$ELSE}
- {$IfDef mysql51}
- Result:=TMySQL51Cursor.Create;
- {$ELSE}
- {$IfDef mysql50}
- Result:=TMySQL50Cursor.Create;
- {$ELSE}
- {$IfDef mysql41}
- Result:=TMySQL41Cursor.Create;
- {$ELSE}
- Result:=TMySQL40Cursor.Create;
- {$EndIf}
- {$EndIf}
- {$EndIf}
- {$EndIf}
- {$ENDIF}
- {$ENDIF}
- end;
- Procedure TConnectionName.DeAllocateCursorHandle(var cursor : TSQLCursor);
- begin
- FreeAndNil(cursor);
- end;
- Function TConnectionName.AllocateTransactionHandle: TSQLHandle;
- begin
- // Result:=TTransactionName.Create;
- Result := nil;
- end;
- procedure TConnectionName.PrepareStatement(cursor: TSQLCursor;
- ATransaction: TSQLTransaction; buf: string;AParams : TParams);
- begin
- // if assigned(AParams) and (AParams.count > 0) then
- // DatabaseError('Parameters (not) yet supported for the MySQL SqlDB connection.',self);
- With Cursor as TCursorName do
- begin
- FStatement:=Buf;
- if assigned(AParams) and (AParams.count > 0) then
- FStatement := AParams.ParseSQL(FStatement,false,sqEscapeSlash in ConnOptions, sqEscapeRepeat in ConnOptions,psSimulated,paramBinding,ParamReplaceString);
- end
- end;
- procedure TConnectionName.UnPrepareStatement(cursor: TSQLCursor);
- Var
- C : TCursorName;
- begin
- C:=Cursor as TCursorName;
- if assigned(C.FRes) then //ExecSQL with dataset returned
- begin
- mysql_free_result(C.FRes);
- C.FRes:=nil;
- end;
- end;
- procedure TConnectionName.FreeFldBuffers(cursor: TSQLCursor);
- Var
- C : TCursorName;
- begin
- C:=Cursor as TCursorName;
- if assigned(C.FRes) then
- begin
- mysql_free_result(C.FRes);
- C.FRes:=Nil;
- end;
- SetLength(c.MapDSRowToMSQLRow,0);
- inherited;
- end;
- procedure TConnectionName.Execute(cursor: TSQLCursor;
- atransaction: tSQLtransaction;AParams : TParams);
- Var
- C : TCursorName;
- i : integer;
- ParamNames,ParamValues : array of string;
- Res: PMYSQL_RES;
- Status : Integer;
- begin
- C:=Cursor as TCursorName;
- If (C.FRes=Nil) then
- begin
- if Assigned(AParams) and (AParams.count > 0) then
- begin
- setlength(ParamNames,AParams.Count);
- setlength(ParamValues,AParams.Count);
- for i := 0 to AParams.count -1 do
- begin
- ParamNames[AParams.count-i-1] := C.ParamReplaceString+inttostr(AParams[i].Index+1);
- ParamValues[AParams.count-i-1] := GetAsSQLText(AParams[i]);
- end;
- // paramreplacestring kan een probleem geven bij postgres als hij niet meer gewoon $ is?
- C.FStatement := stringsreplace(C.FStatement,ParamNames,ParamValues,[rfReplaceAll]);
- end;
- if LogEvent(detParamValue) then
- LogParams(AParams);
- if LogEvent(detExecute) then
- Log(detExecute, C.FStatement);
- if LogEvent(detActualSQL) then
- Log(detActualSQL,C.FStatement);
- if mysql_query(FMySQL,Pchar(C.FStatement))<>0 then
- begin
- if not ForcedClose then
- MySQLError(FMYSQL,SErrExecuting,Self)
- else //don't return a resulset. We are shutting down, not opening.
- begin
- C.RowsAffected:=0;
- C.FSelectable:= False;
- C.FRes:=nil;
- end;
- end
- else
- begin
- C.RowsAffected := mysql_affected_rows(FMYSQL);
- C.LastInsertID := mysql_insert_id(FMYSQL);
- C.FSelectable := False;
- repeat
- Res:=mysql_store_result(FMySQL); //returns a null pointer also if the statement didn't return a result set
- if mysql_errno(FMySQL)<>0 then
- begin
- if not ForcedClose then
- MySQLError(FMySQL, SErrGettingResult, Self)
- else
- begin
- C.RowsAffected:=0;
- C.FSelectable:= False;
- C.FRes:=nil;
- break;
- end;
- end;
- if Res<>nil then
- begin
- mysql_free_result(C.FRes);
- C.FRes:=Res;
- C.FSelectable:=True;
- end;
- Status:=mysql_next_result(FMySQL);
- if (Status>0) then
- begin
- if not ForcedClose then
- MySQLError(FMySQL, SErrGettingResult, Self)
- else
- begin
- C.RowsAffected:=0;
- C.FSelectable:= False;
- C.FRes:=nil;
- break;
- end;
- end;
- until (Status<>0);
- end;
- end;
- end;
- function TConnectionName.MySQLDataType(AField: PMYSQL_FIELD; var NewType: TFieldType; var NewSize: Integer): Boolean;
- var ASize, ADecimals: integer;
- begin
- Result := True;
- ASize := AField^.length;
- NewSize := 0;
- case AField^.ftype of
- FIELD_TYPE_LONGLONG:
- begin
- NewType := ftLargeint;
- end;
- FIELD_TYPE_TINY, FIELD_TYPE_SHORT, FIELD_TYPE_YEAR:
- begin
- if AField^.flags and UNSIGNED_FLAG <> 0 then
- NewType := ftWord
- else
- NewType := ftSmallint;
- end;
- FIELD_TYPE_LONG, FIELD_TYPE_INT24:
- begin
- if AField^.flags and AUTO_INCREMENT_FLAG <> 0 then
- NewType := ftAutoInc
- else
- NewType := ftInteger;
- end;
- {$ifdef mysql50_up}
- FIELD_TYPE_NEWDECIMAL,
- {$endif}
- FIELD_TYPE_DECIMAL:
- begin
- ADecimals:=AField^.decimals;
- if (ADecimals < 5) and (ASize-2-ADecimals < 15) then //ASize is display size i.e. with sign and decimal point
- NewType := ftBCD
- else if (ADecimals = 0) and (ASize < 20) then
- NewType := ftLargeInt
- else
- NewType := ftFmtBCD;
- NewSize := ADecimals;
- end;
- FIELD_TYPE_FLOAT, FIELD_TYPE_DOUBLE:
- begin
- NewType := ftFloat;
- end;
- FIELD_TYPE_TIMESTAMP, FIELD_TYPE_DATETIME:
- begin
- NewType := ftDateTime;
- end;
- FIELD_TYPE_DATE:
- begin
- NewType := ftDate;
- end;
- FIELD_TYPE_TIME:
- begin
- NewType := ftTime;
- end;
- FIELD_TYPE_VAR_STRING, FIELD_TYPE_STRING, FIELD_TYPE_ENUM, FIELD_TYPE_SET:
- begin
- // Since mysql server version 5.0.3 string-fields with a length of more
- // then 256 characters are suported
- if AField^.ftype = FIELD_TYPE_STRING then
- NewType := ftFixedChar
- else
- NewType := ftString;
- {$IFDEF MYSQL50_UP}
- if AField^.charsetnr = 63 then begin //BINARY vs. CHAR, VARBINARY vs. VARCHAR
- if NewType = ftFixedChar then
- NewType := ftBytes
- else
- NewType := ftVarBytes;
- NewSize := ASize;
- end
- else
- NewSize := ASize div FConnectionCharsetInfo.mbmaxlen;
- {$ELSE}
- NewSize := ASize;
- {$ENDIF}
- end;
- FIELD_TYPE_TINY_BLOB..FIELD_TYPE_BLOB:
- begin
- {$IFDEF MYSQL50_UP}
- if AField^.charsetnr = 63 then //character set is binary
- NewType := ftBlob
- else
- NewType := ftMemo;
- {$ELSE}
- NewType := ftBlob;
- {$ENDIF}
- end;
- {$IFDEF MYSQL50_UP}
- FIELD_TYPE_BIT:
- NewType := ftLargeInt;
- {$ENDIF}
- else
- Result := False;
- end;
- end;
- procedure TConnectionName.AddFieldDefs(cursor: TSQLCursor;
- FieldDefs: TfieldDefs);
- var
- C : TCursorName;
- I, FC: Integer;
- field: PMYSQL_FIELD;
- DFT: TFieldType;
- DFS: Integer;
- begin
- // Writeln('MySQL: Adding fielddefs');
- C:=(Cursor as TCursorName);
- If (C.FRes=Nil) then
- begin
- // Writeln('res is nil');
- MySQLError(FMySQL,SErrNoQueryResult,Self);
- end;
- // Writeln('MySQL: have result');
- FC:=mysql_num_fields(C.FRes);
- SetLength(c.MapDSRowToMSQLRow,FC);
- For I := 0 to FC-1 do
- begin
- field := mysql_fetch_field_direct(C.FRES, I);
- // Writeln('MySQL: creating fielddef ',I+1);
- if MySQLDataType(field, DFT, DFS) then
- begin
- AddFieldDef(FieldDefs, I+1, field^.name, DFT, DFS, -1,
- False,
- (field^.flags and (AUTO_INCREMENT_FLAG or NOT_NULL_FLAG {$IFDEF MYSQL50_UP}or NO_DEFAULT_VALUE_FLAG{$ENDIF})) = (NOT_NULL_FLAG {$IFDEF MYSQL50_UP}or NO_DEFAULT_VALUE_FLAG{$ENDIF}),
- False);
- c.MapDSRowToMSQLRow[I] := I;
- end
- end;
- // Writeln('MySQL: Finished adding fielddefs');
- end;
- function TConnectionName.Fetch(cursor: TSQLCursor): boolean;
- Var
- C : TCursorName;
- begin
- C:=Cursor as TCursorName;
- C.Row:=MySQL_Fetch_row(C.FRes);
- Result:=(C.Row<>Nil);
- if Result then
- C.Lengths := mysql_fetch_lengths(C.FRes)
- else
- C.Lengths := nil;
- end;
- function TConnectionName.LoadField(cursor : TSQLCursor;
- FieldDef : TfieldDef;buffer : pointer; out CreateBlob : boolean) : boolean;
- var
- field: PMYSQL_FIELD;
- C : TCursorName;
- i : integer;
- begin
- // Writeln('LoadFieldsFromBuffer');
- C:=Cursor as TCursorName;
- if (C.Row=nil) or (C.Lengths=nil) then
- begin
- // Writeln('LoadFieldsFromBuffer: row=nil');
- MySQLError(FMySQL,SErrFetchingData,Self);
- end;
- i := c.MapDSRowToMSQLRow[FieldDef.FieldNo-1];
- field := mysql_fetch_field_direct(C.FRES, i);
- Result := MySQLWriteData(field, FieldDef, C.Row[i], Buffer, C.Lengths[i], CreateBlob);
- end;
- procedure TConnectionName.LoadBlobIntoBuffer(FieldDef: TFieldDef;
- ABlobBuf: PBufBlobField; cursor: TSQLCursor; ATransaction: TSQLTransaction);
- var
- C : TCursorName;
- i : integer;
- len : longint;
- begin
- C:=Cursor as TCursorName;
- if (C.Row=nil) or (C.Lengths=nil) then
- MySQLError(FMySQL,SErrFetchingData,Self);
- i := c.MapDSRowToMSQLRow[FieldDef.FieldNo-1];
- len := C.Lengths[i];
- ReAllocMem(ABlobBuf^.BlobBuffer^.Buffer, len);
- Move(C.Row[i]^, ABlobBuf^.BlobBuffer^.Buffer^, len);
- ABlobBuf^.BlobBuffer^.Size := len;
- end;
- function InternalStrToInt(const S: string): integer;
- begin
- if S = '' then
- Result := 0
- else
- Result := StrToInt(S);
- end;
- function InternalStrToFloat(const S: string): Extended;
- var
- I: Integer;
- Tmp: string;
- begin
- Tmp := '';
- for I := 1 to Length(S) do
- begin
- if not (S[I] in ['0'..'9', '+', '-', 'E', 'e']) then
- Tmp := Tmp + FormatSettings.DecimalSeparator
- else
- Tmp := Tmp + S[I];
- end;
- Result := StrToFloat(Tmp);
- end;
- function InternalStrToCurrency(const S: string): Currency;
- var
- I: Integer;
- Tmp: string;
- begin
- Tmp := '';
- for I := 1 to Length(S) do
- begin
- if not (S[I] in ['0'..'9', '+', '-', 'E', 'e']) then
- Tmp := Tmp + FormatSettings.DecimalSeparator
- else
- Tmp := Tmp + S[I];
- end;
- Result := StrToCurr(Tmp);
- end;
- function InternalStrToDate(const S: string): TDateTime;
- var
- EY, EM, ED: Word;
- begin
- EY := StrToInt(Copy(S,1,4));
- EM := StrToInt(Copy(S,6,2));
- ED := StrToInt(Copy(S,9,2));
- if (EY = 0) or (EM = 0) or (ED = 0) then
- Result:=0
- else
- Result:=EncodeDate(EY, EM, ED);
- end;
- function StrToMSecs(const S: string): Word;
- var C: char;
- d, MSecs: double;
- begin
- {$IFDEF MYSQL56_UP}
- // datetime(n), where n is fractional seconds precision (between 0 and 6)
- MSecs := 0;
- d := 100;
- for C in S do
- begin
- MSecs := MSecs + (ord(C)-ord('0'))*d;
- d := d / 10;
- end;
- Result := Round(MSecs);
- {$ELSE}
- Result := 0;
- {$ENDIF}
- end;
- function InternalStrToDateTime(const S: string): TDateTime;
- var
- EY, EM, ED: Word;
- EH, EN, ES, EMS: Word;
- begin
- EY := StrToInt(Copy(S, 1, 4));
- EM := StrToInt(Copy(S, 6, 2));
- ED := StrToInt(Copy(S, 9, 2));
- EH := StrToInt(Copy(S, 12, 2));
- EN := StrToInt(Copy(S, 15, 2));
- ES := StrToInt(Copy(S, 18, 2));
- EMS:= StrToMSecs(Copy(S, 21, 6));
- if (EY = 0) or (EM = 0) or (ED = 0) then
- Result := 0
- else
- Result := EncodeDate(EY, EM, ED);
- Result := ComposeDateTime(Result, EncodeTime(EH, EN, ES, EMS));
- end;
- function InternalStrToTime(const S: string): TDateTime;
- var
- EH, EM, ES, EMS: Word;
- p: integer;
- begin
- p := 1;
- EH := StrToInt(ExtractSubstr(S, p, [':'])); //hours can be 2 or 3 digits
- EM := StrToInt(ExtractSubstr(S, p, [':']));
- ES := StrToInt(ExtractSubstr(S, p, ['.']));
- EMS:= StrToMSecs(Copy(S, p, 6));
- Result := EncodeTimeInterval(EH, EM, ES, EMS);
- end;
- function InternalStrToTimeStamp(const S: string): TDateTime;
- var
- EY, EM, ED: Word;
- EH, EN, ES, EMS: Word;
- begin
- {$IFNDEF mysql40}
- EY := StrToInt(Copy(S, 1, 4));
- EM := StrToInt(Copy(S, 6, 2));
- ED := StrToInt(Copy(S, 9, 2));
- EH := StrToInt(Copy(S, 12, 2));
- EN := StrToInt(Copy(S, 15, 2));
- ES := StrToInt(Copy(S, 18, 2));
- EMS:= StrToMSecs(Copy(S, 21, 6));
- {$ELSE}
- EY := StrToInt(Copy(S, 1, 4));
- EM := StrToInt(Copy(S, 5, 2));
- ED := StrToInt(Copy(S, 7, 2));
- EH := StrToInt(Copy(S, 9, 2));
- EN := StrToInt(Copy(S, 11, 2));
- ES := StrToInt(Copy(S, 13, 2));
- EMS:= 0;
- {$ENDIF}
- if (EY = 0) or (EM = 0) or (ED = 0) then
- Result := 0
- else
- Result := EncodeDate(EY, EM, ED);
- Result := Result + EncodeTime(EH, EN, ES, EMS);
- end;
- function TConnectionName.MySQLWriteData(AField: PMYSQL_FIELD; FieldDef: TFieldDef; Source, Dest: PChar; Len: integer; out CreateBlob : boolean): Boolean;
- var
- VI: Integer;
- VL: LargeInt;
- VS: Smallint;
- VW: Word;
- VF: Double;
- VC: Currency;
- VD: TDateTime;
- VB: TBCD;
- Src : String;
- begin
- Result := False;
- CreateBlob := False;
- if Source = Nil then // If the pointer is NULL, the field is NULL
- exit;
- SetString(Src, Source, Len);
- case FieldDef.DataType of
- ftSmallint:
- begin
- VS := InternalStrToInt(Src);
- Move(VS, Dest^, SizeOf(Smallint));
- end;
- ftWord:
- begin
- VW := InternalStrToInt(Src);
- Move(VW, Dest^, SizeOf(Word));
- end;
- ftInteger, ftAutoInc:
- begin
- VI := InternalStrToInt(Src);
- Move(VI, Dest^, SizeOf(Integer));
- end;
- ftLargeInt:
- begin
- {$IFDEF MYSQL50_UP}
- if AField^.ftype = FIELD_TYPE_BIT then
- begin
- VL := 0;
- for VI := 0 to Len-1 do
- VL := VL * 256 + PByte(Source+VI)^;
- end
- else
- {$ENDIF}
- if Src <> '' then
- VL := StrToInt64(Src)
- else
- VL := 0;
- Move(VL, Dest^, SizeOf(LargeInt));
- end;
- ftFloat:
- begin
- if Src <> '' then
- VF := InternalStrToFloat(Src)
- else
- VF := 0;
- Move(VF, Dest^, SizeOf(Double));
- end;
- ftBCD:
- begin
- VC := InternalStrToCurrency(Src);
- Move(VC, Dest^, SizeOf(Currency));
- end;
- ftFmtBCD:
- begin
- VB := StrToBCD(Src, FSQLFormatSettings);
- Move(VB, Dest^, SizeOf(TBCD));
- end;
- ftDate:
- begin
- if Src <> '' then
- VD := InternalStrToDate(Src)
- else
- VD := 0;
- Move(VD, Dest^, SizeOf(TDateTime));
- end;
- ftTime:
- begin
- if Src <> '' then
- VD := InternalStrToTime(Src)
- else
- VD := 0;
- Move(VD, Dest^, SizeOf(TDateTime));
- end;
- ftDateTime:
- begin
- if Src <> '' then
- if AField^.ftype = FIELD_TYPE_TIMESTAMP then
- VD := InternalStrToTimeStamp(Src)
- else
- VD := InternalStrToDateTime(Src)
- else
- VD := 0;
- Move(VD, Dest^, SizeOf(TDateTime));
- end;
- ftString, ftFixedChar:
- // String-fields which can contain more then dsMaxStringSize characters
- // are mapped to ftBlob fields, while their mysql-datatype is FIELD_TYPE_BLOB
- begin
- if Len > FieldDef.Size*FieldDef.CharSize then Len := FieldDef.Size*FieldDef.CharSize;
- Move(Source^, Dest^, Len);
- (Dest+Len)^ := #0;
- end;
- ftVarBytes:
- begin
- if Len > FieldDef.Size then Len := FieldDef.Size;
- PWord(Dest)^ := Len;
- Move(Source^, (Dest+sizeof(Word))^, Len);
- end;
- ftBytes:
- begin
- if Len > FieldDef.Size then Len := FieldDef.Size;
- Move(Source^, Dest^, Len);
- end;
- ftBlob, ftMemo:
- CreateBlob := True;
- end;
- Result := True;
- end;
- procedure TConnectionName.UpdateIndexDefs(IndexDefs : TIndexDefs;TableName : string);
- var qry : TSQLQuery;
- begin
- if not assigned(Transaction) then
- DatabaseError(SErrConnTransactionnSet);
- qry := TSQLQuery.Create(nil);
- qry.Transaction := Transaction;
- qry.Database := Self;
- try
- with qry do
- begin
- ParseSQL := False;
- SQL.Clear;
- SQL.Add('show index from ' + TableName);
- Open;
- end;
- while not qry.Eof do with IndexDefs.AddIndexDef do
- begin
- Name := trim(qry.FieldByName('Key_name').AsString);
- Fields := trim(qry.FieldByName('Column_name').AsString);
- If Name = 'PRIMARY' then Options := Options + [ixPrimary];
- If qry.FieldByName('Non_unique').AsInteger = 0 then Options := Options + [ixUnique];
- qry.Next;
- while (Name = trim(qry.FieldByName('Key_name').AsString)) and (not qry.Eof) do
- begin
- Fields := Fields + ';' + trim(qry.FieldByName('Column_name').AsString);
- qry.Next;
- end;
- end;
- qry.Close;
- finally
- qry.Free;
- end;
- end;
- function TConnectionName.RowsAffected(cursor: TSQLCursor): TRowsCount;
- begin
- if assigned(cursor) then
- // Compile this without range-checking. RowsAffected can be -1, although
- // it's an unsigned integer. (small joke from the mysql-guys)
- // Without range-checking this goes ok. If Range is turned on, this results
- // in range-check errors.
- Result := (cursor as TCursorName).RowsAffected
- else
- Result := -1;
- end;
- function TConnectionName.RefreshLastInsertID(Query: TCustomSQLQuery; Field: TField): Boolean;
- begin
- Field.AsLargeInt:=GetInsertID;
- Result := True;
- end;
- constructor TConnectionName.Create(AOwner: TComponent);
- const SingleBackQoutes: TQuoteChars = ('`','`');
- begin
- inherited Create(AOwner);
- FConnOptions := [sqEscapeRepeat, sqEscapeSlash, sqImplicitTransaction, sqLastInsertID];
- FieldNameQuoteChars:=SingleBackQoutes;
- FMySQL := Nil;
- end;
- {$IFNDEF MYSQL50_UP}
- procedure TConnectionName.GetFieldNames(const TableName: string; List: TStrings);
- begin
- GetDBInfo(stColumns,TableName,'field',List);
- end;
- procedure TConnectionName.GetTableNames(List: TStrings; SystemTables: Boolean);
- begin
- GetDBInfo(stTables,'','tables_in_'+DatabaseName,List)
- end;
- {$ENDIF}
- function TConnectionName.GetConnectionInfo(InfoType: TConnInfoType): string;
- begin
- Result:='';
- try
- InitialiseMysql;
- case InfoType of
- citServerType:
- Result:='MySQL';
- citServerVersion:
- if Connected then
- Result:=format('%6.6d', [mysql_get_server_version(FMySQL)]);
- citServerVersionString:
- if Connected then
- Result:=mysql_get_server_info(FMySQL);
- citClientVersion:
- Result:=format('%6.6d', [mysql_get_client_version()]);
- citClientName:
- Result:=TMySQLConnectionDef.LoadedLibraryName;
- else
- Result:=inherited GetConnectionInfo(InfoType);
- end;
- finally
- ReleaseMysql;
- end;
- end;
- function TConnectionName.GetTransactionHandle(trans: TSQLHandle): pointer;
- begin
- Result:=Nil;
- end;
- function TConnectionName.Commit(trans: TSQLHandle): boolean;
- begin
- //mysql_commit(FMySQL);
- Result := (mysql_query(FMySQL, 'COMMIT') = 0) or ForcedClose;
- if not Result then
- MySQLError(FMySQL, SErrExecuting, Self);
- end;
- function TConnectionName.RollBack(trans: TSQLHandle): boolean;
- begin
- //mysql_rollback(FMySQL);
- Result := (mysql_query(FMySQL, 'ROLLBACK') = 0) or ForcedClose;
- if not Result then
- MySQLError(FMySQL, SErrExecuting, Self);
- end;
- function TConnectionName.StartdbTransaction(trans: TSQLHandle; AParams : string): boolean;
- begin
- Result := mysql_query(FMySQL, 'START TRANSACTION') = 0;
- if not Result then
- MySQLError(FMySQL, SErrExecuting, Self);
- end;
- procedure TConnectionName.CommitRetaining(trans: TSQLHandle);
- begin
- {$IFDEF MYSQL50_UP}
- if mysql_query(FMySQL, 'COMMIT AND CHAIN') <> 0 then
- MySQLError(FMySQL, SErrExecuting, Self);
- {$ELSE}
- if mysql_query(FMySQL, 'COMMIT') <> 0 then
- MySQLError(FMySQL, SErrExecuting, Self);
- if mysql_query(FMySQL, 'START TRANSACTION') <> 0 then
- MySQLError(FMySQL, SErrExecuting, Self);
- {$ENDIF}
- end;
- procedure TConnectionName.RollBackRetaining(trans: TSQLHandle);
- begin
- {$IFDEF MYSQL50_UP}
- if mysql_query(FMySQL, 'ROLLBACK AND CHAIN') <> 0 then
- MySQLError(FMySQL, SErrExecuting, Self);
- {$ELSE}
- if mysql_query(FMySQL, 'ROLLBACK') <> 0 then
- MySQLError(FMySQL, SErrExecuting, Self);
- if mysql_query(FMySQL, 'START TRANSACTION') <> 0 then
- MySQLError(FMySQL, SErrExecuting, Self);
- {$ENDIF}
- end;
- function TConnectionName.GetSchemaInfoSQL(SchemaType: TSchemaType;
- SchemaObjectName, SchemaPattern: string): string;
- begin
- case SchemaType of
- {$IFDEF MYSQL50_UP}
- stTables : result := 'SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=SCHEMA() AND TABLE_TYPE IN (''BASE TABLE'',''VIEW'')';
- stColumns : result := 'SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=SCHEMA() AND TABLE_NAME='+QuotedStr(SchemaObjectName);
- {$ELSE}
- stTables : result := 'show tables';
- stColumns : result := 'show columns from ' + EscapeString(SchemaObjectName);
- {$ENDIF}
- else
- result := inherited;
- end; {case}
- end;
- { TMySQLConnectionDef }
- class function TMySQLConnectionDef.TypeName: String;
- begin
- Result:='MySQL '+MySQLVersion;
- end;
- class function TMySQLConnectionDef.ConnectionClass: TSQLConnectionClass;
- begin
- {$IFDEF mysql57}
- Result:=TMySQL57Connection;
- {$ELSE}
- {$IFDEF mysql56}
- Result:=TMySQL56Connection;
- {$ELSE}
- {$IfDef mysql55}
- Result:=TMySQL55Connection;
- {$ELSE}
- {$IfDef mysql51}
- Result:=TMySQL51Connection;
- {$ELSE}
- {$IfDef mysql50}
- Result:=TMySQL50Connection;
- {$ELSE}
- {$IfDef mysql41}
- Result:=TMySQL41Connection;
- {$ELSE}
- Result:=TMySQL40Connection;
- {$EndIf}
- {$EndIf}
- {$endif}
- {$endif}
- {$ENDIF}
- {$ENDIF}
- end;
- class function TMySQLConnectionDef.Description: String;
- begin
- Result:='Connect to a MySQL '+MySQLVersion+' database directly via the client library';
- end;
- class function TMySQLConnectionDef.DefaultLibraryName: String;
- begin
- Result:=mysqlvlib;
- end;
- class function TMySQLConnectionDef.LoadFunction: TLibraryLoadFunction;
- begin
- Result:=@InitialiseMySQL;
- end;
- class function TMySQLConnectionDef.UnLoadFunction: TLibraryUnLoadFunction;
- begin
- Result:=@ReleaseMySQL;
- end;
- class function TMySQLConnectionDef.LoadedLibraryName: string;
- begin
- Result:=MysqlLoadedLibrary;
- end;
- {$IFDEF mysql57}
- initialization
- RegisterConnection(TMySQL57ConnectionDef);
- finalization
- UnRegisterConnection(TMySQL57ConnectionDef);
- {$ELSE}
- {$IFDEF mysql56}
- initialization
- RegisterConnection(TMySQL56ConnectionDef);
- finalization
- UnRegisterConnection(TMySQL56ConnectionDef);
- {$ELSE}
- {$IfDef mysql55}
- initialization
- RegisterConnection(TMySQL55ConnectionDef);
- finalization
- UnRegisterConnection(TMySQL55ConnectionDef);
- {$else}
- {$IfDef mysql51}
- initialization
- RegisterConnection(TMySQL51ConnectionDef);
- finalization
- UnRegisterConnection(TMySQL51ConnectionDef);
- {$ELSE}
- {$IfDef mysql50}
- initialization
- RegisterConnection(TMySQL50ConnectionDef);
- finalization
- UnRegisterConnection(TMySQL50ConnectionDef);
- {$ELSE}
- {$IfDef mysql41}
- initialization
- RegisterConnection(TMySQL41ConnectionDef);
- finalization
- UnRegisterConnection(TMySQL41ConnectionDef);
- {$ELSE}
- initialization
- RegisterConnection(TMySQL40ConnectionDef);
- finalization
- UnRegisterConnection(TMySQL40ConnectionDef);
- {$EndIf}
- {$EndIf}
- {$ENDIF}
- {$endif}
- {$ENDIF}
- {$ENDIF}
- end.
|