Lazarus 30 64 bit и Zeos 6.6.6. Error:Bookmark was not found

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Lazarus 30 64 bit и Zeos 6.6.6. Error:Bookmark was not found

Сообщение dr.miller » 17.02.2012 10:24:05

Всем привед )
Уперся в трабл. У меня 64-битная убунта.
Работаю с постгресом. Вдруг захотелось ощутить с сервером БД обратную связь, т.е. возможность принимать от сервака сообщения, инициированные самим серваком.
Из стандартных велосипедов нашел пару компонентов обеспечивающих обратную связь.
zeos и PostgresDAC... PostgresDAC - платный... А зеос... сцк на 64 битах работает криво, по понятным причинам (при DataSet.Next выдает Bookmark was not found). Пробовал искать 64-битную версию - пока не нашел. Мож валяется у кого-нить скачанный, проверенный вариант?

Продолжаю поиски...

Канешно можно было бы написать на в постгресе хранимку, в которой создавать сокет и плеваться через него в клиента, но блин ввиду того что клиентов может быть очень много - это гемор... тем более при наличии компонент которые ужэ это могут.

А может, у кого-нить есть еще предложения по реализации этой коварной задумки?! ))
Аватара пользователя
dr.miller
незнакомец
 
Сообщения: 7
Зарегистрирован: 17.11.2011 12:47:34
Откуда: Краснодар

Re: Lazarus 30 64 bit и Zeos 6.6.6. Error:Bookmark was not f

Сообщение Little_Roo » 17.02.2012 10:30:52

dr.miller писал(а): Пробовал искать 64-битную версию - пока не нашел.


И не найдешь ...
Аватара пользователя
Little_Roo
энтузиаст
 
Сообщения: 638
Зарегистрирован: 27.02.2009 19:56:36
Откуда: Санкт-Петербург

Re: Lazarus 30 64 bit и Zeos 6.6.6. Error:Bookmark was not f

Сообщение Vadim » 17.02.2012 11:03:35

dr.miller
Скачайте самую свежую версию: http://zeoslib.svn.sourceforge.net/view ... lib/trunk/
У меня тоже Ubuntu 64 - работает нормально. Правда с Postgre я не работаю - мощи не хватает. ;)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Lazarus 30 64 bit и Zeos 6.6.6. Error:Bookmark was not f

Сообщение dr.miller » 17.02.2012 11:18:51

Vadim спасибо, сейчас буду пробовать...

Добавлено спустя 1 час 3 минуты 48 секунд:
Re: Lazarus 30 64 bit и Zeos 6.6.6. Error:Bookmark was not found
Отлично, помогло. Огромное спасибо.

Кстати, если кто работает с zeos и юзает PostgreSQL, может напороться на проблему парсинга запросов, в которых прописано приведение типа. (Например select field::bigint from table). Проблема состоит в том что зеос считает что на месте такого приведения типа стоит параметр, заменяет двойное двоеточие на одинарное, и выдает ошибку выполнения запроса.

SQL Error: ERROR: syntax error at or near ":"
СТРОКА 1:select id_portfolio:bigint, 'test':characte..

Чтобы обойти этот трабл можно подкорректировать сорсы компонента (zeos 6.6.6, 7 - работает).

В модуле ZSqlStrings. Надо зменить метод TZSQLStrings.RebuildAll.
На
Код: Выделить всё
procedure TZSQLStrings.RebuildAll;
var
  Tokens: TStrings;
  TokenValue: string;
  TokenType: TZTokenType;
  TokenIndex: Integer;
  ParamIndex: Integer;
  ParamIndices: TIntegerDynArray;
  ParamIndexCount: Integer;
  ParamName, SQL: string;
  Tokenizer: IZTokenizer;

  procedure NextToken;
  begin
    TokenType := TZTokenType({$IFDEF FPC}Pointer({$ENDIF}
      Tokens.Objects[TokenIndex]{$IFDEF FPC}){$ENDIF});
    TokenValue := Tokens[TokenIndex];
    Inc(TokenIndex);
  end;

begin
  FParams.Clear;
  FStatements.Clear;
  SQL := '';
  ParamIndexCount := 0;
  SetLength(ParamIndices, ParamIndexCount);
 
  { Optimization for empty query. }
  If Length(Trim(Text)) = 0 then
    Exit;

  { Optimization for single query without parameters. }
  if (not FParamCheck or (Pos(FParamChar, Text) = 0))
    and (not FMultiStatements or (Pos(';', Text) = 0)) then
  begin
    FStatements.Add(TZSQLStatement.Create(Text, ParamIndices, FParams));
    Exit;
  end;

  Tokenizer:=GetTokenizer;
  Tokens := Tokenizer.TokenizeBufferToList(Text,
    [toSkipComments, toUnifyWhitespaces]);
  try
    TokenIndex := 0;
    repeat
      NextToken;
      { Processes parameters. }
      if ParamCheck and (TokenValue = FParamChar) then
      begin
        NextToken;
        if (TokenType <> ttEOF) and (TokenValue <> FParamChar) [b]and (TokenValue <> '=')[/b] then
        begin
          { Check for correct parameter type. }
          if not (TokenType in [ttWord, ttQuoted]) then
            raise EZDatabaseError.Create(SIncorrectToken);

          SQL := SQL + '?';

          ParamName := TokenValue;
          if (ParamName <> '') and (ParamName[1] in [#39, '`', '"', '[']) then
          begin
            ParamName := Tokenizer.GetQuoteState.
              DecodeString(ParamName, ParamName[1]);
          end;

          ParamIndex := FindParam(ParamName);
          if ParamIndex < 0 then
            ParamIndex := FParams.Add(ParamName);

          Inc(ParamIndexCount);
          SetLength(ParamIndices, ParamIndexCount);
          ParamIndices[ParamIndexCount - 1] := ParamIndex;

          Continue;
        end
        [b]else
          if (TokenType <> ttEOF) and ((TokenValue = ':') or (TokenValue = '=')) then
            SQL := SQL + ':';[/b]
      end;

      { Adds a DML statement. }
      if (TokenType = ttEOF) or (FMultiStatements and (TokenValue = ';')) then
      begin
        SQL := Trim(SQL);
        if SQL <> '' then
          FStatements.Add(TZSQLStatement.Create(SQL, ParamIndices, FParams));

        SQL := '';
        ParamIndexCount := 0;
        SetLength(ParamIndices, ParamIndexCount);
      end
      { Adds a default token. }
      else
        SQL := SQL + TokenValue;
    until TokenType = ttEOF;
  finally
    Tokens.Free;
  end;
end;
(с) исправления Оldwayder
Аватара пользователя
dr.miller
незнакомец
 
Сообщения: 7
Зарегистрирован: 17.11.2011 12:47:34
Откуда: Краснодар

Re: Lazarus 30 64 bit и Zeos 6.6.6. Error:Bookmark was not f

Сообщение alexs » 21.02.2012 20:39:23

dr.miller писал(а):Кстати, если кто работает с zeos и юзает PostgreSQL, может напороться на проблему парсинга запросов, в которых прописано приведение типа. (Например select field::bigint from table). Проблема состоит в том что зеос считает что на месте такого приведения типа стоит параметр, заменяет двойное двоеточие на одинарное, и выдает ошибку выполнения запроса.


А нефиг было в Postgre изобретать не стандартные расширения.
Шутка.

А на самом деле - используй приведение типа по стандарту (cast) - и будет счастье.

PS
7-й zeos нормально работает на 64 битах в линуксе.
Но там свои глюки. В транковом fpc без напильника рушится при уничтожении компоненты-запроса. Постараюсь разработчикам сегодня патчик отправить.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 80

Рейтинг@Mail.ru