クライアント・データベース操作(SQLite)

CurlではJava DB(Derby)やAIRのようなローカルデータベース機能をオープンソースであるCDK(Curl Data Kit)を利用して、利用することができます。CDKはSQLiteを利用しています。また、Curl7.0からは特権なしで稼働します。

sqlite01.jpg

 

 

 

 

 

 

SQLiteの詳細については以下のサイトを参照ください。
http://www.sqlite.org/

準備

ローカルデータベースを利用するために、CDKを下記サイトからダウンロードし、Zipファイルを展開します。2010年2月時点ではバージョン1.1が最新のようです。
http://sourceforge.net/projects/curl-cdk/

この中にSQLiteのライブラリも含まれておりますので、別途SQLiteをダウンロードする必要はありません。

基本的なSQLiteへのアクセス

まずは以下のようにmanifestを設定し、COM.CURL.CDK.SQLITEをimportします。(manifest.mcurlのパスは環境に合わせて変更してください。)

{curl 7.0 applet}
{applet manifest = “deploy/COM.CURL.CDK.1.1/manifest.mcurl”}
{import * from COM.CURL.CDK.SQLITE}

最初にSQLiteDatabaseクラスを用いてデータベースオブジェクトを生成します。 この際指定するURLはデータの格納されるファイルのパスとなります。もしurlがNULLの場合は、メモリデータベースとなります。メモリデータベースはApplet停止時にクリアされてしまいます。 

def db = {SQLiteDatabase {url “test1.db”}}

次に上記で生成されたデータベースオブジェクトのexecuteメソッドを用いて更新系のSQL文を実行します。(creata table/drop table等のSQL文も実行可能)以下のサンプルコードではテーブルを作成し、テストデータを挿入しています。

{db.execute “CREATE TABLE IF NOT EXISTS test (col1 INTEGER, col2 TEXT)”}
{db.execute “INSERT INTO test VALUES(1, ‘test1’)”}
{db.execute “INSERT INTO test VALUES(2, ‘test2’)”}

SQL文の記載されたファイルからそのSQL文を実行するために、以下のようなこともできます。

{db.execute {read-from {url “test.sql”}}}

次にデータベースからデータを取得する例を紹介します。以下のサンプルコードでは、sql-rowsメソッドで取得した行データをdumpマクロでコンソールに出力しています。1行だけの取得であれば、sql-rowというメソッドも用意されております。

def rows = {db.sql-rows “SELECT * FROM test”}
{for row in rows do
    {dump
        row[0], || col1 
        row[1]  || col2
    }
}

ステートメントを利用したSQL実行については、create-statementメソッドを利用し、SQLiteStatementオブジェクトを作成し、stepメソッドでSQL文を実行できます。また、CDKではJDBCのPreparedStatementのような、ステートメントを事前に準備しておき、ステートメント作成時にプレース・ホルダとして「?」をセットできます。これらのプレース・ホルダにバインドするにはbindメソッドを利用し、最後にstepでSQL文を実行します。sql-rowsql-rowsにも同様にプレース・ホルダをセットすることができ、残余引数としてバインドする値をセットできます。

|| プレース・ホルダ
def row = {db.sql-row “SELECT * FROM test WHERE col1 = ? and col2 = ?“, 2, “test2”}
{dump row[0], row[1]}

|| SQLiteStatment利用(更新SQL)
def stmt1 = {db.create-statement “INSERT INTO test VALUES(?, ?)”}
{stmt1.bind 3, “test3”}
{stmt1.step}

|| プレース・ホルダとして以下のような書き方も可能
def stmt2 =
    {db.create-statement “INSERT INTO test (col1, col2) VALUES (:c1, :c2“}
{stmt2.bind c1 = 4c2 = “test4”}
{stmt2.step}

|| with-statementマクロでコーディングの簡略化
{with-statement in db
    stmt3 = “INSERT INTO test (col1, col2) VALUES (?, ?)”
  do
    {stmt3.bind 5, “test5”}
    {stmt3.step}
}

レコードセットとの連携

テーブルとRecordSetと連携が容易に可能となっています。これにはコネクションオブジェクト(SQLiteConnection)を引数にしてSQLiteRecordSet.create-from-table-nameクラスプロシージャを実行します。以下はサンプルとなります。 

def con = {SQLiteConnection db}
def rs =
        {SQLiteRecordSet.create-from-table-name
            con, || SQLiteConnection
            “main”, || データベース名
            “test”, || テーブルもしくはSQL文
            request-modifiable? = true || 変更可否
        }
{RecordGrid record-source = rs}

データベースの暗号化

Curl7.0からはSQLiteデータベースの暗号化がサポートされています。暗号方式はAES256, AES128, RC4がサポートされております。(SQLiteEncryptionType参照)暗号化されたデータベースを利用する方法は、SQLiteDatabaseのコンストラクタ、もしくは、SQLiteDatabase.attach, SQLiteLibrary.rekeyで、引数に暗号方式(encryption-type)と鍵(key)を指定します。以下はSQLiteDatabaseコンストラクタに指定している例です。

def db =
    {SQLiteDatabase 
        {url “test.db”},
        encryption-type = SQLiteEncryptionType.aes256, || 暗号方式(ここではAES256)
        key = {ByteArray 1, 2, 3, 4, 5} || 鍵(ByteArrayで指定)
    }

サポートタイプ

サポートされるSQliteとCurlの型は以下のようになります。

SQLite Curl Type
TEXT String
INTEGER int or int64
REAL double
BLOB ByteArray
NULL null

サポートバージョン

RTE6.0以上

その他、CDKには多くの機能(例えば、SQLiteStatement.import-csvによるCSVインポート、コミット時などの各種イベントハンドリング、SQLDatabase.install-functionを利用したSQL関数の作成、権限設定など)があります。ダウンロードしたCDKディレクトリの中には、多くのコードサンプルやドキュメントが記載されていますので、詳細についてはそちらをご覧ください。