Что это? Библиотетики для FireBird для работы из процедур с zip, xml, dbf, тестовыми файлами, файлами. Критика принимается
Пробуем AF-UDF для FireBird
Модератор: Модераторы
Пробуем AF-UDF для FireBird
смотреть тут: http://shamangrad.net/news.php?prj=AFUDF
Что это? Библиотетики для FireBird для работы из процедур с zip, xml, dbf, тестовыми файлами, файлами. Критика принимается
Что это? Библиотетики для FireBird для работы из процедур с zip, xml, dbf, тестовыми файлами, файлами. Критика принимается
-
lion-masterok
- незнакомец
- Сообщения: 2
- Зарегистрирован: 19.05.2009 12:17:58
Привет
Server Version WI-V6.3.4.13130 Firebird 2.0
Использую
afcommon.dll
afutextfile.dll
На простых процедурах работает нормально.
На сложных, там где объемные запросы, один раз отрабатывает нормально, второй раз запускаю, вешается вся база
причем вижу, что файл записался нормально.
Запустил трассировку и увидел что то место где вызывается udf проходит нормально
виснет перед большим селектом. Может надо както освобождать память после выполнения каждого процедуры?
Код:
Server Version WI-V6.3.4.13130 Firebird 2.0
Использую
afcommon.dll
afutextfile.dll
На простых процедурах работает нормально.
На сложных, там где объемные запросы, один раз отрабатывает нормально, второй раз запускаю, вешается вся база
причем вижу, что файл записался нормально.
Запустил трассировку и увидел что то место где вызывается udf проходит нормально
виснет перед большим селектом. Может надо както освобождать память после выполнения каждого процедуры?
Код:
Код: Выделить всё
BEGIN
v_handle = createtextfile('c:\test.html');
v_result = RewriteTextFile(v_handle);
v_result = WriteLNToTextFile(v_handle,'<html>');
v_result = WriteLNToTextFile(v_handle,'<style>.table_up ,td{border-collapse: collapse;padding: 0px;border: 1px solid #111777;}</style>');
v_result = WriteLNToTextFile(v_handle,'<table class=table_up>');
v_result = WriteLNToTextFile(v_handle,'</table>');
v_result = WriteLNToTextFile(v_handle,'</html>');
v_result = flushtextfile(v_handle);
v_result = CloseTextFile(v_handle);
v_result = FreeAFObject(v_handle);
....
-- текст процедуры
А каков объем выборки? Память должна освобождаться при вызове v_result = FreeAFObject(v_handle);
Но на самом деле при использовании afutextfile.dll и судя по вашему примеру выделяется на создание объекта всего несколько байт, так что дело скорее всего не в памяти. а можно текст процедуры полностью?
п.с. И на каком месте конкретно виснет?
Добавлено спустя 1 час 9 минут 13 секунд:
Да!!! вспомнил была бага с утечкой памяти её давно исправили, но не помню когда билд выкладывал. Возможно у вас старая версия. Берите последнюю http://download.shamangrad.net/AFUDF
Но на самом деле при использовании afutextfile.dll и судя по вашему примеру выделяется на создание объекта всего несколько байт, так что дело скорее всего не в памяти. а можно текст процедуры полностью?
п.с. И на каком месте конкретно виснет?
Добавлено спустя 1 час 9 минут 13 секунд:
Да!!! вспомнил была бага с утечкой памяти её давно исправили, но не помню когда билд выкладывал. Возможно у вас старая версия. Берите последнюю http://download.shamangrad.net/AFUDF
-
lion-masterok
- незнакомец
- Сообщения: 2
- Зарегистрирован: 19.05.2009 12:17:58
Обновление не помогло, судя по размеру была та же версия
Код: Выделить всё
BEGIN
v_handle = createtextfile('c:\test.html');
v_result = RewriteTextFile(v_handle);
v_result = WriteLNToTextFile(v_handle,'<html>');
v_result = WriteLNToTextFile(v_handle,'<style>.table_up ,td{border-collapse: collapse;padding: 0px;border: 1px solid #111777;}</style>');
v_result = WriteLNToTextFile(v_handle,'<table class=table_up>');
v_result = WriteLNToTextFile(v_handle,'</table>');
v_result = WriteLNToTextFile(v_handle,'</html>');
v_result = flushtextfile(v_handle);
v_result = CloseTextFile(v_handle);
v_result = FreeAFObject(v_handle);
O_LINE = 'Дата та час формування звіту: '|| DateTimeToStr(CURRENT_TIMESTAMP); SUSPEND;
O_LINE = ''; SUSPEND;
O_LINE = 'Виписка'; O_JUSTIFY = 1; SUSPEND;
O_LINE = 'за операціями по картковому рахунку'; SUSPEND;
O_LINE = ''; SUSPEND;
-- получаем все "статические" данные по договору
SELECT O_FIO, O_STREET, O_ZIPCODE, O_COUNTRYNAME, O_CLIM, O_ACCNUM,
O_MAINCCY, O_MINPAY, O_MINPAYDATE, O_BALANCESTATEMENTBEGIN, O_BALANCESTATEMENTEND, O_STATEMENTAMT, O_MAINACCID,
O_PERIODPLUS, O_PERIODMINUS, O_SALDOPLUS, O_SALDOMINUS, O_MAINCCYUKR,
O_STATEMENTMODEID,O_EMAILADDRESS,O_AMT1,O_AMT2,O_AMT3
FROM AKTA_STATEMENTTAGS(:I_CONTRACTID, :I_STARTDATE, :I_ENDDATE, :I_OPERDATE)
INTO v_FIO, v_STREET, v_ZIPCODE, v_COUNTRYNAME, v_CLIM, v_ACCNUM,
v_MAINCCY,v_MINPAY, v_MINPAYDATE, v_BALANCESTATEMENTBEGIN, v_BALANCESTATEMENTEND, v_STATEMENTAMT, v_MAINACCID,
v_PERIODPLUS, v_PERIODMINUS, v_SALDOPLUS, v_SALDOMINUS, v_MAINCCYUKR,
v_STATEMENTMODEID,v_EMAILADDRESS,V_AMT1,V_AMT2,V_AMT3;
v_balance = v_BALANCESTATEMENTBEGIN;
v_D1 = 46; -- правая граница первого столбца (Номер счета, валюта, лимит и т.д.)
-- разбиение ФИО и адреса на строки (все, что может не влезть)
EXECUTE PROCEDURE SplitString(V_FIO, I_PaperWidth-v_D1-20)
RETURNING_VALUES v_Info1, v_Info2, x_tmp200, x_tmp200, x_tmp200, x_tmp200, x_tmp200;
EXECUTE PROCEDURE SplitString(V_STREET, I_PaperWidth-v_D1-20)
RETURNING_VALUES v_Info3, v_Info4, v_Info5, v_Info6, v_Info7, v_Info8, x_tmp200;
O_JUSTIFY = 0;
O_LINE = 'Номер рахунку: ';
O_LINE = O_LINE||UDF_LPAD(v_accNum, v_D1-strlen(O_LINE));
O_LINE = O_LINE||' П.І.Б. Клієнта: '|| v_Info1; SUSPEND;
O_LINE = 'Валюта рахунку: ';
O_LINE = O_LINE||UDF_LPAD(V_MAINCCY, v_D1-strlen(O_LINE));
-- ФИО или адрес
IF (v_Info2='') THEN BEGIN
O_LINE = O_LINE || V_CptAdr;
v_line = 4;
END ELSE BEGIN
O_LINE = O_LINE ||UDF_LPAD(' ',20)||v_Info2;
v_line = 3;
END
SUSPEND;
v_CountryShow = 0;
v_ZipShow = 0;
O_LINE = 'Ліміт кредитування: ';
O_LINE = O_LINE|| UDF_LPAD(FormatMoney(:v_Clim,: I_StatementAmountLength,2,',','',''),V_D1-strlen(O_LINE));
IF (v_line = 3) THEN O_LINE = O_LINE ||v_CptAdr|| v_Info3;
ELSE BEGIN
IF (v_Info4='') THEN BEGIN O_LINE =O_LINE||v_CptZip||V_ZIPCODE; V_ZIPSHOW = 1; v_Line=-1;END
ELSE O_LINE = O_LINE ||UDF_LPAD(' ',20)||v_Info4;
END
SUSPEND;
v_line = v_line+1;
O_LINE = 'Період: ';
O_LINE = O_LINE||UDF_LPAD('з '||DATETOSTR(:I_StartDate)||' по '||DATETOSTR(:I_ENDDATE),v_D1-strlen(O_LINE));
IF ((v_line = 4 AND v_Info4<>'')OR(v_line = 5 AND v_Info5<>'')) THEN BEGIN
IF (v_line = 4) THEN O_LINE = O_LINE ||UDF_LPAD(' ',20)||v_Info4;ELSE
O_LINE = O_LINE ||UDF_LPAD(' ',20)||v_Info5;
v_line = v_line+1;
END ELSE BEGIN
v_line = 0;
IF (V_ZIPSHOW = 0) THEN BEGIN O_LINE =O_LINE||v_CptZip||V_ZIPCODE; V_ZIPSHOW = 1; v_Line=-1;END
ELSE BEGIN O_LINE = O_LINE||v_CptCountry|| V_COUNTRYNAME; v_CountryShow = 1; END
END
SUSPEND;
IF (v_line> 0) THEN BEGIN
IF (v_line = 5 AND v_Info5<>'') THEN BEGIN O_LINE = UDF_LPAD(' ',v_D1+20)||v_Info5;SUSPEND;END
IF (v_line <= 6 AND v_Info6<>'') THEN BEGIN O_LINE = UDF_LPAD(' ',v_D1+20)||v_Info6;SUSPEND;END
IF (v_line <= 7 AND v_Info7<>'') THEN BEGIN O_LINE = UDF_LPAD(' ',v_D1+20)||v_Info7;SUSPEND;END
IF (v_line <= 8 AND v_Info8<>'') THEN BEGIN O_LINE = UDF_LPAD(' ',v_D1+20)||v_Info8;SUSPEND;END
END
IF (V_ZipShow = 0) THEN BEGIN O_LINE = UDF_LPAD(v_CptZip,v_D1+20)||V_ZipCode; SUSPEND; END
IF (v_CountryShow = 0) THEN BEGIN O_LINE = UDF_LPAD(v_CptCountry,v_D1+20)|| V_COUNTRYNAME; SUSPEND; END
O_LINE = ''; SUSPEND;
O_LINE = 'Мінімальний платіж до сплати: '||FormatMoney(v_MINPAY,:I_StatementAmountLength,2,',','',''); SUSPEND;
O_LINE = 'Сплатити до '||DATETOSTR(:v_MinPayDate);SUSPEND;
O_LINE = ''; SUSPEND;
O_LINE = 'Баланс на початок періоду: '||FormatMoney(v_BALANCESTATEMENTBEGIN,: I_StatementAmountLength,2,',','','');O_JUSTIFY = 2; SUSPEND;
O_LINE ='Операції за період'; O_JUSTIFY = 1; SUSPEND;
O_LINE = FORMATSTRING('',:I_PaperWidth,'-',0); O_JUSTIFY = 0; SUSPEND;
-- изменяемые колонки по ширине сдвинуты влево на
v_LeftOperFrom = strlen(
' Дата Дата Номер ');
-- длина колонки наименование и места операции для заданной ширины бумаги
v_LeftOperLength = (I_PaperWidth - v_LeftOperFrom - (:I_StatementAmountLength*2+1));
O_LINE =' Дата Дата Номер '||UDF_CPAD(' Найменування та місце',v_LeftOperLength-20)||UDF_CPAD('Суми,',(I_StatementAmountLength+4)*2+1)||UDF_CPAD('Баланс',I_StatementAmountLength+5); SUSPEND;
O_LINE ='проведення проведення картки '||UDF_CPAD(' проведення операції',v_LeftOperLength-20)||UDF_CPAD('По операції',I_StatementAmountLength+4)||' '||UDF_CPAD('По рахунку',I_StatementAmountLength+4)||UDF_CPAD('рахунку',I_StatementAmountLength+5); SUSPEND;
O_LINE =' операції за рахунком '; SUSPEND;
-- 01.01.2001 01.01.2001 *1234
O_LINE = FORMATSTRING('',:I_PaperWidth,'-',0); SUSPEND;
FOR
SELECT s.O_LINE , s.O_ID , s.O_AccAmt, s.O_AccCCY, s.O_LINENUMBER, s.O_OpAmt,s.O_OpCCY, s.O_OPERID
FROM AKTA_S_CUSTOMSTATEMENTOPS(:I_CONTRACTID, :I_STARTDATE, :I_ENDDATE, :I_StatementAmountLength, :I_PaperWidth,
:v_LEFTOPERFROM, :v_LEFTOPERLENGTH,:v_MAINACCID) s
ORDER BY O_ID, O_OPDATE, O_LINENUMBER
INTO O_LINE, v_NewID, v_AccAmt, v_AccCCY, V_LINEID, V_OpAmt, V_OpCCY, V_OPERID
DO BEGIN
if (V_OPERID=1) then begin
v_AccAmt=V_OpAmt;
v_AccCCY=V_OpCCY;
end
IF (V_LINEID=1) THEN v_balance=v_balance + v_AccAmt;
v_sBalance = FormatMoney(v_balance, i_StatementAmountLength, 2, ',', '', ' ');
o_line = o_line||' '||v_sBalance||' '||V_AccCCY;
IF (v_LastId <> v_NewID) THEN O_TICK = 1 - O_TICK;
SUSPEND;
v_LastId = v_NewID;
END
o_Tick = 0;
O_LINE = FORMATSTRING('',:I_PaperWidth,'-',0); SUSPEND;
O_LINE = UDF_RPAD('Всього за період дебет:',I_PaperWidth-I_StatementAmountLength-4)||
UDF_LPAD(FormatMoney(v_PERIODPLUS, I_StatementAmountLength, 2, ',', '', ' '), I_StatementAmountLength)||' '||V_MAINCCY;
SUSPEND;
O_LINE = UDF_RPAD('Всього за період кредит:',I_PaperWidth-I_StatementAmountLength-4)||
UDF_LPAD(FormatMoney(v_PERIODMINUS, I_StatementAmountLength, 2, ',', '', ' '),I_StatementAmountLength)||' '||V_MAINCCY;
SUSPEND;
O_LINE = ''; SUSPEND;
O_LINE = UDF_LPAD('Баланс на кінець періоду:',30)||FormatMoney(v_BALANCESTATEMENTEND,: I_StatementAmountLength,2,',','',' ');O_JUSTIFY = 2; SUSPEND;
O_LINE = UDF_LPAD('Проценти за кредит:',30)||FormatMoney(v_Amt1,: I_StatementAmountLength,2,',','',' '); SUSPEND;
O_LINE = UDF_LPAD('Комісії:',30)||FormatMoney(v_Amt2,: I_StatementAmountLength,2,',','',' '); SUSPEND;
O_LINE = UDF_LPAD('Прострочена заборгованість:',30)||FormatMoney(v_Amt3,: I_StatementAmountLength,2,',','',' '); SUSPEND;
O_LINE = ''; SUSPEND;
O_LINE = 'Доступний залишок на кінець періоду:'||FormatMoney(v_STATEMENTAMT,: I_StatementAmountLength,2,',','',' '); SUSPEND;
ENDПроверил.... аналогичную ситуацию получить не удалось. буду пробовать потом на 2.0
1. да обнаружена утечка памяти в модуле XML
2. общий менеджер памяти вообще не подгружался : afmmngr.dll его нужно скопировать в windows\system32
или afmmngr.so создать симлинк ln -s /opt/firebird/UDF/afmmngr.so /usr/lib/afmmngr.so
выложил новую версию
2. общий менеджер памяти вообще не подгружался : afmmngr.dll его нужно скопировать в windows\system32
или afmmngr.so создать симлинк ln -s /opt/firebird/UDF/afmmngr.so /usr/lib/afmmngr.so
выложил новую версию
