Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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.033 c
1-84178
Yakudza
2003-06-07 20:52
2003.06.26
destAddress := PInAddr(pHostEn^.h_addr_list^)^;


1-84139
Lu Chan
2003-06-10 15:21
2003.06.26
inherited класса в динамике


14-84760
Palladin
2003-06-06 13:43
2003.06.26
хм, зашел я в раздел


14-84697
Style
2003-06-05 10:50
2003.06.26
Тут мне друг пару стишков прислал


1-84249
nevalex
2003-06-13 17:26
2003.06.26
Как програмно отличить папку от файла.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский