はじめに
SQL Anywhereはデータベースサーバとして有名ですが、それだけではありません。SQL Anywhereサーバに、データベースクエリの結果セットをWebページまたはWebサービスを介して提供できるHTTPサーバの機能があることはあまり知られていません。Google Web Toolkit(GWT)は、AJAXアプリケーションの作成を簡易化するJavaソフトウェア開発フレームワークです。開発者は、ブラウザ間の違いを意識せずに、使い慣れた環境でおなじみのツールを使ってJavaアプリケーションを作成することができます。GWTには、Javaクラスから各ブラウザ対応のJavaScriptとHTMLを生成するコンパイラが含まれています。
GWTは便利で使いやすく、SQL Anywhereにも対応しています。本稿では、SQL AnywhereのHTTPサーバ機能を利用するためのセットアップ方法と、GWTの使用方法、さらにSQL AnywhereにWebアプリケーションをデプロイする方法を説明します。また、SQL Anywhereサーバへの接続を監視するWebアプリケーションの作成手順も紹介します。SQL Anywhereでのセキュリティやエラー処理についての説明は省きます。
本稿は、SQL AnywhereやGWTの経験がない方でもお読みいただけますが、JavaとSQLの知識があることを前提としています。
ソフトウェアを入手する
GWTのWebサイトからGWTをダウンロードしましょう。本稿の執筆時点で入手可能な最新バージョンはビルド1.1.10だったので、今回はこのバージョンを使いました。
SQL Anywhereはバージョン10を使いましたが、バージョン9でもかまいません。バージョン10.0.0ビルド2719以上、または9.0.2ビルド3385以上が必要です。それ以前のバージョンにはGWTの動作を妨げるバグがありました。アップデートはSQL Anywhereのデベロッパーサイトからダウンロードすることができます。EBFのリンクに従ってください。SQL Anywhereをお持ちでない場合は、SQL AnywhereのWebサイトから無料の評価版をダウンロードすることができます。
最後に、SunのJava 2 Runtime Environment 1.4.2以上も必要です。JREはSunのWebサイトからダウンロードすることができます。本稿では最新バージョンのJava 5を使いました。また、Javaソースを編集するためのエディタも必要です。
GWTを使ってアプリケーションを作成する
本稿では、DBConsoleの接続部のような外観と振る舞いのWebアプリケーションを作成します。DBConsoleはSQL Anywhereを監視するアプリケーションで、SQL Anywhereに付属しています。
GWTには、シェルアプリケーションを自動的に生成するツールが用意されています。このツールは「applicationCreator」という名前で、インストールしたGWTの最上位のディレクトリに入っています。このディレクトリをパスに追加するか、ツールを実行するときにapplicationCreatorをパスに含める必要があります。まず、プロジェクト用のディレクトリを作成します。ここでは「w:x」を使っているので、この「w:x」を実際に使用するプロジェクトディレクトリに置き換えてください。applicationCreatorを実行するときは、クラスの修飾名を指定する必要があります。パッケージ名の後ろには必ず「.client」を付けます。ここでは、アプリケーションを「com.iAnywhere」というパッケージに入れました。アプリケーションの名前は「Console」です。
アプリケーションを作成すると、アプリケーションをビルドしてホストモードで実行するためのスクリプトも作成されます。
アプリケーションをビルドする
デフォルトのコンパイルで生成されるJavaScriptは読みにくいので、読みやすくするために「Console-compile.cmd」を編集し、コマンドラインの- out
の前に-style DETAILED
を追加します。
アプリケーションをビルドするには、コマンドラインで「Console-compile.cmd」を実行します。
アプリケーションをホストモードで実行する
ホストモードでは、アプリケーションはGWTシェルで実行され、アプリケーションの実行環境となるブラウザが起動されます。ビルドした新規アプリケーションをホストモードで実行するには、コマンドラインで「Console-shell.cmd」を実行します。次の2つのダイアログが表示されます。
データベースを作成してSQL Anywhereサーバを起動する
Webアプリケーションで使うサービスやストアドプロシージャ、またはWebアプリケーションで使用するデータを保管するためには、データベースが必要です。既存のSQL Anywhereデータベースを使うことも、新規にデータベースを作成することもできます。データベースを作成するには、コマンドラインでdbinit console.db
を実行します。これで、SQL Anywhereデータベースとして初期化される「console.db」というファイルが作成されます。このデータベースファイルは、データベースファイル名をディレクトリパスで修飾しない限り、dbinitの実行先のディレクトリに作成されます。ここでは、プロジェクトディレクトリのルートである「w:x」にデータベースを置きました。
サーバを起動するには、コマンドラインに次のコードを入力します。
dbsrv10 -xs HTTP(port=80) console.db
これで、データベースサーバが起動します。データベースアプリケーションがデータベースに接続するには、正しい認証情報を持っていることが必要です。これは、SQL Anywhereサーバの管理下にあるその他のデータベースに接続する場合も同様です。.xsオプションを指定すると、SQL AnywhereはWebプロトコルをリスンします。ここでは、ポート80のHTTP要求が対象となります。
SQL Anywhereは、特定の要求に応答するために作成されたWebサービスを必要とします。例えば、fooというWebサービスを作成した場合は、次のURLを指定してこのWebサービスにアクセスします。
HTTP://localhost/foo
ただし、ページの生成中はうまくいきません。GWTは多くのファイルを生成します。こうしたファイルの中には、「Console-compile.cmd」でプロジェクトをリビルドするたびに名前が変わるものもあります。SQL Anywhereのデフォルトでは、要求されるファイルごとに異なるサービスを用意することが期待されますが、この問題には回避策があります。「root」というWebサービスを作成するのです。このrootサービスは、一致するサービスがないすべての要求を処理します。
rootサービスのソースは次のとおりです。
CREATE SERVICE "root" TYPE 'RAW' AUTHORIZATION OFF USER "DBA" URL ON AS call RootPage(:url);
このサービスは非常に単純です。認証を無効にし、すべての呼び出しにDBA権限を使います。さらに、呼び出しているURLを取得してRootPageストアドプロシージャに渡します。RootPageは要求をディスパッチする処理を行います。
RootPageは、GWTの出力生成先ディレクトリをURLの前に付加し、そのURLを使用してファイルを読み取り、要求側に返します。RootPageは各ファイルのファイル拡張子を認識し、適切なコンテンツタイプを設定します。ここでは「w:\x\www\」を使いました。「www」ディレクトリは、Console-compileが生成ファイルをデフォルトで書き込む場所です。このディレクトリは、実際にプロジェクトをビルドする場所に置き換えてください。
CREATE PROCEDURE "DBA"."RootPage"( url_part varchar(250) ) RESULT( HTML_doc XML ) BEGIN declare root_page long varchar; set root_page = xp_read_file( 'w:\x\www\' + HTTP_decode( url_part ) ); IF COMPARE( '.html', LOWER( RIGHT( url_part, 5 ) ) ) = 0 OR COMPARE( '.htm', LOWER( RIGHT( url_part, 4 ) ) ) = 0 THEN CALL dbo.sa_set_http_header( 'Content-Type', 'text/HTML' ); ELSEIF COMPARE( '.js', LOWER( RIGHT( url_part, 3 ) ) ) = 0 THEN CALL dbo.sa_set_http_header( 'Content-Type', 'text/javascript' ); ELSEIF COMPARE( '.css', LOWER( RIGHT( url_part, 4 ) ) ) = 0 THEN CALL dbo.sa_set_http_header( 'Content-Type', 'text/css' ); ELSEIF COMPARE( '.xml', LOWER( RIGHT( url_part, 4 ) ) ) = 0 THEN CALL dbo.sa_set_http_header( 'Content-Type', 'text/xml' ); ELSEIF COMPARE( '.gif', LOWER( RIGHT( url_part, 4 ) ) ) = 0 THEN CALL dbo.sa_set_http_header( 'Content-Type', 'image/gif' ); ELSEIF COMPARE( '.jpe', LOWER( RIGHT( url_part, 4 ) ) ) = 0 OR COMPARE( '.jpeg', LOWER( RIGHT( url_part, 5 ) ) ) = 0 OR COMPARE( '.jpg', LOWER( RIGHT( url_part, 4 ) ) ) = 0 THEN CALL dbo.sa_set_http_header( 'Content-Type', 'image/jpeg' ); END IF; select "root_page"; END;
Webサービスとストアドプロシージャの作成および維持にはDBISQLまたはSybase Centralを使用できます。DBISQLとSybase CentralはSQL Anywhereに付属のツールです。今回の例では、Sybase Centralの方が効率的であることが分かりました。
Windowsでは、DBISQLとSybase Centralは[スタート]メニューから起動できます。起動したら、作成した新規データベースに接続する必要があります。新規データベースのデフォルトのユーザーIDは「dba」で、デフォルトのパスワードは「sql」です。他に既に使用しているSQL Anywhereデータベースがある場合は、そのデータベースの名前も指定する必要があります。ここでは、「console」を使います。