Я запрашиваю свою базу данных через соединитель, который я сделал в Lazarus / Freepascal.Он использует libmysql
из MySQL 5.0
.Из того, что я могу сказать, функции, которые я могу вызвать, идентичны функциям MYSQL C Connector
.
База данных не для удаленного доступа;это доступная по конвейеру база данных, которую я пытаюсь оптимизировать для локального чтения с использованием таблиц только для памяти (без MyISAM
или InnoDB
).Основное внимание уделяется скорости.
Клиентское приложение написано на ограниченном языке сценариев, называемом MQL4 (для финансовых рынков), и использует мою библиотеку для многократного запроса базы данных и возврата результатов для анализа.
Проблема: Я вынужден уничтожать и заново создавать соединение с базой данных каждый раз, когда отправляю новый запрос.
Если я не уничтожу и не воссоздаю соединение, я получу нарушение прав на чтение, потому что моя библиотека соединителей теряет значение *MYSQL
, присвоенное mysql_real_connect()
.
Я бы прошелэто значение через мое клиентское приложение, но, к сожалению, оно написано на языке, который может обрабатывать только типы данных LongInt
, Double
и String
.
Я пытался передать значение через преобразование моего клиентского приложения в LongInt
, а затем преобразовал его обратно *MYSQL
в моей библиотеке, но это не сработало.
Честно говоря, я не понимаю, почему моя библиотека теряет значение для *MYSQL
.
Вот код моей библиотеки:
{$CALLING STDCALL}
library D1Query;
{$mode objfpc}{$H+}
uses
cmem, Windows, SysUtils, mysql50;
var
sock: PMYSQL;
qmysql: st_mysql;
type
VArray = array[0..100] of Double;
PArray = ^VArray;
procedure InitSQL; stdcall;
begin
sock := mysql_real_connect(PMysql(@qmysql), '.', 'root', 'password'
, 'data', 3306, 'mysql', CLIENT_MULTI_STATEMENTS);
if sock = nil then begin
OutputDebugString(PChar(' Couldn''t connect to MySQL.'));
OutputDebugString(PChar(mysql_error(@qmysql)));
halt(1);
end;
end;
procedure DeInitSQL; stdcall;
begin
mysql_close(sock);
end;
function SQL_Query(QRY: PChar; output: PArray): integer; stdcall;
var
rowbuf: MYSQL_ROW;
recbuf: PMYSQL_RES;
i: integer;
nfields: LongWord;
begin
if (mysql_query(sock, QRY) < 0) then begin
OutputDebugString(PChar(' Query failed '));
OutputDebugString(PChar(' ' + mysql_error(sock)));
end;
recbuf := mysql_store_result(sock);
nfields := mysql_num_fields(recbuf);
rowbuf := mysql_fetch_row(recbuf);
if (rowbuf <> nil) then begin
for i:=0 to nfields-1 do
output^[i] := StrToFloatDef(rowbuf[i], -666);
end;
mysql_free_result(recbuf);
Result := i;
end;
exports
SQL_Query, InitSQL, DeInitSQL;
begin
end.