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」の部分です。ソースコードは次のようになります。
// 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演算子は、通常は次のような使いかたをします。
SELECT * INTO RECORDS FROM sample_table WHERE NAME IN ("user1", "user2", $user3);
AlinousScriptの配列の変数とセットにして使うときには次のように使います。
$ARR[0] = "user1"; $ARR[1] = "user2"; $ARR[2] = "user3"; SELECT * INTO RECORDS FROM SAMPLE_table WHERE NAME IN (@ARR);
また、普通のSQLのようにサブクエリーを使うこともできます。
SELECT * INTO RECORDS FROM SAMPLE_table WHERE NAME IN (SELECT NAME FROM SAMPLE_table);
SELECT後のレコードの編集
SELECT文でクエリーを実行したあとには、INTO句で指定した配列にレコードのDOM変数が格納されることになります。実際の開発では、このレコードをそのまま表示するのではなく、一部編集して出したいということが多くあると思います。例えば、<
や>
を<
および>
に変換したり、\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, "<", "<"); $RECORDS[$i].NAME = String.replace($RECORDS[$i].NAME, ">", ">"); }
このように、SQLだけでなく、SQL実行後にスクリプトによってデータを編集できるのもAlinous-Coreの大きな特徴です。
HTTPセッションのハンドリング
セッションは、Webアプリケーションを作るときにおいて、最近では非常によく使われます。Cookieは最近はセキュリティの関係であまり推奨されないことが多いので、代わりにセッションで代用することも多いと思います。
Alinous-Coreのセッションの扱いは非常に簡単です。$SESSION
という予約変数があり、そのDOM変数のプロパティおよび、その子プロパティの子孫はセッション変数として保持されます。デバッガで表示したときに、変数表示は下図のようになっていると思います。
この$SESSION
変数の子孫に値を追加する方法は、下のコードのようになります。
$SESSION.test = "aaa";
このコードを実行することにより、$SESSION
変数に子プロパティが追加されます。デバッガで表示すると下図のようになります。
また、$SESSION
変数の子プロパティ変数を開放したいときには、Variable.release()
関数を使います。具体的には下のようなコードを書きます。
Variable.release($SESSION.test);
ページのフォワード機能
サンプルの中のAlinousScriptは、どれも必ず値を返しています。ほとんどのものは0
を返していますが、ここで文字列を返すことによって、フォワードやリダイレクションを行うことができます。ここで返す値が「http://」から始まる場合は、ページ全体がリダイレクションされます。返す値が、ALINOUS_HOMEの中のファイルの場合にはそのファイルにフォワードされます。