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

📄 mysqldrivers.pas

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