フォーラム


ゲスト  

ようこそ ゲスト さん。このフォーラムに投稿するには 登録が必要です。

ページ: 1 2 [3] 4 5
トピック: [Software] IBConsole 日本語版+α
DEKO
管理者
投稿数: 2374
IBConsole 日本語版+α Unicode 版 rel.50 / ANSI 版 rel.86 リリース
on: 2015/10/14 17:36 Wed

[変更点]

  • (U/A 共通) [インタラクティブ SQL] の結果表示領域に [パラメータ] タブを追加。
  • (U/A 共通) IBX を高速化。

・"パラメータ" タブについて
Delphi / C++Builder を使っているヒトには便利な機能だと思います。実行したクエリのフィールドやパラメータを FieldByName() / ParamByName() のコードとして取得できます。

・IBX の高速化について
劇的に高速化される訳ではない事を最初にお断りしておきます。元ネタは https://github.com/goldensoftwareltd/gedemin/issues/1108 です。

2007 の場合、IB.pas を以下のように修正します。

procedure IBAlloc(var P; OldSize, NewSize: Integer);
var
i: Integer;
begin
if Assigned(Pointer(P)) then
ReallocMem(Pointer(P), NewSize)
else
GetMem(Pointer(P), NewSize);
for i := OldSize to NewSize - 1 do
PChar(P)[i] := #0;
end;

procedure IBAlloc(var P; OldSize, NewSize: Integer);
begin
if Assigned(Pointer(P)) then
ReallocMem(Pointer(P), NewSize)
else
GetMem(Pointer(P), NewSize);
if NewSize > OldSize then
FillChar((PChar(P) + OldSize)^, NewSize - OldSize, 0);
end;

 
XE8 の場合、IBX.IB.pas を以下のように修正します。

procedure IBAlloc(var P; OldSize, NewSize: Integer);
var
i: Integer;
begin
if Assigned(Pointer(P)) then
ReallocMem(Pointer(P), NewSize)
else
GetMem(Pointer(P), NewSize);
for i := OldSize to NewSize - 1 do
PByte(P)[i] := 0;
end;

procedure IBAlloc(var P; OldSize, NewSize: Integer);
begin
if Assigned(Pointer(P)) then
ReallocMem(Pointer(P), NewSize)
else
GetMem(Pointer(P), NewSize);
if NewSize > OldSize then
FillChar((PByte(P) + OldSize)^, NewSize - OldSize, 0);
end;

 
もう一か所あります。

{$ELSE}
procedure IBAlloc(var p : TRecordBuffer; OldSize, NewSize: Integer);
var
i: Integer;
begin
ReallocMem(p, NewSize);
for i := OldSize to NewSize - 1 do
p[i] := 0;
end;
{$ENDIF NEXTGEN}

{$ELSE}
procedure IBAlloc(var p : TRecordBuffer; OldSize, NewSize: Integer);
begin
ReallocMem(p, NewSize);
if NewSize > OldSize then
FillChar((PByte(P) + OldSize)^, NewSize - OldSize, 0);
end;
{$ENDIF NEXTGEN}

 
要は配列を for で回してゼロクリアするより FillChar() でゼロクリアした方が速いというものです。この IBAlloc() は一回のクエリで数百回実行される事があるので、チリも積もれば…という奴です。改変した (IBX.)IB.pas はプロジェクトに組み込んでお使いください。

一応、当方で元ネタをテストした結果を貼っておきますね。

[Alloc1()]

[Alloc2()]

かなりチリを積もらせた結果ですので、過度な期待はしないでくださいね (^^;A

DEKO
管理者
投稿数: 2374
IBX の高速化について (補足)
on: 2015/10/14 22:21 Wed

1 回のクエリ実行で IBAlloc() が 1000 回走るとしても、例のテスト結果を 1/1000 するとその違いというのは 1/1000秒程度となるので、普通にクエリを実測しても有意な差は見られないでしょう。バッチ処理のような場合にはそれなりに有意差がみられるかもしれませんが…。

# 元ネタは 1000万回のループです。

DEKO
管理者
投稿数: 2374
IBConsole 日本語版+α Unicode 版 rel.51 / ANSI 版 rel.87 リリース
on: 2015/10/24 17:15 Sat

[変更点]

  • (U/A 共通) [Interbase/Firebirdサーバ] ノードでの [ワークペイン] でサーバをダブルクリックして接続/選択できるようにした。
  • (U/A 共通) [データベース] ノードでの [ワークペイン] でデータベースをダブルクリックして接続/選択できるようにした。
  • (U/A 共通) [(サーバ)] ノードでの [ワークペイン] 表示アイテムをログイン状態によって変更するようにした。
  • (U/A 共通) [(データベース)] ノードでの [ワークペイン] 表示アイテムを接続状態によって変更するようにした。
  • (U/A 共通) [(データベース)] ノードのポッポアップメニューに [Explorer で表示] を追加 (ローカルサーバまたはループバックアドレスの場合のみ)。

小粒なアップデートです。主に操作性の改良となっています。

[解説]
IBConsole は左側のツリーの選択状態で処理を決定してるので、右側の [ワークペイン] ではコンテキストメニュー (右クリックメニュー) が出せない事があります。例えば左のツリーで [データベース] を選んだ場合、 右側の [ワークペイン] には DB 一覧が並びますが、ツリーで DB を選択している時に出るコンテキストメニューは出てきません。これはツリーのノードが [データベース] であるためです。

それならばと、右側の [ワークペイン] で DB が選択された時にツリーノードを変更してやればいいような気がするかもしれませんが、これだとダメなのです。DB が選択された場合には右側の [ワークペイン] とは内容が違うのです。つまり、右側の [ワークペイン] で DB が選択されると、 [ワークペイン] の中身が変化してしまいます。

IBConsole の内部事情はともかくとして、ツリーで [Interbase/Firebird サーバ] を選んでいる時にはサーバ一覧、[データベース] を選んでいる時には DB 一覧が出るのですから、ここはダブルクリックして接続したくなるのが心情ってものですよね?今回の修正点の上二つはそれです。それぞれダブルクリックしてアクティブにする事ができます。既にアクティブな場合にはそのノードを選択します。

Server/DB を選択した時の [ワークペイン] は Server/DB がアクティブかそうではないかで内容が異なっていました。これは従来もそうだったのですが、アクティブであってもなくても表示されていいハズの機能がリストアップされていませんでした。三つ目と四つ目の修正点はコレです。端的に言えば、Server/DB ツリーノードの "有効な" (ポップアップ) メニューアイテムが右側の [ワークペイン] に表示されるようになりました。

そして最後の修正点ですが、Server がループバックまたはローカルの場合には DB を選択した時のポップアップメニュー (ワークペインも) に "Explorer で表示" が追加されました。これは選択されているサーバがローカルサーバの時に DB ファイルのある場所を Explorer で開く機能になります。

DEKO
管理者
投稿数: 2374
IBConsole 日本語版+α Unicode 版 rel.52 / ANSI 版 rel.88 リリース
on: 2015/10/24 21:36 Sat

[変更点]

  • (U/A 共通) CHAR() フィールドを空白文字でパディングしないようにした。

詳細については以下を参照してください。
http://ht-deko.com/delphiforum/?vasthtmlaction=viewtopic&t=1653.0

DEKO
管理者
投稿数: 2374
IBConsole 日本語版+α Unicode 版 rel.53 / ANSI 版 rel.89 リリース
on: 2015/10/25 03:30 Sun

[変更点]

  • (A) CHAR() フィールドを空白文字でパディングしないようにしたのを撤回した (rel.87 相当に戻した)。
  • (U) UTF8 や CP943C を正しく扱えるようにした。

詳細については以下を参照してください。
http://ht-deko.com/delphiforum/?vasthtmlaction=viewtopic&t=1653.0

ANSI 版 IBX で SJIS_0208 のようなマルチバイト文字コードを扱っている際に、TStringField.FixedChar を False に設定すると、サイズ計算を間違ってしまい、文字列が切り詰められてしまうようです。よって、rel.88 で行った修正を元に戻しました。

Unicode 版で UTF8 や CP943C が正しく動作するようになりましたが、あくまで "IBConsole では" という話です。IBX を使った Delphi アプリケーションではそのままでは正しく動作しないので、以下の手順で修正してください。

1. (IBX.)IBSQL.pas をプロジェクトフォルダにコピー
2. (IBX.)IBSQL.pas をプロジェクトに追加
3. (IBX.)IBSQL.pas の TIBXSQLVAR.GetCharsetSize() を以下のように修正。

function TIBXSQLVAR.GetCharsetSize: Integer;
begin
{
case SQLVar.SQLSubtype and $FF of
0, 1, 2, 10, 11, 12, 13, 14, 19, 21, 22, 39,
45, 46, 47, 50, 51, 52, 53, 54, 55, 58 : Result := 1;
5, 6, 8, 44, 56, 57, 64 : Result := 2;
3 :
begin
// System Tables incorrectly state they are in Unicode_Fss character set but they are not
if SQLVar.RelName.StartsWith('RDB$') or
(SQLVar.SqlLen mod 3 <> 0) then
Result := 1
else
Result := 3;
end;
59 : Result := 4;
else
Result := 1;
end;
}
case SqlVar.SqlSubtype and $FF of
5, // SJIS_0208
6, // EUCJ_0208
8, // UNICODE_BE / UCS2BE (InterBase)
44, // KSC_5601
56, // BIG_5
57, // GB_2312
64, // UNICODE_LE / UCS2LE (InterBase)
67, // GBK (Firebird)
68: // CP943C (Firebird)
result := 2;
3: // UNICODE_FSS
begin
// System Tables incorrectly state they are in Unicode_Fss character set but they are not
if SqlVar.RelName.StartsWith('RDB$') or (SqlVar.SqlLen mod 3 <> 0) then
result := 1
else
result := 3;
end;
4, // UTF8 (Firebird)
59, // UTF8 / UTF_8 (InterBase)
69: // GB18030 (Firebird)
result := 4;
else
result := 1;
end;
end;

 
4.アプリケーションをビルド。

この修正は 2009 以降の Unicode 版 Delphi で行えます。

DEKO
管理者
投稿数: 2374
GetCharsetSize() 改修の根拠
on: 2015/10/25 04:14 Sun

TIBXSQLVAR.GetCharsetSize() は指定された文字コードの 1 文字が最大何バイトで構成されるかを返す関数です。IBX は InterBase 用のミドルウェアなので "Firebird?知らんがな!" というスタンス (これが Firebird 界隈から嫌われている要因なのですが) を取っており、Firebird で追加された文字コードが考慮されていません。

この関数は case 文の else で 1 を返していますから、1 文字が 1 バイトで構成される SBCS は無視していいです。Firebird で 1 文字が最大 2 バイト以上で構成される文字コードを列挙するには以下の SQL を実行します。

SELECT
RDB$CHARACTER_SET_ID CHARACTER_SET_ID,
RDB$DEFAULT_COLLATE_NAME CHARACTER_SET_NAME,
RDB$BYTES_PER_CHARACTER BYTES_PER_CHARACTER
FROM
RDB$CHARACTER_SETS
WHERE
RDB$BYTES_PER_CHARACTER > 1
ORDER BY
RDB$CHARACTER_SET_ID

 
これで列挙された文字コードのうち、IBX に記載がないものを追加したという訳です。

なお、InterBase で使える文字コードの一覧は Interbase 言語ガイドChapter 7: InterBase のキャラクタセットと照合順序 に載っています。
http://docs.embarcadero.com/products/interbase/IBXE7_JP/LangRef_ja.pdf#page=278

(Firebird をインストールしている等の理由で) InterBase をインストールしたくない場合、IBLite を使って Interbase の DB を新規作成するか、Delphi インストール時に Common Files にコピーされる EMPLOYEE.GDB を開いて、先述の SQL を流しても Interbase の文字コード一覧が得られます。
http://ht-deko.com/ft1510.html#151003_02

何故システムテーブル (RDB$CHARACTER_SETS) に問い合わせないのか不思議でなりませんが、何か理由があるのかもしれません。

DEKO
管理者
投稿数: 2374
(IBX.)IBDatabase.pas
on: 2015/10/25 05:32 Sun

1 文字が何バイトで構成されるかを正しく認識できた所で、次に必要なのは文字コード変換です。

(IBX.)IBDatabase.pas の BuildDPBConstants() 手続きには、IBX が使える文字コードとコードページのテーブルがあるのですが、ここがちょっと少ないように思います…まぁ、Firebird で追加されたものはハナからないのですが、

{BIG_5, CYRL, NEXT, OCTETS are unsupported since I could not find their code pages}

 
ってなコメントがあったりします。NEXT (NeXTSTEP 8bit 拡張 ASCII) と OCTETS (8bit / バイナリ) はともかく、BIG_5 と CYRL (キリル) はあるような?

  CodePages.Add('DOS775', 775);      {do not localize} // 15
CodePages.Add('DOS858', 858); {do not localize} // 16
CodePages.Add('DOS862', 862); {do not localize} // 17
CodePages.Add('DOS864', 864); {do not localize} // 18
CodePages.Add('ISO8859_2', 28592); {do not localize} // 22
CodePages.Add('ISO8859_8', 1255); {do not localize} // 38
CodePages.Add('DOS866', 866); {do not localize} // 48
CodePages.Add('DOS869', 1255); {do not localize} // 49
CodePages.Add('CYRL', 1251); {do not localize} // 50
CodePages.Add('BIG_5', 950); {do not localize} // 56
CodePages.Add('WIN1255', 1255); {do not localize} // 58
CodePages.Add('WIN1256', 1256); {do not localize} // 59
CodePages.Add('WIN1257', 1257); {do not localize} // 60
CodePages.Add('KOI8R', 20866); {do not localize} // 63
CodePages.Add('WIN1258', 1258); {do not localize} // 65
CodePages.Add('TIS620', 874); {do not localize} // 66
CodePages.Add('GBK', 936); {do not localize} // 67
CodePages.Add('CP943C', 932); {do not localize} // 68
CodePages.Add('GB18030', 54936); {do not localize} // 69

 
なんだかんだで、コレ (↑) を追加すればいいような気がします。なお、この修正は 2009 以降の Unicode 版 Delphi で行えます。

See Also:
[サポートするコード ページ (Microsoft)]
https://msdn.microsoft.com/ja-jp/library/aa288104%28v=vs.71%29.aspx

DEKO
管理者
投稿数: 2374
InterBase と Firebird で使える文字コード
on: 2015/10/25 09:51 Sun

InterBase と Firebird で使える文字コードは以下の通りです。

オレンジ色や太字のの文字コードは要注意です。InterBase と Firebird で文字コード ID が違います。同じ ID に異なる文字コードが振られている事があり、UTF8 や KOI8R は逆に同じ文字コードなのに別の ID が振られています。

文字コード ID が決め打ちだと、(厳密には) InterBase / Firebird 両対応のアプリが作れない事になります。UNICODE_FSS とかなら問題ないのですが。「何故システムテーブル (RDB$CHARACTER_SETS) に問い合わせないのか?」と書いていたのはこういう事だったりします。システムテーブルに問い合わせれば InterBase / Firebird に依存しないのに…。

先述の (IBX.)IBSQL.pas の修正はマルチバイト優先で行ってありますが、Firebird 専用にしたいのなら上記表を元に書き換えてください。InterBase と Firebird でカブっている&片方がマルチバイトな 59 と 64 を抜けば Firebird 専用となりますが、"日本語文字コード + Unicode 系" しか使わないのであれば修正の必要はありません。

DEKO
管理者
投稿数: 2374
IBConsole 日本語版+α Unicode 版 rel.54 / ANSI 版 rel.90 リリース
on: 2015/10/26 20:43 Mon

[変更点]

  • (U/A 共通) Windows 8.x 以降では ListView カラムの自動サイジングを行わないようにした。
  • (U/A 共通) [オブジェクトウィンドウ] のツールバーに [ウインドウリスト] ボタンを追加。
  • (U/A 共通) [ヘルプ | クライアント情報] を追加。
  • (U/A 共通) ローカルサーバの場合に [サーバのプロパティ] でネットワークプロトコルを変更できてしまう問題を修正。
  • (U/A 共通) ローカルサーバの場合に [サーバのプロパティ] で [OK] または [適用] を押すとネットワークプロトコルが TCP になってしまう問題を修正。
  • (U/A 共通) 条件を満たしているのに [接続診断] で DB 参照ボタンが押せない事がある問題を修正。

TListView って、多分 Windows 8.x からだと思うのですが、カラムの自動リサイズ (TListColumn.AutoSize) が有効だとリサイズにやたらと時間が掛かるようになった気がします。自動リサイズカラムが一つであればそうでもないのですが、例えばすべてのカラムが AutoSize = True の場合でフォームをリサイズしようとすると、連鎖的にリサイズが起こりやたらとカクカクします…リサイズアニメーションのせいのようですが。なので、Windows のバージョンを判定し、Windows 8.x 以降ならば AutoSize = False に設定するようにしました。なお、VCL スタイルを有効にするか、クラシックスタイルだとこの現象は発生しません。

”クライアント情報” は以下のようなダイアログを表示します。

IBConsole がロードした InterBase / Firebird のクライアント DLL が何なのかを調べる事ができます。よくある、「Firebird サーバをインストールしているのに InterBase のクライアント DLL を使っている」というミスを簡単に発見できます。表示されるクライアントバージョンは、クライアント DLL にバージョン情報を問い合わせて得られた文字列となります (isc_get_client_version)。

ただ、InterBase 6.x や Firebird 1.0.x では正しくクライアント情報が表示されない事があります。これはバージョン取得の API が InterBase 7.0 以降、Firebird 1.5.x で実装されたためです。残念ながらクライアント DLL の (ファイル) バージョン情報からでは正しいバージョン情報を得られません。

DEKO
管理者
投稿数: 2374
IBConsole 日本語版+α Unicode 版 rel.55 / ANSI 版 rel.91 リリース
on: 2015/11/01 23:54 Sun

[変更点]

  • (U/A共通) [インタラクティブ SQL] のオートコンプリートにコードテンプレートを表示するようにした。
  • (U/A共通) オートコンプリートの表示色を変更。
  • (U/A共通) [オブジェクトウィンドウ] の "オブジェクト" コンボボックスが変更された時には [メタデータ] タブの "テーブルデータも抽出" のチェックを外すようにした。
  • (U/A共通) [オブジェクトウィンドウ] のオブジェクトがテーブル以外の場合には [メタデータ] タブの "テーブルデータも抽出" を表示しないようにした。
  • (U/A共通) オプション設定全般で使われているコンポーネントを TValueListEditor に変更。
  • (U/A共通) [バックアップ] の "処理経過の出力" で "ファイル" を選んでもログファイルが出力されないバグを修正 (実装されていなかった)。
  • (U/A共通) [リストア] の "処理経過の出力" で "ファイル" を選んでもログファイルが出力されないバグを修正 (実装されていなかった)。
  • (U/A共通) [iSQL オプション] の "クエリプランの表示" / "BLOBを表示" / "BLOBサブタイプ" の設定は何も作用しないので除去した (実装されていなかった)。
  • (U/A共通) [データベースの検査] が動作しなかった問題を修正。
  • (U/A共通) その他細かい修正多数。

オートコンプリートの件は以下の画像みたいになったという事です。

[インタラクティブ SQL] "s" だけを入力して [Ctrl]+[SPACE] を押すと S で始まるデータベースオブジェクトの他に、S で始まるテンプレートも表示されるようになりました。カラーリングも変更されています。

"処理経過の出力でファイル" の件と [iSQL オプション] の "クエリプランの表示" / "BLOBを表示" は、オプション項目はあるのに機能が実装されていませんでした。またバグリスト (http://ht-deko.com/tech028.html) が増えましたね (w "BLOBサブタイプ" は当方がロジック変更した結果、使われなくなってしまいました。これは CSV 出力の所だけに使われていました。

TValueListEditor の件は懸案事項でした。オブジェクトインスペクタに見える部分は TStringGrid + TPanel + TComboBox で構成されているのですが、こんなもん TValueListEditor を使えばよく、オブジェクトインスペクタ的な動作をさせるのにコードがベタ書きでした。ユニットファイルの半分以上がオブジェクトインスペクタ的な動作をさせるコードのものもあり、とてもムダなのでリファクタリングしました。素の TValueListEditor ではちょっと問題があったのですが、この件はプログラミングネタとして別途雑談で書きます。

追記: 書きました -> http://ht-deko.com/ft1511.html#151102

※ 続きは↓の [4] をクリック。

ページ: 1 2 [3] 4 5

WP Forum Server by ForumPress | LucidCrew
バージョン: 1.7.5 ; ページロード: 0.159 sec.