FIBL

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

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

FIBL

Сообщение tria » 16.10.2007 16:45:49

В общем-то вопросы к Sergey Smirnov

1. Модуль FIBQuery.pas, функция TFIBXSQLVAR.GetAsString.
Есть желание, чтобы для поля типа BLOB возвращалось не:
Код: Выделить всё
SQL_BLOB:
        result := '(Blob)';

а строка из блоба? Напрмер так:
Код: Выделить всё
SQL_BLOB:
ss := TStringStream.Create('');
        try
          SaveToStream(ss);
          result := ss.DataString;
        finally
          ss.Free;
        end;

Напрмер, делалоь бы это параметрически, исходя из какого-нибудь нового свойства TFIBQuery?

2. Может что-то не так делаю, но при использовании FIBL в Линуксе возникли проблемы в связи с тем, что названия файлов все с маленьких букв, а в *.pas все названия модулей начинаются с больших букв (пришлось переименовывать).
tria
постоялец
 
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10

Re: FIBL

Сообщение Сергей Смирнов » 16.10.2007 18:21:03

tria писал(а):В общем-то вопросы к Sergey Smirnov

1. Модуль FIBQuery.pas, функция TFIBXSQLVAR.GetAsString.
Есть желание, чтобы для поля типа BLOB возвращалось не:
Код: Выделить всё
SQL_BLOB:
        result := '(Blob)';

а строка из блоба? Напрмер так:
Код: Выделить всё
SQL_BLOB:
ss := TStringStream.Create('');
        try
          SaveToStream(ss);
          result := ss.DataString;
        finally
          ss.Free;
        end;

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

tria писал(а):2. Может что-то не так делаю, но при использовании FIBL в Линуксе возникли проблемы в связи с тем, что названия файлов все с маленьких букв, а в *.pas все названия модулей начинаются с больших букв (пришлось переименовывать).
Я последние версии под линуксом не проверял, а раньше всё вроде работало... исправлю, конечно, хотя странно это...
Аватара пользователя
Сергей Смирнов
энтузиаст
 
Сообщения: 595
Зарегистрирован: 28.04.2005 13:23:25
Откуда: Москва

Сообщение tria » 16.10.2007 18:33:11

Раз уж пошла такая пьянка, то если можно такой вопрос.
Пытаюсь програмно создать базу данных.
Вот код:
Код: Выделить всё
  Database1:=TFIBDatabase.Create(nil);
  Database1.DBName:='d:\1111.fdb';
  Database1.DBParams.Clear;
//  Database1.DBParams.Add('SQL_DIALECT = 3');
  Database1.DBParams.Add('USER ''sysdba''');
  Database1.DBParams.Add('PASSWORD ''masterkey''');
  Database1.DBParams.Add('PAGE_SIZE = 4096');
  Database1.DBParams.Add('DEFAULT CHARACTER SET WIN1251');
  Database1.CreateDatabase;


Работает, но создает базу в Dialect1.

Если убрать комментарий на SQL_DIALECT = 3, то выдает ошибку, что нет такого пользователя ("Your user name and password not defined").

А мне надо бы базу создать в диалекте 3...
tria
постоялец
 
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10

Сообщение tria » 16.10.2007 18:35:03

Да, и если кинуть на форму Database, прописать путь к создаваемому файлу, то будет та же ошибка.
Firebird 1.5.2
tria
постоялец
 
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10

Сообщение Сергей Смирнов » 16.10.2007 20:41:09

tria писал(а):
Работает, но создает базу в Dialect1.

Если убрать комментарий на SQL_DIALECT = 3, то выдает ошибку, что нет такого пользователя ("Your user name and password not defined").

А мне надо бы базу создать в диалекте 3...
Там в методе TFIBDatabase.CreateDatabase происходит вызов api-функции с жестко прошитым первым диалектом. Можно попробовать тупо заменить его на третий, но, похоже, что-то там не так просто. У меня не прокатывает по крайней мере - вылетает с AV.
Мне этот метод как-то вообще не был нужен (и врядли будет) и я с ним не разбирался.
Аватара пользователя
Сергей Смирнов
энтузиаст
 
Сообщения: 595
Зарегистрирован: 28.04.2005 13:23:25
Откуда: Москва

Сообщение tria » 17.10.2007 16:00:13

Разобрался с CreateDatabase;
Необходимо следующее:
1. Заменить:
Код: Выделить всё
PChar('CREATE DATABASE "' + FDBName + '" ' +

на
Код: Выделить всё
PChar('CREATE DATABASE ''' + FDBName + ''' ' +

2. Из DBParams убрать строку 'sql_dialect=3'

В качестве решения предлагаю:
1. Ввести поле (private)
Код: Выделить всё
  FSQLDialect:integer;                                //SQL dialect

2. Переопределеить:
Код: Выделить всё
  property Dialect: integer read FSQLDialect write SetDialect;

3. В TFIBDatabase.SetDialect(const AValue: integer) добавить строку:
Код: Выделить всё
FSQLDialect:=AValue;

4. В Create добавить строку FSQLDialect:=3;
5. Заменить в CreateDatabase вызов на:
Код: Выделить всё
  Call(
    @status_vector,
    isc_dsql_execute_immediate(@status_vector, @FHandle, @tr_handle, 0,
                               PChar('CREATE DATABASE ''' + FDBName + ''' ' +
                               DBParams.Text), Dialect, nil),

Ну и по-хорошему, надо перед этим вызовом убирать из DBParams строку 'sql_dialect=3'.
Могу доделать и выслать работающий исходник.

П.С. Решение подсмотрел в Делфи... Только там чуть более накручено.
tria
постоялец
 
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10

Сообщение Сергей Смирнов » 18.10.2007 21:56:03

Спасибо, что разобрался с этим. Кавычки надо было заменить на апострофы? Я что-то такое предполагал :)
С диалектом хочу предложить сделать предельно тупо: просто вбить туда 3-й и всё. Кому первый-то нужен в новой базе?
Ну и строку sql_dialect=3 в параметрах надо прибивать, да, но это не проблема.
Аватара пользователя
Сергей Смирнов
энтузиаст
 
Сообщения: 595
Зарегистрирован: 28.04.2005 13:23:25
Откуда: Москва

Сообщение alexs » 19.10.2007 00:12:11

А вдруг птицеведы придумают 5 диалект? :-)
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Сообщение tria » 19.10.2007 10:21:32

Сергей Смирнов писал(а):Спасибо, что разобрался с этим. Кавычки надо было заменить на апострофы? Я что-то такое предполагал :)
С диалектом хочу предложить сделать предельно тупо: просто вбить туда 3-й и всё. Кому первый-то нужен в новой базе?
Ну и строку sql_dialect=3 в параметрах надо прибивать, да, но это не проблема.

Может все-таки как свойство?
И если можно, то в следующую версию включить изменения, а то мне придется вручную править...
tria
постоялец
 
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10

Сообщение Сергей Смирнов » 19.10.2007 11:28:43

alexs писал(а):А вдруг птицеведы придумают 5 диалект? :-)
С их темпами... ну, к 2020 году может и придумают :)

Ладно, пусть будет свойство - в следующем обновлении. Хотя это немного геморнее... но я не боюсь трудностей :D
Аватара пользователя
Сергей Смирнов
энтузиаст
 
Сообщения: 595
Зарегистрирован: 28.04.2005 13:23:25
Откуда: Москва

Сообщение tria » 19.10.2007 13:13:50

Напоминаю: если надо, могу выслать переделанный работающий исходник.
Правда, без удаления строки "sql_dialect=3" - это я обошел ручками у себя в программе.
tria
постоялец
 
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10

Сообщение NewUser » 19.10.2007 14:41:00

а где взять fibl?
NewUser
новенький
 
Сообщения: 97
Зарегистрирован: 08.05.2007 13:28:40

Сообщение Сергей Смирнов » 24.10.2007 15:12:29

Ну, в общем, кое-как починил CreateDatabase. Теперь это работает с обычными параметрами соединения. Т.е. можно кинуть на форму TFIBDatabase и установить свойства как обычно. При этом диалект, имя юзера, пароль, роль и кодовая страница попадают в список параметров DBParams автоматом. Там получается что-то вроде:
Код: Выделить всё
user_name=SYSDBA
password=masterkey
sql_role_name=NONE
sql_dialect=3
lc_ctype=WIN1251
page_size=16384

Вот только page_size=16384 надо добавить вручную. На работу соединения он никак не влияет, используется только в CreateDatabase. А параметр sql_role_name, наоборот, никак не влияет на работу CreateDatabase.

Благодаря такому подходу можно использовать TFIBDatabase и по прямому назначению (напомню, что раньше для запуска CreateDatabase параметры надо было записывать особым образом, не пригодным для обычной работы компонента).

Если же нужно использовать в CreateDatabase совсем уж продвинутые параметры (FILE, STARTING и LENGTH), то кусок команды с ними надо записать в строку и передать в CreateDatabase (я перегрузил этот метод). При вызове команды CREATE DATABASE строка с этими параметрами будет просто добавлена в конец строки, сформированной автоматически на базе информации из DBParams.

Качать как обычно, с соцфоржа. Версия 0.7.3
Аватара пользователя
Сергей Смирнов
энтузиаст
 
Сообщения: 595
Зарегистрирован: 28.04.2005 13:23:25
Откуда: Москва

Сообщение tria » 07.11.2007 14:51:38

По поводу 0.7.3 - предолжение по оптимизации по скорости.
Свойство Dialect используется, как я понимаю, в большинстве вызовов. При этом оно берется :
function TFIBDatabase.GetDialect: UShort;
begin
try
result := StrToInt(DBParamByDPB[isc_dpb_sql_dialect]);
except
result := 0;
end;
end;
То есть при каждом запросе перебираются параметры Database, сравнение строк, конвертация строка/число.

А нельзя ли сделать как в Делфи - переменную, куда при присвоении диалекта заносить его значение и потом оттудова и брать?

Понимаю, что может возникнуть ситуация, когда кто-то руками заполнит параметры Database и пойдет разница между этим полем и параметрами соединения. Однако думаю, что если кто руками заполняет - то он уж знает чего делает...
tria
постоялец
 
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10

Сообщение tria » 07.11.2007 15:41:03

Готов сделать сам и результат выслать Вам...
tria
постоялец
 
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10

След.

Вернуться в Lazarus

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

Сейчас этот форум просматривают: MailRu[bot] и гости: 48

Рейтинг@Mail.ru