Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.06.26;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.019 c
14-84628
Карлсон
2003-06-09 19:39
2003.06.26
w2k английский.


14-84575
Кен
2003-06-06 02:08
2003.06.26
В Windows найдены секретные API


14-84664
sapsi
2003-06-10 09:17
2003.06.26
Где вы отдыхаете (туристические туры)?


9-83836
Адмирал Бенбоу
2003-01-15 18:30
2003.06.26
Спрайты


14-84746
Карелин Артем
2003-06-04 16:53
2003.06.26
Где найти женщину с квартирой?