JSpriteモジュール(日本語チョウ訳) Ver.0.19

by Hippo2000(2001/7/10)

JSpriteモジュールなのです。PurePerlなSQLデータベースなのです。

著作権はJim Turner氏がお持ちです(詳しくは著作権情報を見てください)。Jim Turner's SpriteだからJSpriteなのです。なおJSpriteは単独ではなくDBD-Spriteのディストリビューションに同梱されます。お気をつけを!

内容等が間違っていたら修正します。ご連絡ください。



名前

JSprite - 区切られたフラットなテキストファイルをOracleをエミュレートしSQLを使うデータベースとして扱うようSpriteを修正。残りのドキュメントSpriteをベースにしています。


概要

  use JSprite;
  $rdb = new JSprite;
  $rdb->set_delimiter (-read  => '::')  ## OR: ('read',  '::');
  $rdb->set_delimiter (-write => '::')  ## OR: ('write', '::');
  $rdb->set_delimiter (-record => '\n')  ## OR: ('record', '::');
  $rdb->set_os ('Win95');
    ## 適切な引数には以下のものがあります(大文字小文字の区別はありません):
    ##
    ## Unix, Win95, Windows95, MSDOS, NT, WinNT, OS2, VMS, 
    ## MacOS or Macintosh. デフォルトは$^Oにより決まります。

  #$rdb->set_lock_file ('c:\win95\tmp\Sprite.lck', 10);
        $rdb->set_lock_file ('Sprite.lck', 10);
  $rdb->set_db_dir ('Mac OS:Perl 5:Data') || die "Can't access dir!\n";
  $data = $rdb->sql (<<Query);   ## もしくは: @data = $rdb->sql (<<Query);
      .
      . (SQL)
      .
  Query
  foreach $row (@$data) {        ## もしくは: foreach $row (@data) {
      @columns = @$row;          ## 区切られた文字にnullはありません -- v3.2
  }                              
  $rdb->xclose;
  $rdb->close ($database);       ## 更新されたデータベースを保存する

説明

二重のコロンでフィールドが区切られた簡単なデータベースがあるとします:

  PLAYER=VARCHAR2(16)::YEARS=NUMBER::POINTS=NUMBER::REBOUNDS=NUMBER::ASSISTS=NUMBER::Championships=NUMBER
  ...
  Larry Bird::13::25::11::7::3
  Michael Jordan::14::29::6::5::5
  Magic Johnson::13::22::7::11::5
  ...

注意: 最初の行にはフィールド名(大文字・小文字は区別されません)、Oracleデータ型と長さが入らなければなりません。現在のところ意味があるデータ型はNUMBERとVARCHARだけです。他のすべての型はVARCHARとして扱われます(比較のため、Perl文字列として)


サポートされれているSQLコマンド

以下にJSpriteでサポートされるSQLコマンドのリストを示します:

select - 指定された条件にあてはまるレコードを取り出す
  select col1 [,col2] from database 
         where (cond1 OPERATOR value1) 
         [and|or (cond2 OPERATOR value2) ...] 
         order by col1 [,col2] 

すべてのカラムをSELECTするために'*' オペレータを使うことができます。

databaseは単純にデータの入っているファイルです。もしファイルがカレント・ディレクトリになければ、パスを指定しなければなりません。でふぉるといでは実際のファイル名は拡張子".sdb"で終わります。

Spriteは複数のテーブル(あるいは結合("join")としてよく知られている)をサポートしていません

適切なカラム名は[cond1..n]と[value1..n] が予想されているところで使うことができます。以下のようになります:

例 1:

  select Player, Points from my_db
         where (Rebounds > Assists) 

注意: カラム名はPerl文字列またはブール演算子つまり( lt, gt, eq, and, or, など)であってはいけません、そして大文字小文字は区別されません。

以下のSQLオペレータを使うことができます:=, <, >, <=, >=, <>。またPerlの特別なオペレータ: =~ と !~ も同様に使うことができます。 =~ と !~ オペレータは以下のように正規表現を指定するために使うことができます:

例 2:

  select * from my_db
         where (Name =~ /Bird$/i) 

Nameカラムが"Bird"(大文字/小文字を無視して)で終っているレコードをSELECTします。詳細については、正規表現についてのマニュアルをご覧ください。

注意: データベースへのパスには以下の文字しか入れることができません。

  \w, \x80-\xFF, -, /, \, ., :

もし空白や他の'適切でない'文字が入っているディレクトリをもっているならば、set_db_dirメソッドを使わなければなりません。

update - 指定された条件にあうレコードを更新します:

  update database 
    set cond1 = (value1)[,cond2 = (value2) ...]
        where (cond1 OPERATOR value1)
        [and|or (cond2 OPERATOR value2) ...] 

例::
  update my_db 
         set Championships = (Championships + 1) 
         where (Player = 'Larry Bird') 

  update my_db
         set Championships = (Championships + 1),
             Years = (12)
         where (Player = 'Larry Bird')

delete - 指定された条件に当てはまるレコードを削除します
  delete from database 
         where (cond1 OPERATOR value1) 
         [and|or (cond2 OPERATOR value2) ...] 

  delete from my_db
         where (Player =~ /Johnson$/i) or
               (Years > 12) 

alter - SQL-92の対応部分を簡略化したもの
データベースから指定されたカラムを削除、追加します。テーブルを変更するための他の標準SQL関数はサポートされていません。
  alter table database drop (column-name [, column-name2...])

  alter table database add ([position] column-name datatype
                [, [position2] column-name2 datatype2...] 
                [primary key (column-name [, column-name2...]) ])

  alter table my_db drop (Years)

  alter table my_db add (Legend VARCHAR(40) default "value", Mapname CHAR(5))

  alter table my_db add (1 Maptype VARCHAR(40))

この例は新しいカラムをテーブルの2番目のカラムとして追加しています(最初のカラムは0)。デフォルトでは新しいフィールドはテーブルの一番右(最後)のカラムとして追加されます。このJSprite拡張は標準のSQLによってサポートされていません。

  alter table my_db modify (Legend VARCHAR(40))

  alter table my_db modify (0 Legend default 1)

最後の例は"Ledend"カラムをテーブルの最初のカラムに移動し、それ以上のものをシフトします。そして後のすべてのレコードには"Legend"フィールドに値が入っていなければ、デフォルト値"1"が追加されます。この"Position"フィールド(この例では0)はJSprite拡張で標準SQLにはありません。

insert - データベースにレコードを追加します:

  insert into database 
         [(col1, col2, ... coln) ]
  values 
         (val1, val2, ... valn) 

:
  insert into my_db 
         (Player, Years, Points, Championships) 
  values 
         ('Kareem Abdul-Jabbar', 21, 26, 6) 

データベースでのすべてのフィールドを指定する必要はありません!Spriteはデータベースものと同じ順序で指定することも要求しません。

注意: 文字列をクォートすることを習慣にしなければなりません。


メソッド

利用できるメソッドを以下に示します:

set_delimiter
set_delimiter関数はデータベースのための読込、書込区切り文字を設定します。区切り文字は1文字に限られません。文字列や正規表現(読込のみ)とすることができます。JSpriteではレコード区切り文字も指定することができます(デフォルトは改行)

戻り値

なし

set_os
set_os関数はSpriteに使っているオペレーティング・システムを知らせるために使われます。デフォルトは$^Oによって決定されます。

注意: Windows95/NTまたはOS2でSpriteを使っているのであれば、set_db_dirset_lock_fileへのパスを指定するさいに、普通のスラッシュではなく、バックスラッシュを使うようにしてください!

戻り値

なし

set_lock_file
flockをサポートしていないO/Sのために(つまりMac,Windowd95そしてVMS)、このメソッドは使用するロック・ファイルとSpriteが'偽の'ロックを取得しようとする回数を指定することができます。しかしこれは完全には信頼できません。しかしロックがまったくないよりもましです。

指定されなければ、'Sprite.lck' (set_db_dirによって指定されたディレクトリまたはカレント・ディレクトリのどちらかにある)がデフォルトのロック・ファイルとして使われます。

戻り値

なし

set_db_dir

データベースへのパスには以下の文字しか入れることができません:
  \w, \x80-\xFF, -, /, \, ., :  

もしあなたのパスに上記に上げたもの以外の文字が入っているのであれば、メソッドを使ってデフォルト・ディレクトリを設定することができます。例を以下にあげます:

  $rdb->set_db_dir ("Mac OS:Perl 5:Data");
  $data = $rdb->sql ("select * from phone.db");

Spriteはファイル"Mac OS:Perl 5:Data:phone.db"を探します。ちょっと注意してください、データベース・ファイル名には上記にあげた文字しかもつことができません!

戻り値

  0 - 失敗
  1 - 成功
set_db_ext
JSprite は実際のファイル名の一部であっても対応するテーブル名の一部にはならない拡張子を指定することを可能にしています。デフォルトは'.sdb'です。
  $rdb->set_db_ext ('.sdb');

戻り値

なし

sql
sql関数はSQLコマンドをこのモジュールに渡すために使われます。上記で説明したSQLコマンドのすべてがサポートされています。select SQLコマンドはデータの入っている配列を返します。最初の要素はステータスです。他のすべてのSQLコマンドは単にステータスを返します。

戻り値 1 - 成功 0 - エラー

 
commit
commit(原文ではsql)関数はデータベースへの変更をコミットするために使われます。引数:ファイル名−(通常はテーブル名)−テーブルを出力するファイル名。注意:パスと拡張子が追加されることに気をつけてださい。つまり:
  &rdb->commit('filename');

戻り値 1 - 成功 0 - エラー
 
close
close関数はファイルをクローズし、データベース・オブジェクトを破壊します。この関数にファイル名を渡すことができます。その場合、Spriteはそのファイルにデータベースを保存します。ディレクトリはデフォルトとしてset_db_dirによって設定されたディレクトリが使われます。

戻り値

なし


注意

Spriteはあなたのすべてのデータ操作の必要性の解決策ではありません。これは小さなデータベース(1000レコードよりも小さい)に向いていますが、それを越えると、Spriteがポコポコ動いている間..そして何秒間かそれ以上経過して返ってくるまで、そこに座って退屈のあまり指をひねくり回さなければなりません.

Spriteの主な利点は個人のマシンで(もしくはOracleライセンスやその他の"主流の"データーベースを持っていないほかのマシンで)、"本当の"データベースを持っている"製品"マシンにリリースする前にプロトタイプ・アプリケーションを作成し、テストできることです。

さらなるSpriteの利点は、データを検索するためにPerlの正規表現が使えることです。ウヒョー!

DBD::Spriteはフラットファイルを通して、基本的なデ−タベーステーブルとSQL呼び出しをエミュレートする能力を提供します。想定している基礎的な使い方は、Oracleライセンスを購入する余裕がないWebサイトの開発者に自分自身の道具で、後でOracleが使われているより大きい顧客のサイトでホスティングするためのプロトタイプやPerlアプリケーションの開発を可能とさせることです。 :-)

DBD::Spriteはできるだけデータベースに依存しない方法でことを行おうとしますが、違いがあるとJSpriteはOracleを最も近くエミュレートします。例えば"シーケンス/自動番号付け"。JSpriteは"シーケンスファイル"(.seq)という小さな1行のテキストファイルと自動的に番号がふられるフィールドに挿入するための"seq_file_name.NEXTVAL"関数を使います。


追加のJSPRITE特有の機能

JSpriteはOracleシーケンスと関数をサポートしています。現在のところサポートされているOracle関数は"SYSTIME",NEXTVALそして"NULL"です。"fn_register" を使ってユーザーは独自の関数を"登録"することができます。

fn_register

メソッドは2つの引数を取ります:関数名とオプションのパッケージ名です(デフォルトは"main")

  $rdb->fn_register ('myfn','mypackage');
  

-もしくは-

  JSprite::fn_register ('myfn',__PACKAGE__);

すると以下のように呼び出すことができます:

   insert into mytable values (myfn(?))
        

そして値を"?"にバインドします、それは"myfn"に渡され、返された値がデータベースに登録されます。バインドなしに呼び出すこともできます。:

   insert into mytable values (myfn('mystring'))
        

-もしくは (もし関数が数値をとるのであれば)-

   select field1, field2 from mytable where field3 = myfn(123) 
        

戻り値

なし

JSprite は新しいテーブルやシーケンスを作るためのSQL"create"関数を追加しています。

例:

   create table table1 (
                field1 number, 
                field2 varchar(20), 
                field3 number(5,3)  default 3.143)

   create sequence sequence-name [increment by 1] start with 0


参考資料

DBD::Sprite, Sprite, Text::CSV, RDB


謝辞

以下の方々に特にRod Whitby に Jim Esten、バグの発見と提案の提供に感謝します:

  Shishir Gundavaram  (shishir@ora.com)     (オリジナルのSpriteの作者)
  Rod Whitby      (rwhitby@geocities.com)
  Jim Esten       (jesten@wdynamic.com)
  Dave Moore      (dmoore@videoactv.com)
  Shane Hutchins  (hutchins@ctron.com)
  Josh Hochman    (josh@bcdinc.com)
  Barry Harrison  (barryh@topnet.net)
  Lisa Farley     (lfarley@segue.com)
  Loyd Gore       (lgore@ascd.org)
  Tanju Cataltepe (tanju@netlabs.net)
  Haakon Norheim  (hanorhei@online.no)


著作権情報(COPYRIGHT INFORMATION)

(原文のまま)
                   JSprite Copyright (c) 1998-2000, Jim Turner
          Sprite Copyright (c) 1995-1998, Shishir Gundavaram
                      All Rights Reserved

  Permission  to  use,  copy, and distribute is hereby granted,
  providing that the above copyright notice and this permission
  appear in all copies and in supporting documentation.


ホーム Perlの小技

ご意見、ご質問はこちらの掲示板で受け付けています。
またメールは河馬屋(Nifty)にお願いします。