Страница 1 из 1

Пробуем AF-UDF для FireBird

СообщениеДобавлено: 30.04.2009 08:06:05
Inferno
смотреть тут: http://shamangrad.net/news.php?prj=AFUDF
Что это? Библиотетики для FireBird для работы из процедур с zip, xml, dbf, тестовыми файлами, файлами. Критика принимается :D

Re: Пробуем AF-UDF для FireBird

СообщениеДобавлено: 19.05.2009 12:34:17
lion-masterok
Привет
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);
....
-- текст процедуры

Re: Пробуем AF-UDF для FireBird

СообщениеДобавлено: 19.05.2009 13:24:27
Inferno
А каков объем выборки? Память должна освобождаться при вызове v_result = FreeAFObject(v_handle);
Но на самом деле при использовании afutextfile.dll и судя по вашему примеру выделяется на создание объекта всего несколько байт, так что дело скорее всего не в памяти. а можно текст процедуры полностью?

п.с. И на каком месте конкретно виснет?

Добавлено спустя 1 час 9 минут 13 секунд:
Да!!! вспомнил была бага с утечкой памяти её давно исправили, но не помню когда билд выкладывал. Возможно у вас старая версия. Берите последнюю http://download.shamangrad.net/AFUDF

Re: Пробуем AF-UDF для FireBird

СообщениеДобавлено: 19.05.2009 16:46:19
lion-masterok
Обновление не помогло, судя по размеру была та же версия

Код: Выделить всё

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

Re: Пробуем AF-UDF для FireBird

СообщениеДобавлено: 20.05.2009 07:37:51
Inferno
Проверил.... аналогичную ситуацию получить не удалось. буду пробовать потом на 2.0

Re: Пробуем AF-UDF для FireBird

СообщениеДобавлено: 03.06.2009 11:32:13
Inferno
1. да обнаружена утечка памяти в модуле XML
2. общий менеджер памяти вообще не подгружался : afmmngr.dll его нужно скопировать в windows\system32
или afmmngr.so создать симлинк ln -s /opt/firebird/UDF/afmmngr.so /usr/lib/afmmngr.so
выложил новую версию