MinGW(gcc)でFirebirdを使ってみる(1)
今回はMinGW(gcc)でInterBase APIを使用してFirebirdデータベースにアクセスするプログラムを作成します。
Firebirdの入手とインストール
Firebirdの入手
Firebirdのインストールについては「Firebirdのインストール」に記載していますので参照してください。
Firebird 1.5.2 を入手します。 ダウンロードはダウンロードページ から「Firebird-1.5.2.4731-Win32.exe」と「Firebird-1.5.2.4731_embed_win32.zip」をダウンロードします。
「Firebird-1.5.2.4731-Win32.exe」はデータベースパッケージ本体です。 「Firebird-1.5.2.4731_embed_win32.zip」は「Firebird 1.5.2 Embedded Server」で、データベースサービスを別途起動することなく ローカルでFirebirdのデータベースにアクセスすることができるDLLです。
Firebirdのインストール
「Firebird-1.5.2.4731-Win32.exe」はインストーラ形式ですので適当な場所にインストールします。 (後述する例では E:\Firebird_1_5 にインストールした場合の例となります) 「Firebird-1.5.2.4731_embed_win32.zip」も適当な場所に解凍します。
C++環境
筆者の環境は「MinGW 4.1.1」「MSYS 1.0.10」とEcripse(CDT)を利用しています。
InterBase APIを使用したアプリケーションの作成
InterBase API を利用するためのMakefileを作成
インストールフォルダ下の include と lib の下に InterBase APIを使用するためのヘッダファイルとライブラリがあります。 コンパイル時は include のサーチパスの追加とリンク時は静的ライブラリの fbclient_ms.lib をリンクします。 以下にMakefile例を記載します。ソースファイル名は sample1.cpp 、実行ファイル名は sample1.exe としています。
CXX = g++ CXXFLAGS = -g LDFLAGS = INCLUDES = -I. -Ie:/Firebird_1_5/include LIBS = e:/Firebird_1_5/lib/fbclient_ms.lib TARGET = sample1.exe SRCS = sample1.cpp OBJS = $(SRCS:.cpp=.o) all: $(TARGET) clean: -rm $(TARGET) $(OBJS) $(TARGET): $(OBJS) $(CXX) $(LDFLAGS) -o $@ $(OBJS) $(LIBS) .cpp.o: $(CXX) $(CXXFLAGS) $(INCLUDES) -c $< -o $@
ソースファイルの作成
まずは、InterBase API を使用するために ibase.h をインクルードします。
#include <ibase.h>
isc_dsql_execute_immediate()を使用してSQL文を発行します。 isc_dsql_execute_immediate()はステートメントの作成なしにSQL文が発行できます。 以下にサンプルを記載します。データベース作成後はデータベースにアタッチされた状態になりますので、 isc_detach_database()でデータベースをデタッチしています。 isc_db_handle はデータベースハンドル、 isc_tr_handle はトランザクションハンドルです。データベース作成時はトランザクションを開始しませんが、 isc_dsql_execute_immediate()のパラメータで必要ですのでNULLで初期化したエリアは定義し設定します。
isc_db_handle hDb = NULL; isc_tr_handle hTrn = NULL; ISC_STATUS_ARRAY status; char* sql1 = "CREATE DATABASE 'E:\\db\\test.fdb' USER 'SYSDBA' PASSWORD 'masterkey'"; if (isc_dsql_execute_immediate(status, &hDb, &hTrn, 0, sql1, 1, NULL)) { cerr << "Failed to create dadabase. status=" << isc_sqlcode(status) << endl; return 1; } if (isc_detach_database(status, &hDb)) { cerr << "Failed to detach database. status=" << isc_sqlcode(status) << endl; return 1; }
こんどはテーブルの作成です。最初にisc_attach_database()で作成したデータベースにアタッチします。 この時、ユーザ、パスワードをisc_expand_dpb()を使用して設定します。
次にCREATE TABLE文を発行します。isc_dsql_execute_immediate()を呼び出しますが、呼び出し前に isc_start_transaction()でトランザクションを開始し、呼び出し後、isc_commit_transaction()でコミット します。
最後はisc_detach_database()でデータベースをデタッチします。
char* sql2 = "CREATE TABLE sample1 ( ITEM1 NUMERIC(4), ITEM2 CHAR(4) )"; char* dpb = NULL; short dpbLen = 0; isc_expand_dpb(&dpb, &dpbLen, isc_dpb_user_name, "SYSDBA", isc_dpb_password, "masterkey", NULL); if (isc_attach_database(status, 0, "E:\\db\\test.fdb", &hDb, dpbLen, dpb)) { cerr << "Failed to attach dadabase. status=" << isc_sqlcode(status) << endl; return 1; } if (isc_start_transaction(status, &hTrn, 1, &hDb, 0, NULL)) { cerr << "Failed to start transaction. status=" << isc_sqlcode(status) << endl; return 1; } if (isc_dsql_execute_immediate(status, &hDb, &hTrn, 0, sql2, 1, NULL)) { cerr << "Failed to create table. status=" << isc_sqlcode(status) << endl; return 1; } if (isc_commit_transaction(status, &hTrn)) { cerr << "Failed to commit transaction. status=" << isc_sqlcode(status) << endl; return 1; } if (isc_detach_database(status, &hDb)) { cerr << "Failed to detach database. status=" << isc_sqlcode(status) << endl; return 1; }
ソースコードの例:sample1.cpp
makeの実行
作成したソースをコンパイル・リンクします。
例えば、MSYSからコンパイルする場合、Makefileとソースファイルを 同一フォルダに置き、MSYSのウインドウから、そのフォルダに移動し、 makeコマンドを実行します。
サンプルアプリケーションの実行
クライアントDLLの配置
fbclient.dll を実行するアプリケーションと同一フォルダにコピーします。 fbclient.dll はインストールフォルダ下の bin の下に格納されています。 (システムフォルダにコピーされている場合は必要ありません)
アプリケーションの実行
アプリケーションを実行します。うまく行けば、データベースとテーブルが作成 されます。上記DLLを使用する場合は Firebird が起動されている必要があります。 インストール時にデフォルトでは自動起動されるようになっています。 例の場合、データベースファイルを e:\db\test.fdb に作成しますので、予め e:\db フォルダは作成しておく必要があります。また、test.fdbが残っている場合は、 CREATE DATABASE 時にエラーになるため、削除してから実行してください。
isqlによる実行結果の確認
isqlの起動
isqlを起動します。[すべてのプログラム]-[Firebird_1_5]-[Firebird ISQL Tool] で起動できます。DOSプロンプトからインストールフォルダのbinの下のisql.exeを起動 してもかまいません。
データベースへの接続
isqlのプロンプトより、"CONNECT"でデータベースへ接続します。
Use CONNECT or CREATE DATABASE to specify a database SQL> CONNECT 'e:\db\test.fdb' USER 'SYSDBA' PASSWORD 'masterkey'; Database: 'e:\db\test.fdb', User: SYSDBA SQL>
テーブルの確認
isqlのプロンプトより、"SHOW TABLE" または "SHOW TABLE テーブル名"でテーブルを 表示します。
SQL> SHOW TABLE; SAMPLE1 SQL> SHOW TABLE SAMPLE1; ITEM1 NUMERIC(4, 0) Nullable ITEM2 CHAR(4) Nullable SQL>
終了する場合は、以下のように"QUIT"を発行します。
SQL> QUIT;
Firebird Embedded Serverでのサンプルアプリケーションの実行
Embedded Server用クライアントDLLの配置
上記で配置したfbclient.dllの代わりにFirebird-1.5.2.4731_embed_win32.zipを 解凍したフォルダ下の fbembed.dll を実行するアプリケーションと同一フォルダにコピーし、 fbclient.dllに名前を変更します。
Firebirdサーバ(サービス)の停止
Embedded ServerはFirebirdサーバアプリケーションが起動しなくてもデータベースに アクセスできます。違いを確認するため、Firebirdサーバを停止します。停止がサービス としてインストールした場合、サービス「Firebird Guardian - DefaultInstance」を停止 します。
アプリケーションの実行
上記で作成したデータベースファイルが残っている場合は削除してから、 アプリケーションを実行します。うまく行けば、データベースとテーブルが作成 されます。
isqlで確認する場合は、Firebirdサーバ(サービス)起動してから行います。停止している 場合はエラーになります。