Powered by SmartDoc

ODBC Socket Server

Team FXML

目次

イントロダクション

ODBC Socket Serverは他数の異なったプラットフォーム間でODBCによる データベースアクセスを可能にする先例のないWindows NTのサービスです。 他の商用パッケージは通常何千ドルもしますが、ODBC Socket Serverは、 多機能であるだけでなく、無償で提供されます。そのXMLベースの通信メカニズムと オープンソースにより、ODBC Socket Serverは今日、最もカスタマイズ可能で 高機能なデータベースアクセスメカニズムです。

Team FXMLは、ODBC Socket Serverの開発陣で、何年ものデータベースと XMLの経験を持っています。このプロダクトはWindows/Linuxツールキットの オープンソースリーダーからのもう1つのオープンソースツールです。

機能

ODBC Socket Serverはソフトウェア開発者や管理者にアピールする たくさんの機能を持っています。

多くの人は、どうして我々がこのプロダクトを無償で提供するのかを 不思議がることでしょう。その理由は、我々はデータウェアハウスアクセスは、 開発環境などのアプリケーション開発にとって重要であると考えているからです。 誰かがサーバーやクライアントの選択について命令したり継続しようとしても、 ODBC Socket Serverは拡張可能な目的にかなったデータアクセスレイヤーを 持てることを保証するでしょう。

以下のダイアグラムはODBC Socket Serverの役割を図示しています。

+----------------+
| TCP/IP clients |
+----------------+
       |
+--------------------+
| ODBC Socekt Server |
+--------------------+
       |
+----------+
| ODBC/ADO |
+----------+
       |
+------------------+
| ODBC Data Source |
+------------------+

Windows NTへのインストール

ODBC Socket Serverをインストールする前に以下のソフトウェアが インストールされていることを確認してください。

ODBC Socket ServerはシンプルなWindows NTサービスです。以下のステップに したがってインストールしてください。

  1. サーバーのあるディレクトリにODBC Socket Serverアプリケーションを解凍してください。
  2. スタートメニューのコマンドを指定して実行(あるいはDOSプロンプト)から、以下のコマンドを実行して下さい。

    <ODBCSocketServer.exeへのパス>\ODBCSocketServer.exe /Service
    

    例えば、ODBC Socket ServerをC:\ODBCへインストールした場合は、以下のようなコマンドを実行して下さい。

    C:\ODBC\ODBCSocketServer.exe /Service
    

    ATL.dllがないとか順序が云々というエラーが出たら、既存のWinNT/system32ディレクトリにあるATL.dllをどこかにバックアップして、ODBC Socket Serverのディストリビューションに含まれるATL.dllをWinNT/system32ディレクトリにコピーし、以下のコマンドを実行して下さい。

    regsvr32 c:\winnt\system32\atl.dll
    

    (多分ここにあるでしょう)これでODBCSocketServer.exeをODBCSocketServer.exe /Serviceコマンドで問題なく登録できるでしょう。

  3. 設定のためにデータベースにODBC Socket Serverに関する情報を入力するために、ODBC Socket Serverを解凍したディレクトリをエクスプローラで開きます。レジストリにデフォルトの設定を書き込むために、そこにあるRegistry.regというファイルをダブルクリックします。これらの設定の詳細は後で説明します。
  4. コントロールパネルからサービスのダイアログを開きます。サービスのリストにODBC Socket Serverがあるはずです。
  5. ODBC Socket Serverを開始するためには、単純に開始を押します。Windows NTが開始する際に毎回ODBC Soket Serverを自動的に開始するためには、スタートアップを自動にしてください。
  6. ODBC Socket Serverのインストールをテストするために「インストールのテスト」セクションへ行って下さい。

Windows 98へのインストール

ODBC Socket ServerのWindows 98へのインストールはWindows NTのそれよりも 要約されています。しかし、ODBC Socket ServerにはWindows 98は含まれていません。 したがって、Windows 98のバイナリを作成するためにserver_sourceディレクトリに あるソースコードからビルドしなければなりません。

Windows 98はODBC Socket Serverの操作環境として最適化されていませんので、 Windows 98用のバイナリはODBC Socket Serverのベースディストリビューションには 含まれていません。しかし、あなたがWindows 98しか選択肢がないなら、ODBC Socket Serverをインストールするために以下のステップにしたがって下さい。

  1. Windows 98マシンのあるディレクトリにODBC Socket Serverを解凍します。
  2. server_sourceディレクトリで、ODBCSocketServer.dspファイルをMicrosoft Visual C++で開きます。Win32リリースで新しくバイナリをビルドします。
  3. Windowsのエクスプローラからダブルクリックして、作成されたODBCSocketServer.exeバイナリを実行します。マシンが起動する度にサービスを起動するためには、スタートアップメニューにODBCSocketServer.exeのショートカットを置いて下さい。

インストールのテスト

ODBC Socket Serverをテストするために、Windows NTのODBCシステムデータソース を作るか、OLEDBプロバイダを使います。ODBCシステムデータソースを作るには、 以下のようにします。

  1. スタートメニューから設定を選び、コントロールパネルへ行きます。
  2. ODBCをダブルクリックします。
  3. システムDSNをクリックして、追加をクリックします。
  4. 追加したいデータソースのタイプを選んで、追加をクリックし、終了をクリックします。
  5. SQL Serverへの新しいデータソースの作成ウィザードを完成します。

一旦ODBCデータソースが作成されたら、クエリーをテストできます。 クエリーをテストするためには、ODBC Socket Severに同梱されるサンプルの クライアントアプリケーションを使います。テストクライアントアプリケーションを 使うためには、以下のステップを踏んで下さい。

  1. ODBC Socket ServerクライアントCOM DLLを登録します。これを行うためには、以下のコマンドを実行します。

    regsvr32.exe <ODBCSocketServer.exeへのパス>\clients\COM\ODBCClient.dll
    

    ODBC Socket ServerがC:\ODBCにインストールされているとしたら、コマンドは以下のようになります。

    regsvr32.exe C:\ODBC\clients\COM\ODBCClient.dll
    

    regsvr32.exeは、Windowsのsystem32ディレクトリにあります。

  2. ODBCClient.dllと同じディレクトリにある、SockTest.exeを実行します。
  3. IPアドレス、正しいODBCコネクションストリング、実行するSQLを入力します。正しいODBCコネクションストリングは、PubsというODBCデータソースがある場合は、

    DSN=Pubs;UID=smith;PWD=muffins
    

    のようになります。有効なSQLは、例えば、

    SELECT * FROM authors
    

    などです。

  4. SQLを実行するためにExecSQLをクリックします。
  5. クエリーの結果は結果ペインに表示されます。何も結果がなかったり、アプリケーションがタイムアウトしたら、ODBC Socket Serverのあるマシンとテストアプリケーションを実行したマシンのNTイベントログを見て下さい。アプリケーションのイベントログをチェックするのを忘れないで下さい。ログに書き込まれたエラーメッセージは問題を診断するのに役立ちます。トラブルが解決されない場合は、fxml@excite.comの作者へ詳細をメールして下さい。

クライアントツール

Pythonインターフェース

Pythonのクラスは、Marc Risney(marc.risney@blazesoft.com)とJochen Knuth (J.Knuth@ipro.de)により書かれました。ODBC Socket Serverとのインターフェースには Pythonのソケットクラスを使っています。ホストとコネクションストリングは コンストラクタに渡します。

名前 パラメータ 返値 備考
ODBCSocketServer(コンストラクタ) Server(接続先のサーバー、IPアドレスかホスト名),コネクションストリング(ODBCコネクションストリング) ODBC Socket Serverオブジェクト コンストラクタはサーバーとコネクションストリングを初期化します。
ExecSQL SQL(実行するSQL) ODBC Socket ServerからのXMLでの結果 サーバーでSQLを実行して結果を戻します。

ODBC Socket Serverの設定

このセクションの目的はODBC Socket Serverの設定オプションについての 概観を行うことです。

ODBC Socket Serverはその特別なセッティングをロードするために Windows NTのレジストリを使います。レジストリのセッティングを行わずに ODBC Socket Serverを実行することも可能ですが、ODBC Socket Serverが NTイベントログに最大のステータス情報を書き込んでしまうことと、 クライアントはどのホストからも接続できてしまうことから勧められません。

レジストリのキー、HKEY_Local_Machine\Software\ODBC Socket Serverは、 ODBC Socket Serverの設定オプションの全てを含みます。このキーには、以下の文字列値があります。

レジストリ値 説明
DebugLevel NTイベントログへ書き込まれるイベント情報の量。以下の値が使われます。1 -可能な限り多くの情報を報告します(冗長という意味ではありません)。2 -ソケットエラーと致命的なエラーのみ報告します(推奨)。3 -致命的なシステムエラーのみ報告します。デフォルトは1で、2が推奨されます。
IP.Allow 許可されたクライアントのIPアドレスのリストです。IP.Allowのフォーマットは以下の通りです:セミコロンで区切られたIPアドレスのリストで、*をワイルドカードとして使えます。デフォルト値は* (全てのクライアントが許可されている)です。例:127.0.0.1;10.4.1.*;は、ローカルホストの接続を許可し、10.4.1.から始まるIPアドレスを持つマシンからの接続を許可します。
IP.Deny 接続が許可されないクライアントのIPアドレスのリストです。IP.denyのフォーマットは、IP.allowと同じです。IP.allowで*が使われている場合、IP.denyに指定されているホスト以外からの接続を許可します。IP.allowがクライアントのリストの場合は、それ以外のクライアントからの接続は許可されません。例:IP.allow=127.0.0.1;10.4.1*, IP.denyが空:10.4.1.24のマシンは接続を許可されますが、10.4.2.25のマシンは接続を許可されません。
MaxThreadCount 同時に許可されるスレッド(ソケット接続)の最大数。デフォルトは5。
SocketTimeout ソケット接続が確立されてからソケットにデータが届くまでに待っている時間(秒)。デフォルトは5。
SQLTimeout SQL通信の待時間(秒)。デフォルトは5。
Port ODBC Socket Serverが接続を待ち受けるレジストリのポート番号。デフォルトは9628。
UseCDATA 0か1の整数。サーバーとクライアント間でXMLのCDATAを使うかどうか。デフォルトは偽で0。
UseMSDTD 0か1か2の整数。ODBC Socket Serverから送出されるデータのフォーマット。データが小さいときは0、ODBC Socket Serverのネイティブフォーマット。同じようなフォーマットでより速くしたいときは2。一番速くしたいときは、Microsoftのネイティブフォーマットで1。大きなデータを使いたいときは1で、小さいデータの時は0が推奨される。PHPとPerlのサンプル出力は0を使っている。デフォルトは0。

このレジストリにある情報は、ソケット接続が確立されるたびに読み直されます。 したがって、この情報を変更した場合、それはODBC Socket Serverの再起動を要求 しません。

通信プロトコル

ODBC Socket Serverは、クライアントとサーバー間の通信にXMLベースの TCP/IPストリームソケットプロトコルを使います。このプロトコルの利点は、 TCP/IPサーバーといかなるクライアントが接続できることです。Macintosh, Linux, BSD, VAXなど、クライアントがTCP/IPをサポートしていれば、 ODBC Socket Serverと話すことができます。これらのプラットフォームでは XMLパーサーが過剰にサポートされているので、ODBC Socket Serverのデータを パースすることはとてもまっすぐなことです。

XMLを使うことの欠点は、それがバイナリストリームを使っていた場合は より冗長になります。また、通信が外部のネットワークを流れる場合は、 クリアなテキストデータを公開することは潜在的なセキュリティのリスクが伴います。

ODBC Socket Serverの将来のリリースでは、転送オプションとして暗号化が 含まれるでしょう。暗号化を使うことはセキュリティ的な意味ですが、セキュリティの セクションでも触れている通り、外部のネットワークを通したいかなる暗号化 されていないデータの交換を防止します。

デフォルトのODBC Socket Serverの通信プロトコルはとても直接的です。 ODBC Socket Serverのクライアントはサーバーにリクエストを送り、 サーバーはレスポンスを送信し終ったら接続を切ります。送られるデータは 以下のようなフォーマットです。

クライアントリクエストのDTD
<!ELEMENT request (connectionstring, sql)>
<!ELEMENT connectionstring (#PCDATA)>
<!ELEMENT sql (#PCDATA | #CDATA)>
サンプル
<?xml version="1.0"?>
<request>
  <connectionstring>DSN=pubs;UID=jsmith;PWD=test;</connectionstring>
  <sql>select * from party where id = 3</sql>
</request>

最も重要なことは、sql要素はPCDATAとされていることです。 しかし、PCDATAではなく、CDATAでも大丈夫です。これにより、 SELECT * FROM party WHERE id > 5のようなクエリーを行いたい場合、 以下のどちらでも使うことができます。

<sql>SELECT * FROM party WHERE id > 5</sql>
<sql><![CDATA[SELECT * FROM party WHERE id > 5]]></sql>
サーバーレスポンスのDTD
<!ELEMENT result (error | row*)>
<!ATTLIST result state (success | failure)>
<!ELEMENT row (column*)>
<!ELEMENT column (#PCDATA | #CDATA)>
<!ATTLIST name (#PCDATA)>
<!ELEMENT error (#PCDATA)>
成功したクエリーの場合
<?xml version="1.0"?>
<result state="success">
  <row>
    <column name="client_name">John Smith</column>
    <column name="date_added">1999-04-01 0:0:0</column>
  </row>
  <row>
    <column>Peter Ross</column>
    <column>1994-12-14 15:45:35</column>
  </row>
</result>
失敗したクエリーの例
<?xml version="1.0"?>
<result state="failure">
<error>ODBC reports data source name not found</error>
</result>

成功したクエリーのサンプルはより興味深いです。返されたものは配列のXML表現であり、 それぞれの行は返された結果セットからのデータです。カラムデータの最初のセットは、 name属性を持ち、それはカラムの名前を特定しています。

データ型について。Socket Serverでサポートされているデータ型は、String, Number, Float/Real/Doubleなど, Date, Currency, Memo(長いテキスト), Binary(BLOB)です。 DateのデータはYYYY-MM-DD HH:MM:SSのフォーマットで返されます。StringとMemoは、 デフォルトでは有効なPCDATAとして返されます。この制約は5 > 4 > 3が返されるとき、 5 &gt; 4 &gt; 3が返されることを意味します。しかしこの挙動はオーバーライドでき、 代わりにCDATAを返すこともできます。これはレジストリのUseCDATAのセッティングで 可能です。UseCDATAがtrueなら、上の例では代わりに<![CDATA[5 > 4 > 3]]>が 返されます。

通信におけるこの単純な意味づけは、ODBC Socket Serverが開発者にカスタマイズして 欲しいと切望している側面の一つです。例えば、1つのWindowsプラットフォームから他へ 大量のデータを転送しようとしているとすると、大量のデータが交換されないことを 保証するために簡単なバイナリエンコーディングを行うルーチンを実装したくなるかも 知れません。心に留おいていて欲しいのは、このエンコーディングは多分UNIXやMacintosh クライアントは除外されてしまうということです。

目先の利く読者なら、このセクションで説明されたデータフォーマットはODBC Socket ServerのデフォルトDTDであることに気付くでしょう。もしデータがMicrosoftのADO DTDを 使って返されることが要求されるなら、レジストリでUseMSDTDを1にセットできます。 このDTDはこの文書では触れられていませんし、Team FXMLはこのDTDの将来の変更に 対するコントロールを持っていません。したがって、MS DTDがより効果的であるような とても多量のデータ交換や、MS DTDのデータフォーマットを期待するレガシーアプリケーションを 持っている場合以外は、ODBC Socket Server DTDを使うことを勧めます。

ODBC Socket Serverが提供するもう1つの出力フォーマットは、オリジナルのフォーマットと 似ていますが、それぞれの行にカラムのタイトルが現れることと、NULL値は転送されないことが 違います。

開発情報

このセクションはこのアプリケーションのソースコードを実験、変更したい開発者のための リファレンスを意図しているので、ODBC Socket Serverの詳細を素早く知ることができます。

ODBC Socket ServerはMicrosoft Visual C++ 6を使って作られました。これは通信のために Winsockレイヤーを使うATLサービスとして実装されています。ほとんどの文字列操作には Standard Template Libraryが使われ、MFCは使われていません。このデザイン決定により、 このサービスはとても軽量で速いです。

データベース接続のためにADOが使われており、最新のデータプロバイダのリリースにより 驚く程のスピード改善があったため、最新のOLEDBプロバイダを使用することを強く勧めます。

メインアプリケーションは、ODBCSocketServer.cppファイルから実行されます。サービスの開始時に ソケットレイヤーをインスタンス化するスレッドがスポーンされ、その後main-server.cppファイルの DoWinsockプロシージャが呼ばれます。このファイルでほとんどの仕事が行われます。 重要なプロシージャはReadAndWriteToSocketで、これはほとんどの通信に責任を持ちます。また、 VariantToXMLは、返される様々な結果セットを取り、XMLへコンバートします。 代替のデータ出力のために、MSDTDToOutDTDとRecordsetToMSDTDメソッドが、VariantToXMLの代わりに 使われます。

Internet Explorerのインストールを条件としないために、Team FXMLは独自のパーサーfXMLを、 このアプリケーションのXMLパーシングコンポーネントとして使っています。fXMLはオープンソースで、 マルチプラットフォームのXMLツールキットであり、自身の内部のパーサーや一般的なXMLパーサーの ラッパーを持っています。fXMLは、http://www.geocities.com/ResearchTriangle/System/5640/に あります。

これらはODBC Socket Serverに静的にコンパイルされ、ODBC Socket Serverで使われている 全てのfXMLのソースコードはODBC Socket Serverプロジェクトの一部です。ODBC Socket Serverを インストールするために、他のコードは必要ありません。

セキュリティ

すべてのTCP/IPアプリケーションはきついセキュリティを課すべきですし、ODBC Socket Serverも 例外ではありません。ODBC Socket Serverでのセキュリティは幾つかのレベルで提供されます。 ODBC Socket Serverへの認証されないアクセスは、IP.allowとIP.denyのレジストリのエントリ経由で 提供されます。これらのエントリを正しく設定することは、許可されたホストだけがODBC Socket Serverにアクセスできることを保証します。

データが潜在的に安全でないネットワークを流れる場合は、インターネットファイアウォールや、 Free S/WANなどのVPNツールキットを併用することは避けられないことです。どんなデータアクセス ツールキットを使うかに関わらず、安全でないネットワークにデータを流す際には、不要なデータ アクセスを防ぐためにデータの暗号化が必要です。

ロードマップと更新記録

ODBC Socket Serverの将来のバージョンでは以下の機能が含まれるでしょう。

これらの機能が実装されるまでのタイムフレームはありません。

ODBC Socket Serverのバージョン0.92では以下のような変更点がありました。

ODBC Socket Serverのバージョン0.91では以下のような変更がありました。

Team FXMLはあなたがODBC Socket Serverとともにベストであるように、我々が そうであるようにこのサービスが便利であるように願っています。ダウンロードしてくれて ありがとう、楽しんで下さい。

クレジット

Team FXMLはODBC Socket Serverの開発と改良を助けてくれた以下の人々に感謝します。 PythonのクラスはMarc Risney(marc.risney@blazesoft.com)とJochen Knuth(J.Knuth@ipro.de) が気前良く開発し寄付してくれました。Steve Philip(sphilp@advancepkg.com)が メインサービスのデバッグを助けてくれました。