Форум: "Потрепаться";
Текущий архив: 2003.06.26;
Скачать: [xml.tar.bz2];
ВнизUDF к MySQL Найти похожие ветки
← →
PVOzerski (2003-06-05 13:51) [0]Сейчас сотворил несколько сабжей при помощи FreePascal (пока только для Win32). Интересно, кто-нибудь подобным развлекался? Это я спрашиваю не только из любопытства - может, дока какая паскаль-ориентированная есть, а может, наоборот, мои экзерсисы кому интересны.
← →
Nikolay M. (2003-06-05 14:10) [1]
> а может, наоборот, мои экзерсисы кому интересны.
Очень интересны. Как-то пока не приходилось слышать про UDF в MySQL. Или это работает исключительно для Вынь? Можно на что-нибудь из сабжа посмотреть? Хорошо бы, все-таки, чтобы для *никса это тоже работало...
← →
PVOzerski (2003-06-05 14:23) [2]У меня это заработало под MySQL 4.0.13-nt. Скомпилировано довольно свежим билдом FPC 1.1. А написано для следующего - позволить хранить и оперировать с данными паскального типа set.
Пришлось, правда, ограничиться диапазоном 0..63, так как я использовал в качестве хранилища 8-битный real. И еще: я плюнул на контроль соответствия типов, генерацию ошибок и прочее (по крайней мере, пока). А вот то, что у меня сейчас получилось:
{$apptype GUI}
{$mode ObjFPC}
{$smartlink on}
library set_supp;
uses
mysql,mysql_com{,windows};
type
tLong=array[1..1]of packed record
case integer of
0:(
x:longint;
dummy:longint
);
1:(
r:double
);
end;
pLong=^tLong;
function packasset(dummy1:pointer;args:PUDPF_ARGS;dummy2,dummy3:pointer):double;cdecl;export;
var
rset:set of byte;
i:longint;
begin
rset:=[];
for i:=1 to args^.arg_count do
include(rset,byte(pLong(args^.args^)^[i].x));
move(rset,Result,sizeof(Result));
end;
function hasinside(dummy1:pointer;args:PUDPF_ARGS;dummy2,dummy3:pointer):int64;cdecl;export;
var
rset:set of byte;
begin
Result:=0;
if args^.arg_count=2 then
begin
rset:=[];
move(pLong(args^.args^)^[1].r,rset,sizeof(double));
if byte(pLong(args^.args^)^[2].x)in rset then
Result:=-1;
end;
end;
function containsassubset(dummy1:pointer;args:PUDPF_ARGS;dummy2,dummy3:pointer):int64;cdecl;export;
var
rset,rsubset:set of byte;
begin
Result:=0;
if args^.arg_count=2 then
begin
rset:=[];
rsubset:=[];
move(pLong(args^.args^)^[1].r,rset,sizeof(double));
move(pLong(args^.args^)^[2].r,rsubset,sizeof(double));
if rsubset*rset=rsubset then
Result:=-1;
end;
end;
function displayset(dummy1:pointer;args:PUDPF_ARGS;Res:pChar;len:longword;dummy2,dummy3:pointer):pChar;cdecl;export;
var
rset:set of byte;
i:longint;
s,ss:shortstring;
begin
Result:=Res;
if args^.arg_count=1 then
begin
move(pLong(args^.args^)^[1].r,rset,sizeof(double));
s:="";
for i:=0 to 63 do
if byte(i)in rset then
begin
str(i:0,ss);
if s<>"" then
s:=s+" ";
s:=s+ss;
end;
s:=s+#0;
len:=length(s);
move(s[1],Result^,len);
if(len<>0)and(s[len]=#0)then
dec(len);
//messagebox(0,@s[1],@s[1],0);
end;
end;
function includetoset(dummy1:pointer;args:PUDPF_ARGS;dummy2,dummy3:pointer):double;cdecl;export;
var
rset:set of byte;
i:longint;
begin
rset:=[];
for i:=2 to args^.arg_count do
include(rset,byte(pLong(args^.args^)^[i].x));
move(rset,Result,sizeof(Result));
end;
function excludefromset(dummy1:pointer;args:PUDPF_ARGS;dummy2,dummy3:pointer):double;cdecl;export;
var
rset:set of byte;
i:longint;
begin
rset:=[];
for i:=2 to args^.arg_count do
exclude(rset,byte(pLong(args^.args^)^[i].x));
move(rset,Result,sizeof(Result));
end;
function unitesets(dummy1:pointer;args:PUDPF_ARGS;dummy2,dummy3:pointer):double;cdecl;export;
var
rset,rsubset:set of byte;
i:longint;
begin
rset:=[];
rsubset:=[];
for i:=1 to args^.arg_count do
begin
move(pLong(args^.args^)^[i].r,rsubset,sizeof(double));
rset:=rset+rsubset;
end;
move(rset,Result,sizeof(Result));
end;
function commonpartofsets(dummy1:pointer;args:PUDPF_ARGS;dummy2,dummy3:pointer):double;cdecl;export;
var
rset,rsubset:set of byte;
i:longint;
begin
rset:=[];
rsubset:=[];
for i:=1 to args^.arg_count do
begin
if i=1 then
move(pLong(args^.args^)^[i].r,rset,sizeof(double))
else
begin
move(pLong(args^.args^)^[i].r,rsubset,sizeof(double));
rset:=rset*rsubset;
end;
end;
move(rset,Result,sizeof(Result));
end;
exports
commonpartofsets name "commonpartofsets",
unitesets name "unitesets",
excludefromset name "excludefromset",
includetoset name "includetoset",
displayset name "displayset",
containsassubset name "containsassubset",
hasinside name "hasinside",
packasset name "packasset";
begin
end.
← →
Nikolay M. (2003-06-05 14:50) [3]А откуда инфу брали? Кроме сайта мускула? Нашел вот несколько ссылочек...
http://empyrean.lib.ndsu.nodak.edu/~nem/mysql/udf/
http://lib.ivanovo.ru:8100/Docs/MySQL-ru/manual.ru_Extending_MySQL.html
← →
PVOzerski (2003-06-05 15:06) [4]http://www.mysql.ru/docs/man/Adding_functions.html
Но там всё, естественно, для C/C++.
← →
Nikolay M. (2003-06-05 15:16) [5]Да может для С оно и поинтереснее будет. Мне лично & и * понятнее, чем ^ и @... :)
Надо будет посмотреть, можно ли будет что-то из скриптов переложить на мускул. Вообще интересно.
Респект за подачу :)
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2003.06.26;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.027 c