📄 mysqldirect.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 + -