SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

ここまでできる!HTML+SQL+Alinousベースプログラミング

Web特化言語で超シンプルWebDBアプリ作成実践編


  • X ポスト
  • このエントリーをはてなブックマークに追加

SQLの実行

 Alinous-CoreではSQLをそのままスクリプトに書き込んで実行できます。SQLの仕様としては、PostgreSQLの仕様にあわせて作ってあります。基本的にはSQL 92の仕様に、Limit句、Offset句を加えた仕様になっています。現在のところ、UNIONなどの集合演算には対応していませんが、

  • SELECT文
    • DISTINCT句
    • エイリアス指定
    • サブクエリー
    • 各データベースの組み込み関数
    • FROM句
    • INNER JOIN
    • LEFT [OUTER] JOIN
    • RIGHT [OUTER] JOIN
    • CROSS JOIN
    • WHERE句条件文
    • WHERE句内部結合
    • ORDER BY句ASC
    • ORDER BY句DESC
    • LIMIT句
    • OFFET句
  • INSERT文
    • サブクエリー
    • VALUES句
  • UPDATE文
    • サブクエリー
    • SET句
    • WHERE句による条件指定
  • DELETE文
    • 全行削除
    • WHERE句による条件指定
  • BEGIN文
  • COMMIT文
  • ROLLBACK文

 など、WebDB開発で一般的に使われるものはほぼカバーされています。Alinous-Coreでは、SQLとスクリプトの変数を組み合わせて使うことができるため、SQLが拡張されている部分があります。今回は主にその部分を解説していこうと思います。

拡張SQLの例

 拡張SQLの例として、1番分かりやすいのは「ALINOUS_HOME/select/show.alns」の部分です。ソースコードは次のようになります。

ALINOUS_HOME/select/show.alns
// EXECUTE SELECT STATEMENT
if($IN.comment != null){
    $LIKE_STMT = '%' + $IN.comment + '%';
}

  SELECT * INTO RECORDS 
    FROM SAMPLE_table 
   WHERE NAME = $IN.name 
     AND EMAIL = $IN.mail 
     AND COMMENT like $LIKE_STMT
ORDER BY NAME DESC
         limit 10;

 このソースコードでは、SELECT文を実行していますが、そのときに、AlinousScriptの変数をSQLの中で使っています。$IN.name$IN.mail$LIKE_STMTがそれらの変数です。$IN.name$IN.mailはフォームからPOSTされたフォーム変数で、$LIKE_STMTはSELECT文を実行する直前のスクリプトで作られる変数です。このソースを見て、誰もが「もし、その変数がNULLだったり存在しなかった場合はどうなるのだろう」と思うと思います。その部分についてはこれから説明します。

WHERE句の縮退機能

 Alinous-Coreの拡張SQLでは、WHERE句に工夫がしてあり、楽にプログラムを作ることができます。Alinous-Coreは、SQLの解析木を持っていてBNFというツリー形式(もしくはスタック形式)でデータを持っています。図にすると下図のようになります。

 

 この図では、ID$BIRTHDAYという2つの変数が使われていて、$BIRTHDAYがNULLもしくは存在しないときにどのように処理されるかが表されています。この場合は、単純に$BIRTHDAYを含む部分の式が無視されます。ところで、AND演算子は、2つ以上式がないと成り立ちません。では、AND演算子の下の式が1つになってしまったときはどのようになるのでしょうか? そのときの処理の様子を下図で示します。

 

 この場合には、ANDの位置に、ANDの下にぶら下がっている式が繰り上がってきます。また、ANDの下に式が1つもないときは、AND自体が消滅します。

 今回の説明ではAND演算子1つだけですが、実際にはもっとたくさんのANDやOR演算子が入れ子になった構造になります。そのときには、このような処理が、ツリーの下のほうの末端から上(ツリーのルート)に向かって再帰的に行われます。

WHERE句の縮退機能をOFFにする

 WHERE句の縮退機能はとても便利な機能です。しかし、ときにはNULLであることをチェックしたいときもあり、縮退をしてほしくないこともあります。そのときには、SQLを拡張した文法で「ADJUST_WHERE句」があり、これをfalseに設定することにより、縮退を禁止できます。例としては次のように使います。

縮退の禁止例
SELECT * INTO res 
  FROM sample_table 
 WHERE NAME = $NAME
ADJUST_WHERE = FALSE;

DELETE FROM sample_table 
 WHERE NAME = $NAME
ADJUST_WHERE = FALSE;

UPDATE sample_table 
   SET NAME = 'TEST'
 WHERE NAME = $NAME
ADJUST_WHERE = FALSE;

IN演算子とAlinousScript変数

 IN演算子は、AlinousScriptとのコンビネーションでいろいろと使いかたがありますので、その例をいくつか示します。IN演算子は、通常は次のような使いかたをします。

IN演算子の例1
SELECT * INTO RECORDS 
  FROM sample_table 
 WHERE NAME IN ("user1", "user2", $user3);

 AlinousScriptの配列の変数とセットにして使うときには次のように使います。

IN演算子の例2
$ARR[0] = "user1";
$ARR[1] = "user2";
$ARR[2] = "user3";
SELECT * INTO RECORDS FROM SAMPLE_table WHERE
NAME IN (@ARR);

 また、普通のSQLのようにサブクエリーを使うこともできます。

IN演算子の例3
SELECT * INTO RECORDS 
  FROM SAMPLE_table 
 WHERE NAME IN (SELECT NAME FROM SAMPLE_table);

SELECT後のレコードの編集

 SELECT文でクエリーを実行したあとには、INTO句で指定した配列にレコードのDOM変数が格納されることになります。実際の開発では、このレコードをそのまま表示するのではなく、一部編集して出したいということが多くあると思います。例えば、<>&ltおよび&gtに変換したり、\n<br>に変換したり、タイムスタンプをフォーマットしたりといった処理です。そのような場合は以下のようにして対応します。

レコードの変換例
SELECT * INTO RECORDS 
  FROM SAMPLE_table 
 WHERE NAME = $IN.name 
   AND EMAIL = $IN.mail 
   AND COMMENT like $LIKE_STMT
 ORDER BY NAME DESC
       limit 10;

// レコードの個数をとる
$CNT = Array.size(@RECORDS);
for($i = 0; $i < $CNT; $i++){
  // 一つ一つのレコードにたいして変換する
  $RECORDS[$i].NAME = String.replace($RECORDS[$i].NAME, "<", "&lt;");
  $RECORDS[$i].NAME = String.replace($RECORDS[$i].NAME, ">", "&gt;");
}

 このように、SQLだけでなく、SQL実行後にスクリプトによってデータを編集できるのもAlinous-Coreの大きな特徴です。

HTTPセッションのハンドリング

 セッションは、Webアプリケーションを作るときにおいて、最近では非常によく使われます。Cookieは最近はセキュリティの関係であまり推奨されないことが多いので、代わりにセッションで代用することも多いと思います。

 Alinous-Coreのセッションの扱いは非常に簡単です。$SESSIONという予約変数があり、そのDOM変数のプロパティおよび、その子プロパティの子孫はセッション変数として保持されます。デバッガで表示したときに、変数表示は下図のようになっていると思います。

セッション変数
セッション変数

 この$SESSION変数の子孫に値を追加する方法は、下のコードのようになります。

SESSIONの値の追加
$SESSION.test = "aaa";

 このコードを実行することにより、$SESSION変数に子プロパティが追加されます。デバッガで表示すると下図のようになります。

セッション変数に値を追加
セッション変数に値を追加

 また、$SESSION変数の子プロパティ変数を開放したいときには、Variable.release()関数を使います。具体的には下のようなコードを書きます。

SESSIONの値の削除
Variable.release($SESSION.test);

ページのフォワード機能

 サンプルの中のAlinousScriptは、どれも必ず値を返しています。ほとんどのものは0を返していますが、ここで文字列を返すことによって、フォワードやリダイレクションを行うことができます。ここで返す値が「http://」から始まる場合は、ページ全体がリダイレクションされます。返す値が、ALINOUS_HOMEの中のファイルの場合にはそのファイルにフォワードされます。

次のページ
RSSの作成

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

飯塚 友裕(イイヅカ トモヒロ)

Eclipse関連のソースコード自動生成プロダクトの開発者。ソースコード自動生成エンジンを他社に供給する技術エンジン会社「CROSSFIRE JAPAN, INC.」で、O/RマッピングツールやJavaによるSQLパーサーを開発。現在、NetBeans.org(米国)のパートナー。最近は、Alinous-Coreを利用したパッケージビジネスを行っています。SEO対策対応ECサイト構築パッケージOpen-ECAlinous-Coreのソースコードダウンロードhttp://sourceforge.jp/projects/alinous-core/はてなブログhttp://d.hatena.ne.jp/i-zuka/

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/1375 2008/09/03 13:58

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング