package record; use strict; use sql; sub columnProp { return (); # インスタンス変数の属性を設定します # 例: return ( "tmp_data"=>"e", # Eliminate: tmp_dataはカラムではない "num"=>"n", # Number: numは数値型カラム "target"=>"r:target" # Reference: targetはテーブルtargetの # レコードの主キー ); # ここで指定しなかったインスタンス変数は文字列型カラムとみなされます # ただし、primaryKeyNameで指定されたものはプライマリキーとみなされます } # recordクラスのサブクラスのコンストラクタの例 # # @myRecord::ISA=qw(record); # sub new{ # my $className=shift; # my $primaryKey=shift; #新しいレコードの場合空 # &record::init($className,$primaryKey); # } sub init { my $className=shift; my $id =shift; my $t={}; bless $t,$className; if (!$id) { return $t; } $t->{$t->primaryKeyName}=$id; my $r=&sql::select1 ($className, $t->primaryKeyName, $t->primaryKey ); if ($r) { bless $r,$className; } else { $t->fail("No Record Found"); } } # プライマリキーの変数名です。プライマリキーはserial型でないといけません sub primaryKeyName{ "mainkey"; } sub primaryKey { my $t=shift; $t->{$t->primaryKeyName}; } # このオブジェクトがあらわすレコードがまだ実際のテーブルに # 登録されていない場合はtrue sub isNew { my $t=shift; !($t->primaryKey); } sub tableName { my $t=shift; ref $t; } # このオブジェクトを新規レコードとして挿入し、プライマリキーをもらいます sub insert { my $t=shift; if (!($t->isNew)) {$t->fail("Cannot insert: already exists");} &sql::insertAndGetMainkey($t->tableName,$t,$t->primaryKeyName); } # このオブジェクトが表すレコードを更新します sub update { my $t=shift; if ($t->isNew) { $t->fail("Cannot update: not exist yet");} &sql::update($t->tableName, $t, $t->primaryKeyName ."=". $t->primaryKey); } sub insertOrUpdate { my $t=shift; if ($t->isNew) {$t->insert;} else {$t->update;} } sub fail { my $t=shift; my $msg=shift; die("$msg: ".$t->index); } sub index { my $t=shift; "[ ".$t->tableName."(". $t->primaryKey .") ]"; } use html; use tag; sub columns { my $t=shift; my @res=($t->primaryKeyName); } sub text { my ($t,$name,@attrs)=@_; &tag::p("input", {type=>"text",name=>$name,value=>$t->{$name},@attrs}); } sub multiText { my ($t,$name,@attrs)=@_; &tag::p ("textarea", {name=>$name,@attrs}, &html::escape($t->{$name}) ); } 1;