Difference between revisions of "Firebird embedded/ru"

From Lazarus wiki
Jump to navigationJump to search
(Added other template. Deleted English categories.)
m (OSX -> macOS)
 
(11 intermediate revisions by one other user not shown)
Line 8: Line 8:
  
 
Преимущества:
 
Преимущества:
* работает на многих архитектурах (Linux, OSX, Windows, FreeBSD, Solaris)  
+
* работает на многих архитектурах (Linux, macOS, Windows, FreeBSD, Solaris)  
 
* отдельная настройка сервера не требуется, что снижает сложность использования
 
* отдельная настройка сервера не требуется, что снижает сложность использования
 
* вы можете легко переключаться с embedded на полноценный клиент/сервер - без изменения строк кода (кроме строки подключения). Это, вероятно, хорошее преимущество по сравнению с sqlite.
 
* вы можете легко переключаться с embedded на полноценный клиент/сервер - без изменения строк кода (кроме строки подключения). Это, вероятно, хорошее преимущество по сравнению с sqlite.
Line 17: Line 17:
 
* необходимо распространять некоторые библиотеки вместе с вашей программой при ее распространении (если вы не можете статически связать их)
 
* необходимо распространять некоторые библиотеки вместе с вашей программой при ее распространении (если вы не можете статически связать их)
  
== Warning: Windows x64 ==
+
== Предупреждение: Windows x64 ==
{{Warning|In versions of FPC below FPC 2.7.1 r23738 (March 2013), FPC x64 on Windows does not work well with the Firebird embedded dll - or other DLLs. The section below contains a workaround if you have an old FPC version}}
+
{{Warning|В версиях FPC ниже FPC 2.7.1 r23738 (март 2013 г.), FPC x64 в Windows не очень хорошо работает с embedded dll Firebird или другими DLL. Раздел ниже содержит обходной путь, если у вас есть старая версия FPC}}
  
On versions of FPC below 2.7.1 r23738 you can get errors/exceptions from the IBConnection object even if you write correct code (see e.g. [http://bugs.freepascal.org/view.php?id=21581 Create database bug report].
+
В версиях FPC ниже 2.7.1 r23738 вы можете получать ошибки/исключения объекта IBConnection, даже если вы пишете правильный код(см., например, [http://bugs.freepascal.org/view.php?id=21581 Create database bug report].
  
Workarounds:
+
Обходное решение:
# move to a development snapshot/FPC version after FPC 2.7.1 r23738; see [[http://wiki.lazarus.freepascal.org/User_Changes_3.0#Exception_handling_has_been_changed_to_be_ABI-conformant]]
+
# перейти к моментальному снимку разработки/версии FPC после FPC 2.7.1 r23738; см. [[User_Changes_3.0#Exception_handling_has_been_changed_to_be_ABI-conformant|Exception handling has been changed to be ABI-conformant]]  
# if on FPC 2.7.1 lower than r23738, compile FPC with -dTEST_WIN64_SEH in order to use the new Structured Exception Handling (SEH) code on Win64.
+
# если на FPC 2.7.1 ниже, чем r23738, скомпилируйте FPC с ключом <code>-dTEST_WIN64_SEH</code>, чтобы использовать новый код Структурированной Обработки Исключений (SEH) на Win64.  
# use a 32 bit FPC and Lazarus on Windows 64
+
# использовать 32-битную FPC и Lazarus на Windows 64
  
== Installation ==
+
== Установка ==
On Windows, Firebird embedded and regular Firebird client libraries are different files. Firebird embedded can always serve as a regular client, making it a logical choice for inclusion in your installation.
+
В Windows встроенный Firebird и обычные клиентские библиотеки Firebird - это разные файлы. Встроенный Firebird всегда может служить обычным клиентом, что делает его логичным выбором для включения в вашу установку.
  
  
 
=== Windows ===
 
=== Windows ===
Download and unzip the Firebird embedded kit. Make sure the .dll and .manifest files are either:
+
Загрузите и разархивируйте комплект embedded Firebird. Убедитесь, что файлы .dll и .manifest находятся либо:  
* in your project directory and executable output directory (where the .exe is generated) or
+
* в каталоге вашего проекта и в каталоге исполняемых файлов (где генерируется .exe), либо
* in a directory in your PATH (not your system directory) (useful if you don't want to keep copying dlls)
+
* в каталоге в вашем PATH (не в системном каталоге) (полезно, если вы не хотите сохранять скопированные dll)  
Note that bitness must match: you must use the 64 bit embedded version if you compile your program for 64 bit, and 32 if you're writing 32 bit programs.
 
Also make sure the the .dlls and .manifest files are placed in your project output (executable) directory, and distribute them with your applications, along with the license files.
 
  
As an indication, the minimum necessary files for Firebird 2.5 are:
+
Обратите внимание, что битность должна совпадать: вы должны использовать embedded x64 версию, если вы компилируете свою программу под 64-бит, и embedded x32, если вы пишете 32-битные программы. Также убедитесь, что файлы .dlls и .manifest размещены в выходном (исполняемом) каталоге вашего проекта, и распространяйте их вместе с приложениями и файлами лицензий.
 +
 
 +
Как указание, минимально необходимыми файлами для Firebird 2.5 являются:
 
* fbembed.dll
 
* fbembed.dll
 
* firebird.msg
 
* firebird.msg
Line 52: Line 52:
  
 
=== Linux ===
 
=== Linux ===
For Debian, probably similar for Ubuntu:
+
Для Debian, вероятно, похоже на Ubuntu:
Get library files as well as the symlink: e.g. /usr/lib/x86_64-linux-gnu/libfbembed.so linking to /user/lib/x86_64-linux-gnu/libfbembed.so.bla.x.y
+
получите файлы библиотеки, а также символическую ссылку: например, /usr/lib/x86_64-linux-gnu/libfbembed.so linking для /user/lib/x86_64-linux-gnu/libfbembed.so.bla.x.y
 
<syntaxhighlight lang=bash>
 
<syntaxhighlight lang=bash>
 
aptitude install libfbembed2.5 firebird-dev
 
aptitude install libfbembed2.5 firebird-dev
 
</syntaxhighlight>
 
</syntaxhighlight>
  
For at least Firebird 2.5+: Do not specify a username or password as that will force a lookup to security.fdb which may fail if system-wide security.fdb cannot be accessed. Do specify the role RDB$ADMIN on Firebird 2.5+ as that should give you full control over the database file.
+
По крайней мере, для Firebird 2.5+: не указывайте имя пользователя или пароль, так как это приведет к поиску security.fdb, что может привести к сбою в случае невозможности доступа к общесистемному security.fdb. Укажите роль RDB$ADMIN в Firebird 2.5+, так как она должна дать вам полный контроль над файлом базы данных.
  
Put these files in your project directory (to do: test if this is all needed):
+
Поместите эти файлы в каталог вашего проекта (для этого: проверьте, все ли это необходимо):
  firebird/libfbembed.so (or perhaps libfbembed.so.2.5)
+
  firebird/libfbembed.so (или возможно libfbembed.so.2.5)
 
  firebird.conf
 
  firebird.conf
  firebird/security.fdb #perhaps not necessary
+
  firebird/security.fdb #возможно, нет необходимости
 
  firebird/intl/fbintl
 
  firebird/intl/fbintl
 
  firebird/udf/fbudf.so
 
  firebird/udf/fbudf.so
  
For Firebird 3 you will need:
+
Для Firebird 3 вам понадобится:
 
  firebird/libfbclient.so
 
  firebird/libfbclient.so
 
  plugins/libEngine12.so
 
  plugins/libEngine12.so
  
You need to change plugins directory variable. If you cannot do that you need libEngine into its original directory.
+
Вам нужно изменить переменную каталога плагинов. Если вы не можете этого сделать, вам нужно поместить libEngine в его оригинальный каталог.
  
Had set this in firebird.conf (to do: check if this is all needed)
+
Установите это в firebird.conf (для этого: проверьте, все ли это необходимо)
 
<syntaxhighlight lang=ini>
 
<syntaxhighlight lang=ini>
RootDirectory=./firebird #replace with your directory
+
RootDirectory=./firebird #замените на ваш каталог
DatabaseAccess = Full #probably useful
+
DatabaseAccess = Full #наверное полезно
ExternalFileAccess = Full #probably useful
+
ExternalFileAccess = Full #наверное полезно
UdfAccess = Full #probably useful
+
UdfAccess = Full #наверное полезно
 
#disable
 
#disable
#TempDirectories = /tmp #=> didn't fix /tmp/firebird lock issues
+
#TempDirectories = /tmp #=> не удалось исправить проблемы блокировки /tmp/firebird
#TempDirectories = ~/tmp #=> didn't fix /tmp/firebird lock issues
+
#TempDirectories = ~/tmp #=> не удалось исправить проблемы блокировки /tmp/firebird
 
</syntaxhighlight>
 
</syntaxhighlight>
  
2 environment variables need to be set before the application is started.
+
Перед запуском приложения необходимо установить 2 переменные среды. Предположим, что приложение установлено в /home/pascaldev/embed:
Supposing the application is installed in /home/pascaldev/embed:
 
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
# tell dynamic loader where to find embedded lib:
+
# сообщаем динамическому загрузчику, где найти embedded lib:
 
LD_LIBRARY_PATH=/home/pascaldev/embed/firebird
 
LD_LIBRARY_PATH=/home/pascaldev/embed/firebird
# tell server where to find files (messages, config etc)
+
# сообщаем серверу, где искать файлы (сообщения, настройки и т. д.)
FIREBIRD=. #or use absolute path: /home/pascaldev/embed
+
FIREBIRD=. #или используйте абсолютный путь: /home/pascaldev/embed
 
</syntaxhighlight>
 
</syntaxhighlight>
  
If you hit errors like
+
Если вы поймали ошибку такую, как
  
 
  EIBDatabaseError/ : DoInternalConnect :
 
  EIBDatabaseError/ : DoInternalConnect :
 
   -Can't access lock files' directory /tmp/firebird
 
   -Can't access lock files' directory /tmp/firebird
  
you probably have stale lock files lying around that are owned by another user
+
возможно, у вас лежат устаревшие файлы блокировки, принадлежащие другому пользователю. Удаление каталога /tmp/firebird работает, но проблема в том, что он будет воссоздан под вашими локальными разрешениями.
Deleting the /tmp/firebird directory works, but the problem is that it will be recreated under your own local permissions
 
  
See [http://www.firebirdfaq.org/faq51/ How to setup Firebird embedded on Linux or Mac?] for hints on working with embedded Firebird on Linux or Apple OSX.
+
См. [http://www.firebirdfaq.org/faq51/ Как установить embedded Firebird на Linux or Mac?] для подсказок по работе со встроенным Firebird на Linux или Apple macOS.
Somebody used Firebird embedded with FPC: [http://www.mwasoftware.co.uk/index.php?option=com_content&task=view&id=105 Earlier version of Firebird embedded on Linux]
+
Кто-то использовал embedded Firebird в FPC: [http://www.mwasoftware.co.uk/index.php?option=com_content&task=view&id=105 Более ранняя версия embedded Firebird на Linux].
  
=== OSX ===
+
=== macOS ===
* todo: write this, perhaps adapt [http://www.mwasoftware.co.uk/index.php?option=com_content&task=view&id=105 Earlier version of Firebird embedded on Linux] and especially [http://paulbeachsblog.blogspot.mx/2012/09/firebird-embedded-on-macosx.html]
+
* todo: описать это, возможно адаптация [http://www.mwasoftware.co.uk/index.php?option=com_content&task=view&id=105 Более ранняя версия embedded Firebird на Linux] и особенно [http://paulbeachsblog.blogspot.mx/2012/09/firebird-embedded-on-macosx.html Firebird Embedded на macOS]
  
 
=== FreeBSD ===
 
=== FreeBSD ===
* to do: write this, perhaps adapt [http://www.mwasoftware.co.uk/index.php?option=com_content&task=view&id=105 Earlier version of Firebird embedded on Linux]
+
* to do: описать это, возможно адаптация [http://www.mwasoftware.co.uk/index.php?option=com_content&task=view&id=105 Более ранняя версия embedded Firebird на Linux]
  
== Connecting to Firebird servers ==
+
== Коннект к серверу Firebird ==
As mentioned, Firebird embedded can work like a regular Firebird client. Therefore, using the embedded Firebird library instead of the client/server Firebird library can help make your application more flexible.
+
Как уже упоминалось, встроенный Firebird может работать как обычный клиент Firebird. Следовательно, использование встроенной библиотеки Firebird вместо клиент-серверной библиотеки Firebird может помочь сделать ваше приложение более гибким.
  
Note: there is a bug at least in Firebird embedded 2.5.3 together with FPC 2.6.4 that crashes when closing a connection to a remote server. This bug has been fixed in FPC trunk.
+
{{Note| по крайней мере, в Firebird Embedded 2.5.3 и FPC 2.6.4 есть ошибка, которая вылетает при закрытии соединения с удаленным сервером. Эта ошибка была исправлена ​​в транке FPC.}}
  
== Use ==
+
== Использование ==
Once you have the proper Firebird embedded libraries in the right path (see above), you need to specify that you are connecting to an embedded instead of a client server environment.
+
Как только в вашем распоряжении окажутся подходящие библиотеки встроенного Firebird по правильному пути (см. выше), вам нужно указать, что вы подключаетесь к встроенной версии сервера, а не к клиент-серверной. Оставьте свойство hostname объекта ''IBConnection'' пустым. Остальные свойства работают так же, как в версии клиент/сервер, например DatabaseName - это полный путь к файлу .fdb или просто имя базы данных, если оно находится в том же каталоге, что и fbembed.dll. Кроме того, в старых версиях FPC (FPC 2.6.2+ это точно не нужно) может потребоваться установить для свойства UseEmbeddedFirebird значение true. Это свойство отсутствует в модуле SQLDB, но вам нужно добавить ''ibase60dyn'' в секцию uses.
Leave the hostname property of the ''IBConnection'' object empty.
 
The rest of the properties work like in the client/server version, e.g. the DatabaseName is the full path to your .fdb file - or just the database name if it is in the same directory as fbembed.dll.
 
Additionally, older versions of FPC (FPC 2.6.2+ certainly don't need this) may require that you set the ''UseEmbeddedFirebird'' property to true. The property is not present in the SQLDB units, but you need to add ''ibase60dyn'' to your uses clause.
 
  
=== Creating databases ===
+
=== Создание базы данных ===
==== Using Firebird ISQL ====
+
==== Использование Firebird ISQL ====
You can create databases by using the Firebird isql application (e.g. as provided in the regular Firebird (client) package).
+
Вы можете создавать базы данных с помощью приложения Firebird isql (например, как это предусмотрено в обычном пакете Firebird (клиент)). В Windows этот исполняемый файл должен находиться в том же каталоге, что и ваш fbembed.dll.
On Windows, this executable should be in the same directory as your fbembed.dll.
+
{{Note| isql ожидает библиотеку fbclient, а не fbembed; Вы можете скопировать и переименовать fbembed, например, в fbclient.dll в Windows, чтобы это исправить.}}
Note: isql expects the fbclient library, not fbembed; you can copy and rename fbembed, e.g. into fbclient.dll on Windows, to fix this.
+
 
Run '''isql''', then do:
+
Запустите '''isql''', затем сделайте:
 
<syntaxhighlight lang="sql">
 
<syntaxhighlight lang="sql">
 
create database 'employee.fdb' user 'SYSDBA' password 'masterkey' page_size 16384 default character set UTF8;
 
create database 'employee.fdb' user 'SYSDBA' password 'masterkey' page_size 16384 default character set UTF8;
Line 132: Line 127:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Dropping/deleting a database would basically mean deleting the file, but you can also run:
+
Удаление базы данных в основном означало бы удаление файла, но вы также можете запустить:
 
'''isql'''
 
'''isql'''
 
<syntaxhighlight lang="sql">
 
<syntaxhighlight lang="sql">
Line 141: Line 136:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
==== Programmatically ====
+
==== Программно ====
You can also create a database from within your program. The program in the [[#Creating the test database|Creating the test database]] section below shows how you can detect missing databases and create them on the fly.
+
Вы также можете создать базу данных из вашей программы. Программа в разделе [[Firebird_embedded/ru#.D0.A1.D0.BE.D0.B7.D0.B4.D0.B0.D0.BD.D0.B8.D0.B5_.D1.82.D0.B5.D1.81.D1.82.D0.BE.D0.B2.D0.BE.D0.B9_.D0.B1.D0.B0.D0.B7.D1.8B_.D0.B4.D0.B0.D0.BD.D0.BD.D1.8B.D1.85|Создание тестовой базы данных]] ниже показывает, как вы можете обнаружить отсутствующие базы данных и создать их на лету.
A similar procedure could be called in Lazarus applications when initializing your form (FormShow event).
 
  
=== Creating objects like tables,views,triggers,... ===
+
Аналогичная процедура может быть вызвана в приложениях Lazarus при инициализации вашей формы (событие FormShow).
Creating the objects - as most things - is the same in Firebird and Firebird embedded. Please see [[Firebird#Creating_objects_programmatically]]
 
  
== Running FPC database test suite ==
+
=== Создание таких объектов, как таблицы, вьюхи, триггеры,... ===
It can be useful to run the FPC database test framework (in packages\fcl-db\tests) when you are hunting bugs, trying to find out how something works, or improving the database code.
+
Создание объектов - как и большинство вещей - одинаково, что в embedded Firebird, что в Firebird. См. [[Firebird/ru#.D0.9F.D1.80.D0.BE.D0.B3.D1.80.D0.B0.D0.BC.D0.BC.D0.BD.D0.BE.D0.B5_.D1.81.D0.BE.D0.B7.D0.B4.D0.B0.D0.BD.D0.B8.D0.B5_.D0.BE.D0.B1.D1.8A.D0.B5.D0.BA.D1.82.D0.BE.D0.B2|Программное создание объектов]]
  
=== Telling the framework which database to use ===
+
== Запуск набора тестов базы данных FPC==
You will need to edit the db test framework .ini file to tell the test executable that it needs to use your embedded database.
+
Может быть полезно запускать среду тестирования базы данных FPC (в каталоге packages\fcl-db\tests), когда вы охотитесь за ошибками, пытаетесь выяснить, как что-то работает или улучшаете код базы данных.
See [[Databases#Running_FPC_database_tests]] for instructions on how to do this.
+
=== Сообщаем платформе, какую базу данных использовать ===
 +
Вам нужно будет отредактировать INI-файл db test framework, чтобы сообщить исполняемому файлу теста, что ему нужно использовать вашу встроенную базу данных.
 +
См. [[Databases/ru#.D0.92.D1.8B.D0.BF.D0.BE.D0.BB.D0.BD.D0.B5.D0.BD.D0.B8.D0.B5_.D1.82.D0.B5.D1.81.D1.82.D0.BE.D0.B2_.D0.B1.D0.B0.D0.B7.D1.8B_.D0.B4.D0.B0.D0.BD.D0.BD.D1.8B.D1.85_FPC|Выполнение тестов базы данных FPC]] для получения инструкций о том, как это сделать.
  
=== Creating the test database ===
+
=== Создание тестовой базы данных ===
If you have set up the framework to use Firebird, you will need to prepare the environment for testing.
+
Если вы настроили среду для использования Firebird, вам нужно будет подготовить среду для тестирования.  
  
Copy over the Firebird embedded libraries and other files for your architecture into the test directory.
+
Скопируйте библиотеки embedded Firebird и другие файлы для вашей архитектуры в тестовый каталог.  
  
Now create the test database - manually or programmatically
+
Затем создайте тестовую базу данных - вручную или программно/
  
==== Manually creating a database ====
+
==== Создание базы данных вручную ====
 
'''isql'''
 
'''isql'''
 
<syntaxhighlight lang="sql">
 
<syntaxhighlight lang="sql">
Line 169: Line 164:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
==== Programmatically creating a database ====
+
==== Программное создание базы данных ====
You can programmatically create a database. The example below creates a local, embedded database, but it can be easily changed to a remote database (adjust hostname and if necessary path):
+
Вы можете программно создать базу данных. В приведенном ниже примере создается локальная встроенная база данных, но ее можно легко изменить на удаленную базу данных (измените имя хоста и, если необходимо, путь):
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
program firebirdembeddedtest;
 
program firebirdembeddedtest;
 
{$mode objfpc}{$H+}
 
{$mode objfpc}{$H+}
Line 183: Line 178:
  
 
const
 
const
   // Name for the database. Be sure to specify the same name in your database.ini
+
   // Имя для базы данных. Обязательно укажите одно и то же имя в вашем database.ini
   DatabaseFile = 'test.fdb'; //Sensible name for a test database, right?
+
   DatabaseFile = 'test.fdb'; //Разумное имя для тестовой базы данных, верно?
 
var
 
var
 
   Fire: TIBConnection;
 
   Fire: TIBConnection;
  
 
begin
 
begin
   //Connection to Firebird database
+
   //Подключение к базе данных Firebird
   // The next line is needed for quite old FPC versions
+
   //Следующая строка нужна для довольно старых версий FPC
   // Newer versions will first look for fbembed.dll in the application directory automatically
+
   //UseEmbeddedFirebird: = true;
   //UseEmbeddedFirebird:=true; // Using embedded (and fbembed.dll) or regular client/server (fbclient.dll), requires ibase60dyn in uses
+
  //Более новые версии сначала будут искать файл fbembed.dll в каталоге приложения автоматически
 +
   //Использование встроенного (и fbembed.dll) или обычного клиент/сервера (fbclient.dll) требует использования ibase60dyn
 
   Fire:=TIBConnection.Create(nil);
 
   Fire:=TIBConnection.Create(nil);
 
   try
 
   try
     Fire.HostName := ''; //must be empty for embedded Firebird; must be filled for client/server Firebird
+
     Fire.HostName := ''; //должен быть пустым для embedded Firebird; должен быть заполнен для клиент/сервера Firebird
     Fire.DatabaseName := DatabaseFile; //(path and) filename
+
     Fire.DatabaseName := DatabaseFile; //(путь и ) имя файла
     // Username and password do not matter for authentication, but you do get authorizations in the database
+
     // Имя пользователя и пароль не имеют значения для аутентификации, но вы получаете авторизацию в базе данных   
     // based on the name (and optionally role) you give.
+
     // на основе имени (и, возможно, роли), которое вы даете.
 
     Fire.Username := 'SYSDBA';
 
     Fire.Username := 'SYSDBA';
     Fire.Password := 'masterkey'; //default password for SYSDBA
+
     Fire.Password := 'masterkey'; //пароль для SYSDBA по умолчанию
     Fire.Charset := 'UTF8'; //Send and receive string data in UTF8 encoding
+
     Fire.Charset := 'UTF8'; //Отправка и получение строковых данных в кодировке UTF8
     Fire.Dialect := 3; //Nobody uses 1 or 2 anymore.
+
     Fire.Dialect := 3; //Никто больше не использует диалекты 1 или 2 (прим.перев.: это справедливо лишь в отношении новых проектов)
     Fire.Params.Add('PAGE_SIZE=16384'); //I like a large page size (used when creating a database). Useful for larger indexes=>larger possible column sizes
+
     Fire.Params.Add('PAGE_SIZE=16384'); //Мне нравится большой размер страницы (используется при создании базы данных). Полезно для больших индексов ⇒ больший возможный размер столбца
 
+
     // Выясните, есть ли база данных в каталоге приложения.  
     // Find out if there is a database in the application directory.
+
     // Если нет, создайте его. Примечание: это может не сработать, если у вас недостаточно прав.
     // If not, create it. Note: this may fail if you don't have enough permissions.
 
  
     // If you use client/server, you obviously don't need this part of the code.
+
     // Если вы используете клиент / сервер, вам явно не нужна эта часть кода.
     if (FileExists(DatabaseFile)=false) then
+
     if (not FileExists(DatabaseFile)) then
 
     begin
 
     begin
         writeln('File '+DatabaseFile+' does not exist.');
+
         writeln('Файл '+DatabaseFile+' не существует.');
         writeln('Creating a Firebird embedded database...');
+
         writeln('Создание базы данных Firebird embedded ...');
         // Create the database as it doesn't exist
+
         // Создаем базу данных, поскольку она не существует
 
         try
 
         try
           Fire.CreateDB; //Create the database file.
+
           Fire.CreateDB; //Создаем файл базы данных.
 
         except
 
         except
 
           on E: Exception do
 
           on E: Exception do
 
           begin
 
           begin
             writeln('ERROR creating database. Probably problems loading embedded library:');
+
             writeln('ОШИБКА при создании базы данных. Возможно проблемы с загрузкой встроенной библиотеки:');
             writeln('- not all files present');
+
             writeln('- не все файлы присутствуют');
             writeln('- wrong architecture (e.g. 32 bit instead of 64 bit)');
+
             writeln('- неправильная архитектура (например, 32 бит вместо 64 бит)');
 
             writeln('Exception message:');
 
             writeln('Exception message:');
 
             writeln(E.ClassName+'/'+E.Message);
 
             writeln(E.ClassName+'/'+E.Message);
Line 234: Line 229:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
=== Running the test suite ===
+
=== Запуск набора тестов ===
Finally compile and run the ''dbtestframework.pas'' database test program. It should generate status output on the console and XML output in files with test results that can be analysed and sent to developers.
+
Наконец, скомпилируйте и запустите ''dbtestframework.pas'' программы тестирования базы данных. Он должен генерировать вывод состояния на консоли и вывод XML в файлах с результатами теста, которые можно проанализировать и отправить разработчикам.
  
== External references ==
+
== Внешние ссылки ==
* [http://www.firebirdfaq.org/faq51/ How to setup Firebird embedded on Linux or Mac?]
+
* [http://www.firebirdfaq.org/faq51/ Как настроить embedded Firebird для Linux или Mac?] (англ.)
* [http://www.mwasoftware.co.uk/index.php?option=com_content&task=view&id=105 Earlier version of Firebird embedded on Linux]
+
* [http://www.mwasoftware.co.uk/index.php?option=com_content&task=view&id=105 Более ранняя версия embedded Firebird на Linux](англ.)

Latest revision as of 01:52, 27 January 2020

English (en) русский (ru)

Что это такое

Firebird Embedded - это специальная версия сервера баз данных Firebird. Она позволяет вам запускать ваши программы без выделенного (прим.перев.: предварительно запущенного) сервера базы данных. Вместо этого вы добавляете библиотеку (.dll/.so/.dylib) в свое приложение) и позволяете вашему приложению получать доступ к файлу базы данных Firebird .fdb с помощью этой библиотеки.

Это похоже на работу таких программ, как Microsoft Access и LibreOffice Base.

Преимущества:

  • работает на многих архитектурах (Linux, macOS, Windows, FreeBSD, Solaris)
  • отдельная настройка сервера не требуется, что снижает сложность использования
  • вы можете легко переключаться с embedded на полноценный клиент/сервер - без изменения строк кода (кроме строки подключения). Это, вероятно, хорошее преимущество по сравнению с sqlite.
  • прим.перев.: не требуется пароль (он может быть произвольным)

Недостатки:

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

Предупреждение: Windows x64

Warning-icon.png

Предупреждение: В версиях FPC ниже FPC 2.7.1 r23738 (март 2013 г.), FPC x64 в Windows не очень хорошо работает с embedded dll Firebird или другими DLL. Раздел ниже содержит обходной путь, если у вас есть старая версия FPC

В версиях FPC ниже 2.7.1 r23738 вы можете получать ошибки/исключения объекта IBConnection, даже если вы пишете правильный код(см., например, Create database bug report.

Обходное решение:

  1. перейти к моментальному снимку разработки/версии FPC после FPC 2.7.1 r23738; см. Exception handling has been changed to be ABI-conformant
  2. если на FPC 2.7.1 ниже, чем r23738, скомпилируйте FPC с ключом -dTEST_WIN64_SEH, чтобы использовать новый код Структурированной Обработки Исключений (SEH) на Win64.
  3. использовать 32-битную FPC и Lazarus на Windows 64

Установка

В Windows встроенный Firebird и обычные клиентские библиотеки Firebird - это разные файлы. Встроенный Firebird всегда может служить обычным клиентом, что делает его логичным выбором для включения в вашу установку.


Windows

Загрузите и разархивируйте комплект embedded Firebird. Убедитесь, что файлы .dll и .manifest находятся либо:

  • в каталоге вашего проекта и в каталоге исполняемых файлов (где генерируется .exe), либо
  • в каталоге в вашем PATH (не в системном каталоге) (полезно, если вы не хотите сохранять скопированные dll)

Обратите внимание, что битность должна совпадать: вы должны использовать embedded x64 версию, если вы компилируете свою программу под 64-бит, и embedded x32, если вы пишете 32-битные программы. Также убедитесь, что файлы .dlls и .manifest размещены в выходном (исполняемом) каталоге вашего проекта, и распространяйте их вместе с приложениями и файлами лицензий.

Как указание, минимально необходимыми файлами для Firebird 2.5 являются:

  • fbembed.dll
  • firebird.msg
  • ib_util.dll
  • icudt30.dll
  • icuin30.dll
  • icuuc30.dll
  • IDPLicense.txt
  • IPLicense.txt
  • Microsoft.VC80.CRT.manifest
  • msvcp80.dll
  • msvcr80.dll

Linux

Для Debian, вероятно, похоже на Ubuntu: получите файлы библиотеки, а также символическую ссылку: например, /usr/lib/x86_64-linux-gnu/libfbembed.so linking для /user/lib/x86_64-linux-gnu/libfbembed.so.bla.x.y

aptitude install libfbembed2.5 firebird-dev

По крайней мере, для Firebird 2.5+: не указывайте имя пользователя или пароль, так как это приведет к поиску security.fdb, что может привести к сбою в случае невозможности доступа к общесистемному security.fdb. Укажите роль RDB$ADMIN в Firebird 2.5+, так как она должна дать вам полный контроль над файлом базы данных.

Поместите эти файлы в каталог вашего проекта (для этого: проверьте, все ли это необходимо):

firebird/libfbembed.so (или возможно libfbembed.so.2.5)
firebird.conf
firebird/security.fdb #возможно, нет необходимости 
firebird/intl/fbintl
firebird/udf/fbudf.so

Для Firebird 3 вам понадобится:

firebird/libfbclient.so
plugins/libEngine12.so

Вам нужно изменить переменную каталога плагинов. Если вы не можете этого сделать, вам нужно поместить libEngine в его оригинальный каталог.

Установите это в firebird.conf (для этого: проверьте, все ли это необходимо)

RootDirectory=./firebird #замените на ваш каталог
DatabaseAccess = Full #наверное полезно
ExternalFileAccess = Full #наверное полезно
UdfAccess = Full #наверное полезно
#disable
#TempDirectories = /tmp #=> не удалось исправить проблемы блокировки /tmp/firebird
#TempDirectories = ~/tmp #=> не удалось исправить проблемы блокировки /tmp/firebird

Перед запуском приложения необходимо установить 2 переменные среды. Предположим, что приложение установлено в /home/pascaldev/embed:

# сообщаем динамическому загрузчику, где найти embedded lib:
LD_LIBRARY_PATH=/home/pascaldev/embed/firebird
# сообщаем серверу, где искать файлы (сообщения, настройки и т. д.)
FIREBIRD=. #или используйте абсолютный путь: /home/pascaldev/embed

Если вы поймали ошибку такую, как

EIBDatabaseError/ : DoInternalConnect :
 -Can't access lock files' directory /tmp/firebird

возможно, у вас лежат устаревшие файлы блокировки, принадлежащие другому пользователю. Удаление каталога /tmp/firebird работает, но проблема в том, что он будет воссоздан под вашими локальными разрешениями.

См. Как установить embedded Firebird на Linux or Mac? для подсказок по работе со встроенным Firebird на Linux или Apple macOS. Кто-то использовал embedded Firebird в FPC: Более ранняя версия embedded Firebird на Linux.

macOS

FreeBSD

Коннект к серверу Firebird

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

Light bulb  Примечание: по крайней мере, в Firebird Embedded 2.5.3 и FPC 2.6.4 есть ошибка, которая вылетает при закрытии соединения с удаленным сервером. Эта ошибка была исправлена ​​в транке FPC.

Использование

Как только в вашем распоряжении окажутся подходящие библиотеки встроенного Firebird по правильному пути (см. выше), вам нужно указать, что вы подключаетесь к встроенной версии сервера, а не к клиент-серверной. Оставьте свойство hostname объекта IBConnection пустым. Остальные свойства работают так же, как в версии клиент/сервер, например DatabaseName - это полный путь к файлу .fdb или просто имя базы данных, если оно находится в том же каталоге, что и fbembed.dll. Кроме того, в старых версиях FPC (FPC 2.6.2+ это точно не нужно) может потребоваться установить для свойства UseEmbeddedFirebird значение true. Это свойство отсутствует в модуле SQLDB, но вам нужно добавить ibase60dyn в секцию uses.

Создание базы данных

Использование Firebird ISQL

Вы можете создавать базы данных с помощью приложения Firebird isql (например, как это предусмотрено в обычном пакете Firebird (клиент)). В Windows этот исполняемый файл должен находиться в том же каталоге, что и ваш fbembed.dll.

Light bulb  Примечание: isql ожидает библиотеку fbclient, а не fbembed; Вы можете скопировать и переименовать fbembed, например, в fbclient.dll в Windows, чтобы это исправить.

Запустите isql, затем сделайте:

create database 'employee.fdb' user 'SYSDBA' password 'masterkey' page_size 16384 default character set UTF8;
exit;

Удаление базы данных в основном означало бы удаление файла, но вы также можете запустить: isql

connect 'employee.fdb' user 'sysdba' password 'masterkey';
drop database;
commit;
exit;

Программно

Вы также можете создать базу данных из вашей программы. Программа в разделе Создание тестовой базы данных ниже показывает, как вы можете обнаружить отсутствующие базы данных и создать их на лету.

Аналогичная процедура может быть вызвана в приложениях Lazarus при инициализации вашей формы (событие FormShow).

Создание таких объектов, как таблицы, вьюхи, триггеры,...

Создание объектов - как и большинство вещей - одинаково, что в embedded Firebird, что в Firebird. См. Программное создание объектов

Запуск набора тестов базы данных FPC

Может быть полезно запускать среду тестирования базы данных FPC (в каталоге packages\fcl-db\tests), когда вы охотитесь за ошибками, пытаетесь выяснить, как что-то работает или улучшаете код базы данных.

Сообщаем платформе, какую базу данных использовать

Вам нужно будет отредактировать INI-файл db test framework, чтобы сообщить исполняемому файлу теста, что ему нужно использовать вашу встроенную базу данных. См. Выполнение тестов базы данных FPC для получения инструкций о том, как это сделать.

Создание тестовой базы данных

Если вы настроили среду для использования Firebird, вам нужно будет подготовить среду для тестирования.

Скопируйте библиотеки embedded Firebird и другие файлы для вашей архитектуры в тестовый каталог.

Затем создайте тестовую базу данных - вручную или программно/

Создание базы данных вручную

isql

create database 'test.fdb' user 'SYSDBA' password 'masterkey' page_size 16384 default character set UTF8;
exit;

Программное создание базы данных

Вы можете программно создать базу данных. В приведенном ниже примере создается локальная встроенная база данных, но ее можно легко изменить на удаленную базу данных (измените имя хоста и, если необходимо, путь):

program firebirdembeddedtest;
{$mode objfpc}{$H+}

uses 
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF} 
  Classes, SysUtils,
  sqldb, IBConnection {for Firebird};

const
  // Имя для базы данных. Обязательно укажите одно и то же имя в вашем database.ini
  DatabaseFile = 'test.fdb'; //Разумное имя для тестовой базы данных, верно?
var
  Fire: TIBConnection;

begin
  //Подключение к базе данных Firebird
  //Следующая строка нужна для довольно старых версий FPC
  //UseEmbeddedFirebird: = true; 
  //Более новые версии сначала будут искать файл fbembed.dll в каталоге приложения автоматически 
  //Использование встроенного (и fbembed.dll) или обычного клиент/сервера (fbclient.dll) требует использования ibase60dyn
  Fire:=TIBConnection.Create(nil);
  try
    Fire.HostName := ''; //должен быть пустым для embedded Firebird; должен быть заполнен для клиент/сервера Firebird
    Fire.DatabaseName := DatabaseFile; //(путь и ) имя файла
    // Имя пользователя и пароль не имеют значения для аутентификации, но вы получаете авторизацию в базе данных    
    // на основе имени (и, возможно, роли), которое вы даете.
    Fire.Username := 'SYSDBA';
    Fire.Password := 'masterkey'; //пароль для SYSDBA по умолчанию
    Fire.Charset := 'UTF8'; //Отправка и получение строковых данных в кодировке UTF8
    Fire.Dialect := 3; //Никто больше не использует диалекты 1 или 2 (прим.перев.: это справедливо лишь в отношении новых проектов)
    Fire.Params.Add('PAGE_SIZE=16384'); //Мне нравится большой размер страницы (используется при создании базы данных). Полезно для больших индексов ⇒ больший возможный размер столбца
    // Выясните, есть ли база данных в каталоге приложения. 
    // Если нет, создайте его. Примечание: это может не сработать, если у вас недостаточно прав.

    // Если вы используете клиент / сервер, вам явно не нужна эта часть кода.
    if (not FileExists(DatabaseFile)) then
    begin
        writeln('Файл '+DatabaseFile+' не существует.');
        writeln('Создание базы данных Firebird embedded ...');
        // Создаем базу данных, поскольку она не существует
        try
          Fire.CreateDB; //Создаем файл базы данных.
        except
          on E: Exception do
          begin
            writeln('ОШИБКА при создании базы данных. Возможно проблемы с загрузкой встроенной библиотеки:');
            writeln('- не все файлы присутствуют');
            writeln('- неправильная архитектура (например, 32 бит вместо 64 бит)');
            writeln('Exception message:');
            writeln(E.ClassName+'/'+E.Message);
          end;
        end;
        Fire.Close;
    end;
  finally
    Fire.Free;
  end; 
end.

Запуск набора тестов

Наконец, скомпилируйте и запустите dbtestframework.pas программы тестирования базы данных. Он должен генерировать вывод состояния на консоли и вывод XML в файлах с результатами теста, которые можно проанализировать и отправить разработчикам.

Внешние ссылки