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

📄 mysqldirect.pas

📁 MYSQL 连接控件 MYSQL 连接控件
💻 PAS
字号:
//	Author:			Jacques Venter
//	Copyright:		2004-2005 SciBit - Scientific Bitware (Pty) Ltd
//	Version:			2005.4.0.0
//	Comments:      Driver for Direct MySQL Access via Christian Nicola's Opensource units
//	History:
//						2005.4.2.0 (2005-05-23)
//							Added mysql_info
//						2004.3.0.1 (2004-08-10)
//							Fix truncated error msg bug for direct driver
//						2004.2.0.1 (2004-05-18)
//							Add Read/Write timeout variables setting the uMySQLCT.NET_READ_TIMEOUT constant
//						2004.1.6.0
//							Incorporate opensource directdriver 1.1.4
//						2004.1.5.0
//							Fix null and zero length bug in opensource directdriver 1.1.3. Report enhancement to cristian nicola
//						2004.1.4.0
//							Fix nil pointer in on Open if no successful connect to server using direct driver
//						2004.1.1.0
//							First release
//
//   Licensing
//   This program is free software; you can redistribute it and/or modify
//   it under the terms of the GNU General Public License as published by
//   the Free Software Foundation; either version 2 of the License, or
//   (at your option) any later version.
//
//   This program is distributed in the hope that it will be useful,
//   but WITHOUT ANY WARRANTY; without even the implied warranty of
//   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//   GNU General Public License for more details.
//
//   You should have received a copy of the GNU General Public License
//   along with this program; if not, write to the Free Software
//   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
//
//   NOTES:
//     1. The origin of this software must not be misrepresented; you must not
//        claim that you wrote the original software. If you use this software
//        in a product, an acknowledgment in the product documentation would be
//        appreciated.
//     2. Altered source versions must be plainly marked as such, and must not be
//        misrepresented as being the original software.
//     3. If you are using it for a commercial software it must be open source and
//        it must include full source code of this library in an unaltered fashion
//        or you would need to ask for permission to use it. This library will be
//        considered donationware which means if you want to contribute with any money
//        or hardware you are more than welcome.
//     4. This notice may not be removed or altered from any source distribution.
//
//
//*******************************************************************

unit MySQLDirect;
interface
{$I mysqlinc.inc}
type
	PMYSQL_ROW = ^TMYSQL_ROW;
	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);

     // Lib
  function mysql_init(mysql: pointer): pointer; {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
     // Connection
  function mysql_options(mysql: pointer; option: mysql_option; const arg: PChar): longint; {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
  {$IFDEF HAVE_SSL}
  function mysql_ssl_set(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}
  function mysql_real_connect(mysql: pointer; const host, user, passwd, db: PChar; port: longword; const unix_socket: PChar; clientflag: longword): pointer; {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
  procedure mysql_close(sock: pointer); {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
     // Errors
  function mysql_errno(mysql: pointer): longword;{$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
  function mysql_error(mysql: pointer): PChar;{$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
     // Utility
  function mysql_get_host_info(mysql: pointer): PChar; {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
  function mysql_get_client_info: PChar; {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
  function mysql_get_server_info(mysql: pointer): PChar; {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
  function mysql_get_proto_info(mysql: pointer): longword;{$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
  function mysql_kill(mysql: pointer; pid: longword): longint; {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
  function mysql_info(mysql: pointer): PChar; {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
  function mysql_thread_id(mysql: pointer): longword;{$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
  function mysql_ping(mysql: pointer): longint; {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
     // Databases
  function mysql_create_db(mysql: pointer; const DB: PChar): longint; {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
  function mysql_select_db(mysql: pointer; const DB: PChar): longint; {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
  function mysql_drop_db(mysql: pointer; const DB: PChar): longint; {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
     // Queries
  function mysql_real_query(mysql: pointer; const SQL: PChar; length: longword): longint; {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
  function mysql_use_result(mysql: pointer): pointer; {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
  procedure mysql_free_result(r: pointer); {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
  function mysql_num_fields(r: pointer): longword; {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
  function mysql_num_rows(r: pointer): int64; {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
        // Fields
  function mysql_fetch_lengths(r: pointer): PMYSQL_LENGTHS; {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
  function mysql_fetch_field(r: pointer): pointer; {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
        // Rows
  function mysql_fetch_row(r: pointer): PMYSQL_ROW; {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
        // Utility
  function mysql_real_escape_string(mysql: pointer; dest: PChar; from: PChar; length: longword): longword; {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
  function mysql_insert_id(mysql: pointer): int64;{$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
  function mysql_refresh(mysql: pointer; refresh_options: longword): longint; {$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}
  function mysql_affected_rows(mysql: pointer): int64;{$IFDEF MSWINDOWS} stdcall;{$ELSE} cdecl;{$ENDIF}


{$IFDEF LIBMYSQLDLL}
exports
   mysql_init,mysql_options,
  {$IFDEF HAVE_SSL}
  mysql_ssl_set,
  {$ENDIF}
  mysql_real_connect,mysql_close,mysql_errno,mysql_error,mysql_get_host_info,mysql_get_client_info,
  mysql_get_server_info,mysql_get_proto_info,mysql_kill,mysql_info,mysql_thread_id,mysql_ping,
  mysql_create_db,mysql_select_db,mysql_drop_db,mysql_real_query,mysql_use_result,mysql_free_result,
  mysql_num_fields,mysql_num_rows,mysql_fetch_lengths,mysql_fetch_field,mysql_fetch_row,mysql_real_escape_string,
  mysql_insert_id,mysql_refresh,mysql_affected_rows;
{$ENDIF}

implementation
uses
  uMysqlCT, uMysqlClient, uMysqlHelpers, SysUtils;

type
  TMySQLDirectClient = class(TMySQLClient)
  private
     FLastError: string;
  end;

  TMySQLDirectResult = class(TMySQLResult)
  private
     FFieldNo: integer;
  end;

  PInteger = ^Integer;

function mysql_init(mysql: pointer): pointer;
begin
  Result := TMySQLDirectClient.create;
  TMySQLDirectClient(Result).ResultClass := TMySQLDirectResult;
  TMySQLDirectClient(Result).ShouldReconnect := False;
  TMySQLDirectClient(Result).Compress := False;
end;

function mysql_options(mysql: pointer; option: mysql_option; const arg: PChar): longint;
begin
  Result := 0;
  case option of
     MYSQL_OPT_CONNECT_TIMEOUT: TMySQLDirectClient(mysql).ConnectTimeout := PInteger(arg)^;
     MYSQL_OPT_RECONNECT: TMySQLDirectClient(mysql).ShouldReconnect := True;
     MYSQL_OPT_READ_TIMEOUT: uMySQLCT.NET_READ_TIMEOUT := PInteger(arg)^;
     MYSQL_OPT_WRITE_TIMEOUT: uMySQLCT.NET_READ_TIMEOUT := PInteger(arg)^;
     MYSQL_OPT_COMPRESS: TMySQLDirectClient(mysql).Compress := True;
     MYSQL_OPT_NAMED_PIPE: begin
                             TMySQLDirectClient(mysql).TrySockets := True;
                             TMySQLDirectClient(mysql).UseNamedPipe := True;
                           end;
  end;
end;

{$IFDEF HAVE_SSL}
function mysql_ssl_set(mysql: pointer; const key: PChar; const cert: PChar; const ca: PChar; const capath: PChar; const cipher: PChar): longint;
begin
  TMySQLDirectClient(mysql).SSLKey := key;
  TMySQLDirectClient(mysql).SSLCert := cert;
  TMySQLDirectClient(mysql).SSLCa := ca;
  TMySQLDirectClient(mysql).SSLCaPath := capath;
  TMySQLDirectClient(mysql).SSLCipher := cipher;
  Result := 0;
end;
{$ENDIF}

function mysql_real_connect(mysql: pointer; const host, user, passwd, db: PChar; port: longword; const unix_socket: PChar; clientflag: longword): pointer;
begin
  if Assigned(mysql) then begin
     Result := pointer(TMySQLDirectClient(mysql).connect(host, user, passwd, db, port, unix_socket, TMySQLDirectClient(mysql).TrySockets, clientflag));
  end else Result := nil;
end;

procedure mysql_close(sock: pointer);
begin
  FreeAndNil(TMySQLDirectClient(sock));
end;

function mysql_errno(mysql: pointer): longword;
begin
  if Assigned(mysql) then begin
     Result := TMySQLDirectClient(mysql).LastErrorNo;
  end else Result := 1;
end;

function mysql_error(mysql: pointer): PChar;
begin
  if Assigned(mysql) then begin
     TMySQLDirectClient(mysql).FLastError := TMySQLDirectClient(mysql).LastError;
     Result := PChar(TMySQLDirectClient(mysql).FLastError);
  end else Result := nil;
end;

function mysql_get_host_info(mysql: pointer): PChar;
begin
  Result := nil;
end;

function mysql_get_client_info: PChar;
begin
  Result := MYSQL_SERVER_VERSION;
end;

function mysql_get_server_info(mysql: pointer): PChar;
begin
  if Assigned(mysql) then begin
     Result := PChar(TMySQLDirectClient(mysql).ServerVersion);
  end else Result := nil;
end;

function mysql_get_proto_info(mysql: pointer): longword;
begin
  if Assigned(mysql) then Result := TMySQLDirectClient(mysql).ProtocolVersion
  else Result := 0;
end;

function mysql_kill(mysql: pointer; pid: longword): longint;
begin
  if Assigned(mysql) then begin
     Result := longint(not TMySQLDirectClient(mysql).kill(pid));
  end else Result := 1;
end;

function mysql_info(mysql: pointer): PChar;
begin
  if Assigned(mysql) then
     Result := PChar(TMySQLDirectClient(mysql).Info)
  else Result := nil;
end;

function mysql_thread_id(mysql: pointer): longword;
begin
  Result := TMySQLDirectClient(mysql).ThreadId;
end;

function mysql_ping(mysql: pointer): longint;
begin
  if Assigned(mysql) then begin
     Result := longint(not TMySQLDirectClient(mysql).ping);
  end else Result := 1;
end;

function mysql_create_db(mysql: pointer; const DB: PChar): longint;
begin
  if Assigned(mysql) then begin
     Result := longint(not TMySQLDirectClient(mysql).create_db(DB));
  end else Result := 1;
end;

function mysql_select_db(mysql: pointer; const DB: PChar): longint;
begin
  if Assigned(mysql) then begin
     Result := longint(not TMySQLDirectClient(mysql).select_db(DB));
  end else Result := 1;
end;

function mysql_drop_db(mysql: pointer; const DB: PChar): longint;
begin
  if Assigned(mysql) then begin
     Result := longint(not TMySQLDirectClient(mysql).drop_db(DB));
  end else Result := 1;
end;

function mysql_real_query(mysql: pointer; const SQL: PChar; length: longword): longint;
begin
  Result := TMySQLDirectClient(mysql).realquery(SQL);
end;

function mysql_use_result(mysql: pointer): pointer;
begin
  Result := TMySQLDirectClient(mysql).useresult;
  if Assigned(Result) then TMySQLDirectResult(Result).fFieldNo := -1;
end;

procedure mysql_free_result(r: pointer);
begin
  if Assigned(R) then FreeAndNil(TMySQLDirectResult(r));
end;

function mysql_num_fields(r: pointer): longword;
begin
  if Assigned(R) then
     Result := TMySQLDirectResult(r).FieldsCount
  else Result := 0;
end;

function mysql_num_rows(r: pointer): int64;
begin
  if Assigned(R) then
     Result := TMySQLDirectResult(r).RowsCount
  else Result := 0;
end;

function mysql_fetch_lengths(r: pointer): PMYSQL_LENGTHS;
begin
  if Assigned(r) then begin
     Result := PMYSQL_LENGTHS(TMySQLDirectResult(r).Lengths);
  end else Result := nil;
end;

function mysql_fetch_field(r: pointer): pointer;
begin
  if Assigned(r) then begin
     inc(TMySQLDirectResult(r).FFieldNo);
     Result := TMySQLDirectResult(r).FieldDef(TMySQLDirectResult(r).FFieldNo);
  end else Result := nil;
end;

function mysql_fetch_row(r: pointer): PMYSQL_ROW;
begin
  if Assigned(r) and (TMySQLDirectResult(r).RowsCount>0) and not TMySQLDirectResult(r).EOF then begin
     if not TMySQLDirectResult(r).BOF then
        TMySQLDirectResult(r).Next;
     if TMySQLDirectResult(r).EOF then
        Result := nil
     else
        Result := PMYSQL_ROW(TMySQLDirectResult(r).CurrentRow);
     TMySQLDirectResult(r).BOF := False;
  end else Result := nil;
end;

function mysql_real_escape_string(mysql: pointer; dest: PChar; from: PChar; length: longword): longword;
var
  S: string;
begin
  S := EscapeStr(from);
  StrLCopy(dest,PChar(S),system.length(S));
  Result := system.length(S);
end;

function mysql_insert_id(mysql: pointer): int64;
begin
  if Assigned(mysql) then begin
     Result := TMySQLDirectClient(mysql).LastInsertId;
  end else Result := 0;
end;

function mysql_refresh(mysql: pointer; refresh_options: longword): longint;
begin
  Result := 0;
end;

function mysql_affected_rows(mysql: pointer): int64;
begin
  if Assigned(mysql) then begin
     Result := TMySQLDirectClient(mysql).AffectedRows;
  end else Result := 0;
end;


end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -