(2015/10/01~)
2015/10/03

IBConsole 日本語版+α

集中更新。

コンパイラを XE3 から XE8 に変えました。XE8 ではフィールド (TField) の読み書き速度の向上が行われており、IBConsole のパフォーマンス向上が望めるからです。

コンパイラを 10 Seattle にしなかったのには理由があります。IBConsole では環境設定に使われるオブジェクトインスペクタモドキに StringGrid を使っているのですが、これは本当にドット単位で位置調整してあります (本家のは 2~3 ドットズレていたりします)。10 Seattle で開いてしまうとこの位置調整がすべてパーになってしまいます。それと、10 Seattle は恐らく Update 1 がリリースされます。機能追加もないのに RTM と Update 1 の二回も SynEdit / IBX の修正を行うのは嫌なのでコンパイラを上げるとしても 10 Seattle Update 1 がリリースされてからになるかと思います。

XE8 でコンパイルするようにしたのはいいのですが、案の定あちこちでリグレッションが起きてしまいました。コンパイラを変えると SynEdit / IBX で問題が発生します。もちろん、前のコンパイラでやっていたように修正を施す訳ですが、SynEdit も IBX もバージョンアップしていますから、以前の修正と全く同じではちゃんと動作しない事があります。

さて、前置きはこの辺にして、修正内容の説明に入りましょう。まず最初の変更点ですが、使用しているサーバが Firebird でも [データベースのプロパティ] - [一般] タブにある "オプション" を変更できるようになりました。

IBConsole は元々 Interbase 用のツールなため、[データベースのプロパティ] で行えるハズの設定変更が Firebird ではできませんでした。例えば CD / DVD で Firebird Embedded Server を使う場合にはデータベースを [読み取り専用] にする必要があるのですが、これができるようになりました。

この機能はデータベースがアクティブの時に使えますが、gfix で同様の事を行う場合 (gfix -mode) にはデータベースセッションがあってはいけません。誰も DB にアクセスしない状態で行う必要があります。何か矛盾しているようですが、データベースの情報を取得するには DB に接続しなければならず、その設定を変更する際には閉じていないといけないというだけです。IBConsole でこの操作を行う際には設定変更前に内部的にセッションをクローズし、設定を変更してからセッションをオープンし直すという事をやっています。C/S 形態で他のユーザが接続している場合にはそれもクローズしておかないと設定変更に失敗するので注意が必要です。

次の変更点ですが、ANSI / UNICODE 32bit / UNICODE 64bit Edition を別々に起動できるようになりました。

例えば 64bit Windows の環境ですと、ANSI (32bit) 版 / UNICODE (32bit) 版 / UNICODE (64bit) 版の三つを同時に起動可能です。同時起動防止自体は効いているので、例えば Unicode (32bit) 版を同時に二つ起動する事はできません。また、レジストリは共通となりますので、それぞれで異なる設定にする事はできません...このままでは (後述します)。

そして、地味に嬉しい変更点が Firebird Embedded Server 2.5.x 以降でも動作するようになった事です。
(追記) IBLite / Interbase To-Go Edition でも動作するようです。

従来の Firebird Embedded Server はサーバ機能を有しておらず、Interbase / Firebird のサーバ API の実行はできませんでした。これは Firebird Embedded Server で IBConsole が使えない事を意味します。

ところが…偶然の発見なのですが Firebird Embedded Server 2.5.x ではサーバ API の実行が可能な事が判りました。IBConsole ではローカルサーバが起動していない場合、ローカルサーバを起動しようとします。ここでローカルサーバを起動できないと接続に失敗するのですが、[ヘルプ | ローカルサーバの設定] で "Embedded Server" を選択すると、このローカルサーバ起動をスキップするようにしました。

これにより、Firebird Embedded Server を組み込んだスタンドアロン DB アプリと同じ場所に IBConsole.exe を放り込んでおけばデータの編集を IBConsole に任せる事ができるようになりました。

幾つかの修正を IBConsole に施しましたが、根本的な問題に突き当たってしまいました。IBConsole は設定にレジストリを使っているのですが、ここが同一のため複数の IBConsole を起動しようとしても設定は同一となってしまいますし、Firebird Embedded Server 用に使おうと思ってもレジストリに情報を書き込んでしまうと既存の IBConsole に影響が出てしまいます。

そこで、IBConsole.conf があればそれを読みに行くようにしました。IBConsole.conf の位置は IBConsole.exe と同じ場所、あるいは Home Path (C:\Users\<アカウント名>\AppData\Roaming\IBConsole) です。どちらか片方でいいような気がするかもしれませんが、例えば IBConsole を %Program Files% 以下にインストール (他のアプリと同梱で) されてしまうと、最近の Windows では conf ファイルを書き換える事ができません。しかしながら社内利用等では IBConsole.exe と IBConsole.conf をコピーして配布した方が楽な事も多いでしょう。なので...

  1. IBConsole.exe と同じ場所にある IBConsole.conf
  2. Home Path にある IBConsole.conf
  3. レジストリ ([HKEY_CURRENT_USER\SOFTWARE\Borland\InterBase\IBConsole])

このような優先順位で設定を読み書きするようにしてみました。但し、Home Path の指定ができるのは Windows 2000 以降となります。これは CSIDL_APPDATA の関係です。

実は IBConsole は Ini ファイルへデータを読み書きするためのルーチンを最初から持っています。何故かというと Linux 版 (Kylix) ではレジストリが使えないからです。今回の修正では環境設定ファイルの存在チェックを行い、どこから設定を読むのかを変更できるようになっています。なお、現行の Interbase 付属の IBConsole は設定を XML で読み書きするようになっています。

[SERVERS]
ローカルサーバ=

[SERVERS/ローカルサーバ]
ServerName=Local Server
UserName=SYSDBA
Protocol=3

[LocalServer]
Type=3

[SERVERS/ローカルサーバ/DATABASES]
TEST=

[SERVERS/ローカルサーバ/DATABASES/TEST]
DatabaseFiles=データベースファイル
UserName=SYSDBA
CaseSensitiveRole=0
CharacterSet=文字コード

Firebird Embedded Server を使ったアプリに IBConsole を同梱する際は、赤字の部分だけを書き換えた設定ファイルを一緒にコピーしてやればいいでしょう。アプリから IBConsole を呼び出せるようにして、DatabaseFiles の部分だけをアプリ側で書き換えてあげればいいと思います。

procedure TForm1.Button1Click(Sender: TObject);
var
  FileName: string;
  EnvName: string;
  Ini: TMemIniFile;
begin
  FileName := ExtractFilePath(ParamStr(0)) + 'ibconsole.exe';
  EnvName  := ChangeFileExt(FileName, '.conf');
  Ini := TMemIniFile.Create(EnvName);
  try
    Ini.WriteString('SERVERS/ローカルサーバ/DATABASES/TEST''DatabaseFiles'データベース名を格納した変数);
    Ini.UpdateFile;
    ShellExecute(0'open', PChar(FileName), nilnil, SW_SHOWNORMAL);
  finally
    Ini.Free;
  end;
end;

このような感じになるかと思います。.conf と Embedded Server が使えるようになったので、IBConsole Portable 的な運用ができるようになりましたね \(^o^)/

See Also:

IBLite

IBLite ってあるじゃないですか?組み込み向けの Interbase なんですが、XE7 以降には Windows / OS X / iOS / Android 向けの再配布制限のない IBLite が付属しています。

使い方...の前に、まずは IBLite の使用許諾ファイル (要はライセンスファイル) を取得しなければなりません。手順は以下のようになります。

  1. 製品購入時に送られてきたメールに書いてあるユーザ名 (メールアドレス) とパスワードでメンテナンスポータルサイトにアクセスする。
  2. IBLite のシリアルナンバーを控えておく
  3. https://reg.codegear.com/srs6/activation.doで IBLite をアクティベーションする。登録キーは 737479
  4. 使用許諾ファイルをダウンロードし、ファイル名を reg_iblite.txt に変更。
  5. reg_iblite.txt を $(IBREDISTDIR) にコピー ([ツール | オプション | 環境変数] でフォルダ位置を確認してください)。
  6. $(BDS)\bin にあるライセンスマネージャ (LicenseManager.exe) を起動し、IBLite のライセンスを追加 (インポートで reg_iblite.txt を選択)。

これで IBLite を使う前準備ができました。上記手順は IBLite および InterBase ToGo Test Deployment のライセンス使用方法 (SupportKB) にも書かれています。

IBLite 自体は Delphi をインストールした時点で用意されていますので、コピーして使うだけです。例えば 32bit の IBLite は C:\Users\Public\Documents\InterBase\redist\InterBaseXE3\Win32_togo にあります。

Windows 32bit アプリケーションの場合、配布用の IBLite は以下のような構造になります。

\
│  (あなたの作った EXE)
│  ibtogo.dll
│
└─InterBase
    │  ADMIN.IB
    │  interbase.msg
    │  license.txt
    │  oss_license_notice.txt
    │
    ├─intl
    │      gdsintl.dll
    │
    └─license
            reg_iblite.txt

アプリケーションフォルダの Interbase\licence フォルダに使用許諾ファイル (reg_iblite.txt) を配置する必要があるという訳ですね。IBLite のコピーが面倒な方は以下のスクリプトを使ってみてください。

スクリプトを実行すると、そのフォルダに IBLite というサブフォルダを作り、IBLite のファイルを収集してくれます。

\
│  IBConsole.exe
│  IBConsole.conf
│  gds32.dll (ibtogo.dll をリネームしたもの)
│
└─InterBase
    │  ADMIN.IB
    │  interbase.msg
    │  license.txt
    │  oss_license_notice.txt
    │
    ├─intl
    │      gdsintl.dll
    │
    └─license
            reg_iblite.txt

このように配置すると、IBLite でも IBConsole が使えます (32bit 版の場合)。

IBLite をお使いの際には100MB の DB サイズ制限がある事と、セッション数が 1 しかない (複数のアプリから同時に DB を開けない) 事には注意してくださいね。

また、ライセンスファイルを差し替えるだけで Interbase To-Go Edition 用となります。Interbase To-Go Edition は DB サイズに制限はなく、セッション数も 4 となっています (9,000円 / 1 配布ライセンス)。

See Also:


2015/10/09

Firebird Database Converter (fbconverter)

Firebird Database Converter (fbconverter) が公開されました。

名前の通り、Firebird のデータベースを別のデータベースに変換します。例えば…

という場合に使えます。MIT ライセンスのオープンソースで、Delphi XE4 以降でコンパイルできます。すぐに使えるバイナリも配布されています。

Firebird Database Converter の動作に必要なもの

ローカルで完結したいのであれば、Firebird サーバーのインストールが必要ですが、Firebird サーバーがリモートに存在し、データベースをリモート/ローカルで変換する場合には特に用意するものはありません。

変換元 / 変換先用として、

が同梱されており、さらに変換先用として。

が同梱されています。つまり、すべてのバージョンへ変換できるという事です。但し、新しいバージョンから古いバージョンへのコンバートは当然うまくいかない事もあります。

Firebird Database Converter のコンパイルに必要なもの

自前でコンパイルして使いたいのであれば、以下の環境が必要となります。

ZeosDBO は TDataSet 派生の DB 接続コンポーネントです (概要はこちら)。簡単に言えば FireDAC みたいなものです。AsyncCalls はマルチスレッドのライブラリです。

Firebird Database Converter では僕がよく使う IBX は一切使われていません。これは Firebird と Interbase の API や SQL 構文の差異を吸収できないためです。DB アクセスだけなら クライアントライブラリのリネーム程度で問題なく動作しますが (SQL 投げてるだけなので)、IBConsole の雑談でも書きましたが Firebird のちょっと込み入った処理には IBX は不向きです。コード量が少なくて済むので使えるものなら使いたかったのですけどね。

FireDAC を使ってもよかったのですが、Professional ユーザがコンパイルできませんので、ZeosDBO を使う事にしました…あ、言い忘れていましたが、Firebird Database Converter の開発には私も一枚噛んでいます (^^;A

日本語化したい場合には frmuMain.dfm (フォームファイル) と、uFBConvConsts.pas の文字列定数だけ翻訳すれば OK です。もちろん他の言語でも同様です。

おのれ Zeos!

Firebird Database Converter に ZeosDBO を使うのは早々に決まりました。何やらメタデータを吐く機能があり、これを使えばコンバートに必要な情報を DB から取得できそうだったからです...でもね?

おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos

メタデータの取得ができると聞いて IBX の IBExtract みたいなのを想像していたのですが、ロクスッポ有益な情報が取れません。これではコンバート用のメタデータなんか作れません。

困りましたが仕方ないので uFBExtract を作りました (^^;A

ソースコードを見て頂ければ解ると思いますが、uFBExtract がパクっているのはその名前だけです。内部構造は全くと言っていい程異なります。そもそも IBExtract は IBX 内で使われる事が前提であり、単独で使われることは想定されていませんし、BigInt 等 Firebird 独自のデータ型等も正しく取得できません。さらっと「uFBExtract を作った」と書いていますが、ODS バージョンの異なる Firebird データベースをいくつも解析して作られています…結構難解です。

で、あらかたメタデータが吐けるようになった段階でおかしな事に気付きました。

またか…

おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos、おのれ Zeos

この件ですが、実は Delphi Forum に既に投稿してあります。いくつかの解決策は Firebird日本ユーザー会や Firebird の書籍でおなじみ林さんが Zeos のバグトラッカーに報告&パッチ提供されています。

致命的なのが TRIM の件です。これは多くのユーザが指摘していますが、Zeos では Firebird 1.0 / 1.5 を指定できるようになっているのに、7.1.2 よりも後のバージョンだと Firebird 1.0 / 1.5 なサーバでエラーが出まくります。これはシステムテーブルから情報を取得するのに TRIM() という関数を使っているからですが、TRIM() は Firebird 2.0.x 以降にしか存在しません (以前は UDF)。

Zeos 7.1.2 にはバグがあり、7.1.3 以降だと回避不可能なバグ (仕様) があるため、Firebird Database Converter では 7.1.2 にパッチをあてたものを使う事にしました。Zeos は LGPL なので、この改変された Zeos も公開されています。最新版の Zeos は追いかけていませんが…マトモに動作するようになったのかな?

それと完全に余談ですが、Zeos は文字コード変換が一段多いような気がします。普通ならサーバの文字コードとクライアントの文字コードだけ指定すればいいじゃないですか?DB 接続のミドルウェアって。でも Zeos はもう一つ文字コード変換を挟んでいるようなのです。例の EUC_JP 変換ロジックとか本来は不要な処理ですよね?文字化けするのを (文字コード変換ロジックを一段増やして) 無理矢理直したという経緯があるのでしょうかね?

Zeos を使ってみたいと思われた方は ClientCodepage (クライアントの文字コード) / ControlsCodePage (GUI の文字コード) にご注意ください。「Firebird Database Converter のソースコード中の文字コード指定は変な事になってるなぁ?」と思われるかも知れませんが、実際問題としてああしないと文字化けします (w

Firebird Database Converter の使い方 (変換元)

さて、Firebird Database Converter の使い方です。まずは変換元の設定から。

  1. 変換元の Firebird サーバに接続するクライアントのバージョンです。
  2. 変換元の Firebird サーバホスト名です。ローカルで変換するには localhost や 127.0.0.1 を指定します。
  3. 変換元の Firebird サーバポート番号です。ポート番号を変更していなければ 3050 でいいです。
  4. 変換元のデータベースファイル名です。Firebird サーバがリモートにある場合にはサーバから見たパスで記述する必要があります。ローカルファイルの場合には Explorer からファイルをドラッグ&ドロップする事もできます。
  5. ローカルにデータベースファイルがある場合には参照ダイアログを開いて指定する事が出来ます。
  6. 変換元の Firebird サーバに接続するためのユーザ名です。通常は SYSDBA でいいです。
  7. 変換元の Firebird サーバに接続するためのパスワードです。Windows の場合にはデフォルトで masterkey ですが、Linux サーバの場合には masterkey ではない事があります。
  8. 変換元のサーバに接続できるかどうかのテストを行います。

    変換元のサーバのバージョンと 1. で指定したクライアントのバージョンに相違がある場合には上記のダイアログが出ます。[はい] を押すと 1. を 変換元のサーバのバージョンと同じものに変更します。
  9. 変換元のデータベースの文字コードです。判らない場合にはそのままにしておいてください。
  10. 変換元のデータベースの文字コードを自動判別し、9. を変更します。
  11. 変換元のデータベースの情報を表示します。

    ODS (On Disk Structure) 番号等を取得できます。

Firebird Database Converter の使い方 (変換先)

次は変換先の設定です。

  1. 変換先の Firebird サーバに接続するクライアントのバージョンです。変換先には同梱されている Firebird Embedded Server を使う事もできます。
  2. 変換先の Firebird サーバホスト名です。ローカルで変換するには localhost や 127.0.0.1 を指定します。
  3. 変換先の Firebird サーバポート番号です。ポート番号を変更していなければ 3050 でいいです。
  4. 変換先のデータベースファイル名です。Firebird サーバがリモートにある場合にはサーバから見たパスで記述する必要があります。
  5. ローカルにデータベースを保存する場合には参照ダイアログを開いて保存先およびファイル名を指定する事が出来ます。
  6. 変換先の Firebird サーバに接続するためのユーザ名です。通常は SYSDBA でいいです。
  7. 変換先の Firebird サーバに接続するためのパスワードです。Windows の場合にはデフォルトで masterkey ですが、Linux サーバの場合には masterkey ではない事があります。
  8. 変換先のサーバに接続できるかどうかのテストを行います。

    変換先のサーバのバージョンと 1. で指定したクライアントのバージョンに相違がある場合には上記のダイアログが出ます。[はい] を押すと 1. を 変換先のサーバのバージョンと同じものに変更します。
  9. 変換先のデータベースの文字コードです。デフォルトで Unicode 系の文字コード (UNICODE_FSS / UTF8) が指定されます。

Firebird Database Converter の使い方 (変換オプション)

変換オプションの設定です。

Firebird Database Converter の使い方 (環境設定)

Firebird Database Converter には fbconverter.ini という設定ファイルがあり、書き換える事で挙動を変化させる事ができます。

Firebird Database Converter の使い方 (注意点)

幾つか注意点を。


 BACK   古いのを読む   新しいのを読む