📄 mysqldrivers.pas
字号:
Result.db := db;
Result.def := def;
Result._type := _type;
Result.flags := flags;
Result.length := length;
Result.max_length := max_length;
Result.decimals := decimals;
exit;
end;
if ClientVer>=40100 then
with PMYSQL410_FIELD(R)^ do begin
Result.name := name;
Result.org_name := org_name;
Result.table := table;
Result.org_table := nil;
//Result.db := db; // Available on client, but not actually set
Result.def := def;
Result._type := _type;
Result.flags := flags;
Result.length := length;
Result.max_length := max_length;
Result.decimals := decimals;
exit;
end;
if ClientVer>=40000 then
with PMYSQL400_FIELD(R)^ do begin
Result.name := name;
Result.table := table;
Result.org_table := nil;
Result.db := nil;
Result.def := def;
Result._type := _type;
Result.flags := flags;
Result.length := length;
Result.max_length := max_length;
Result.decimals := decimals;
exit;
end
else // Version 3
with PMYSQL3_FIELD(R)^ do begin
Result.name := name;
Result.table := table;
Result.org_table := nil;
Result.db := nil;
Result.def := def;
Result._type := _type;
Result.flags := flags;
Result.length := length;
Result.max_length := max_length;
Result.decimals := decimals;
exit;
end;
end else Result.name := '';
end;
function TMySQLBase.RetrieveRow(Res: pointer): PMYSQL_ROW;
begin
Result := nil;
if not Assigned(Res) then exit;
if not FDriverLoaded then Load;
Result := mysql_fetch_row(Res);
end;
function TMySQLBase.RetrieveRowFieldLenghts(Res: pointer): PMYSQL_LENGTHS;
begin
Result := nil;
if not Assigned(Res) then exit;
if not FDriverLoaded then Load;
Result := mysql_fetch_lengths(Res);
end;
function TMySQLBase.Refresh(Conn: pointer; const AOptions: integer=0): boolean;
begin
Result := False;
if not Assigned(Conn) then exit;
if not FDriverLoaded then Load;
if mysql_refresh(Conn, AOptions)<>0 then MYSQLError(Self,Conn);
Result := True;
end;
// Utility functions
function TMySQLBase.EscapeStr(const Value: string): string;
var
R: PChar;
begin
if not FDriverLoaded then Load;
Result := '';
R := StrAlloc(Length(Value)*2+1);
try
mysql_real_escape_string(FConnection,R,PChar(Value),Length(Value));
Result := StrPas(R);
finally
StrDispose(R);
end;
end;
function TMySQLBase.QuoteIdentifier(const Value: string = ''): boolean;
var
i: integer;
begin
if not FDriverLoaded then Load;
Result := False;
if (Assigned(Connection) and (ServerVer>=32306)) or ((length(Value)>0) and (Value[1]<>'`')) then begin
Result := IsReservedWord(Value) or ((length(Value)>0) and (Value[1] in ['0'..'9']));
if not Result then
for i := 1 to Length(Value) do
if not (Value[i] in ['a'..'z','A'..'Z','0'..'9','_','$']) then begin // Backtick only if any character of the indentifier falls outside of the valid range
Result := True;
break;
end
end;
end;
function TMySQLBase.FormatIdentifier(const Value: string = ''): string;
var
i: integer;
S: string;
begin
if not FDriverLoaded then Load;
Result := Value;
if QuoteIdentifier(Value) then begin //(Assigned(Connection) and (ServerVer>=32306)) or ((length(Value)>0) and (Value[1]<>'`')) then begin
if pos('.',Value)>0 then begin
i := 1;
S := WordInStr(i,Value,'.');
Result := '';
while length(S)>0 do begin
Result := Result+FormatIdentifier(S)+'.';
inc(i);
S := WordInStr(i,Value,'.');
end;
if length(Result)>0 then SetLength(Result,length(Result)-1);
//exit;
end else Result := '`'+Value+'`';
// if IsReservedWord(Value) or ((length(Value)>0) and (Value[1] in ['0'..'9'])) {Special case: backtick just in case the person made all the rest of the identifier digits} then
// Result := '`'+Value+'`'
// else
// for i := 1 to Length(Value) do
// if not (Value[i] in ['a'..'z','A'..'Z','0'..'9','_','$']) then begin // Backtick only if any character of the indentifier falls outside of the valid range
// Result := '`'+Value+'`';
// break;
// end
end;
end;
function TMySQLBase.IsReservedWord(const Value: string = ''): boolean;
begin
Result := pos(UpperCase(','+Value+','),FReserved)>0;
end;
function TMySQLBase.GetConnection: pointer;
begin
Result := FConnection;
end;
function TMySQLBase.LastInsertID(Conn: pointer): string;
begin
if not Assigned(Conn) then exit;
if not FDriverLoaded then Load;
Result := IntToStr(mysql_insert_id(Conn));
end;
function TMySQLBase.AffectedRows(Conn: pointer): string;
begin
if not Assigned(Conn) then exit;
if not FDriverLoaded then Load;
Result := IntToStr(mysql_affected_rows(Conn));
end;
{$IFDEF MYSQLDIRECT}
// TMySQLDirect
procedure TMySQLDirect.Bind;
begin
mysql_init := @MySQLDirect.mysql_init;
mysql_options := @MySQLDirect.mysql_options;
{$IFDEF HAVE_SSL}
mysql_ssl_set:= @MySQLDirect.mysql_ssl_set;
{$ENDIF}
mysql_real_connect := @MySQLDirect.mysql_real_connect;
mysql_close := @MySQLDirect.mysql_close;
mysql_errno := @MySQLDirect.mysql_errno;
mysql_error := @MySQLDirect.mysql_error;
mysql_get_client_info := @MySQLDirect.mysql_get_client_info;
mysql_get_server_info := @MySQLDirect.mysql_get_server_info;
mysql_get_host_info := @MySQLDirect.mysql_get_host_info;
mysql_get_proto_info := @MySQLDirect.mysql_get_proto_info;
mysql_ping := @MySQLDirect.mysql_ping;
mysql_thread_id := @MySQLDirect.mysql_thread_id;
mysql_kill := @MySQLDirect.mysql_kill;
mysql_info := @MySQLDirect.mysql_info;
mysql_create_db := @MySQLDirect.mysql_create_db;
mysql_select_db := @MySQLDirect.mysql_select_db;
mysql_drop_db := @MySQLDirect.mysql_drop_db;
mysql_real_query := @MySQLDirect.mysql_real_query;
mysql_use_result := @MySQLDirect.mysql_use_result;
mysql_free_result := @MySQLDirect.mysql_free_result;
mysql_num_fields := @MySQLDirect.mysql_num_fields;
mysql_num_rows:= @MySQLDirect.mysql_num_rows;
mysql_fetch_lengths := @MySQLDirect.mysql_fetch_lengths;
mysql_fetch_field := @MySQLDirect.mysql_fetch_field;
mysql_fetch_row := @MySQLDirect.mysql_fetch_row;
mysql_real_escape_string := @MySQLDirect.mysql_real_escape_string;
mysql_insert_id := @MySQLDirect.mysql_insert_id;
mysql_refresh := @MySQLDirect.mysql_refresh;
mysql_affected_rows := @MySQLDirect.mysql_affected_rows;
end;
{$ENDIF}
// TMySQLLibrary
constructor TMySQLLibrary.Create(const AOptions: string);
begin
inherited;
FClientDLL := '';
FDLLHandle := 0;
end;
destructor TMySQLLibrary.Destroy;
begin
inherited;
FDLLHandle := 0;
end;
function TMySQLLibrary.GetClientDLL: string;
begin
if length(FClientDLL)=0 then begin
{$IFDEF DELPHI5UP}
Result := 'libmysql.dll';
{$ENDIF}
{$IFDEF KYLIX}
Result := 'libmysqlclient.so';
{$ENDIF}
end else Result := FClientDLL;
end;
procedure TMySQLLibrary.Load;
{$IFDEF LINUX}
var
P: pointer;
{$ENDIF}
begin
if FDriverLoaded then UnLoad;
{$IFDEF MSWINDOWS}
DLLHandle := SafeLoadLibrary(PChar(ClientDLL));
{$ENDIF}
{$IFDEF LINUX}
P := dlopen(PChar(ClientDLL), RTLD_LAZY);
if not Assigned(P) then DLLHandle := 0
else DLLHandle := longword(P);
{$ENDIF}
if DLLHandle=0 then begin
{$IFDEF MSWINDOWS}
raise Exception.Create('Could not load MySQL library '+ClientDLL+' (available from www.MySQL.com). Please place '+ClientDLL+' in your program''s directory or alternatively in your system32 folder or a system folder (included in your PATH).');
{$ENDIF}
{$IFDEF LINUX}
raise Exception.Create('Could not load MySQL library '+ClientDLL+' (available from www.MySQL.com). Please place '+ClientDLL+' in your program''s directory or alternatively in system folder (included in LD_LIBRARY_PATH).');
{$ENDIF}
end else begin
FDriverLoaded := True;
Bind;
end;
end;
procedure TMySQLLibrary.UnLoad;
begin
if FDriverLoaded then begin
{$IFDEF MSWINDOWS}
if not FreeLibrary(DLLHandle) then MYSQLError(Self);
{$ENDIF}
{$IFDEF LINUX}
dlclose(pointer(DLLHandle));
{$ENDIF}
DLLHandle := 0;
FDriverLoaded := False;
FConnection := nil;
FClientVer := 0;
FServerVer := 0;
end;
end;
procedure TMySQLLibrary.Bind;
begin
inherited;
BindProc(@mysql_init,DLLHandle,'mysql_init');
BindProc(@mysql_options,DLLHandle,'mysql_options');
{$IFDEF HAVE_SSL}
BindProc(@mysql_ssl_set,DLLHandle,'mysql_ssl_set');
{$ENDIF}
BindProc(@mysql_real_connect,DLLHandle,'mysql_real_connect');
BindProc(@mysql_close,DLLHandle,'mysql_close');
BindProc(@mysql_errno,DLLHandle,'mysql_errno');
BindProc(@mysql_error,DLLHandle,'mysql_error');
BindProc(@mysql_get_client_info,DLLHandle,'mysql_get_client_info');
BindProc(@mysql_get_server_info,DLLHandle,'mysql_get_server_info');
BindProc(@mysql_get_host_info,DLLHandle,'mysql_get_host_info');
BindProc(@mysql_get_proto_info,DLLHandle,'mysql_get_proto_info');
BindProc(@mysql_ping,DLLHandle,'mysql_ping');
BindProc(@mysql_thread_id,DLLHandle,'mysql_thread_id');
BindProc(@mysql_kill,DLLHandle,'mysql_kill');
BindProc(@mysql_info,DLLHandle,'mysql_info');
BindProc(@mysql_create_db,DLLHandle,'mysql_create_db');
BindProc(@mysql_select_db,DLLHandle,'mysql_select_db');
BindProc(@mysql_drop_db,DLLHandle,'mysql_drop_db');
BindProc(@mysql_real_query,DLLHandle,'mysql_real_query');
BindProc(@mysql_use_result,DLLHandle,'mysql_use_result');
BindProc(@mysql_free_result,DLLHandle,'mysql_free_result');
BindProc(@mysql_num_fields,DLLHandle,'mysql_num_fields');
BindProc(@mysql_num_rows,DLLHandle,'mysql_num_rows');
BindProc(@mysql_fetch_lengths,DLLHandle,'mysql_fetch_lengths');
BindProc(@mysql_fetch_field,DLLHandle,'mysql_fetch_field');
BindProc(@mysql_fetch_row,DLLHandle,'mysql_fetch_row');
BindProc(@mysql_real_escape_string,DLLHandle,'mysql_real_escape_string');
BindProc(@mysql_insert_id,DLLHandle,'mysql_insert_id');
BindProc(@mysql_refresh,DLLHandle,'mysql_refresh');
BindProc(@mysql_affected_rows,DLLHandle,'mysql_affected_rows');
end;
{$IFDEF MYSQLEMBEDDED}
// TMySQLEmbedded
function TMySQLEmbedded.GetClientDLL: string;
begin
if length(FClientDLL)=0 then begin
{$IFDEF DELPHI5UP}
Result := 'libmysqld.dll';
{$ENDIF}
{$IFDEF KYLIX}
Result := 'libmysqld.so';
{$ENDIF}
end else Result := FClientDLL;
end;
procedure TMySQLEmbedded.Load;
var
sa: array of PChar;
sg: array of PChar;
i: integer;
begin
inherited;
// Embedded bits
if FDriverLoaded then begin
SetLength(sa,Options.Count+1);
sa[0] := PChar(ParamStr(0));
for i := 0 to Options.Count-1 do begin
sa[i+1] := StrAlloc(length('--'+Options[i])+1);
StrLCopy(sa[i+1],PChar('--'+Options[i]),length('--'+Options[i]));
end;
SetLength(sg,4);
sg[0] := PChar(ParamStr(0)+'_SERVER');
sg[1] := 'embedded';
sg[2] := 'server';
sg[3] := nil;
if mysql_server_init(length(sa),sa,sg)<>0 then MYSQLError(Self);
//if mysql_server_init(0,nil,nil)<>0 then MYSQLError(Self);
end;
end;
procedure TMySQLEmbedded.Unload;
begin
try
mysql_server_end();
finally
inherited;
end;
end;
procedure TMySQLEmbedded.Bind;
begin
inherited;
BindProc(@mysql_server_init,DLLHandle,'mysql_server_init');
BindProc(@mysql_server_end,DLLHandle,'mysql_server_end');
end;
{$ENDIF}
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -