DBIPgSystem::DB - DBIPgSystem のよりコアの部分
データ定義ファイルから読み込んだ情報を持ち、 データベースへアクセスしたり、 CSV/タブ区切り形式の入出力を行う。
$dbi = DBIPgSystem::DB->new($config_file, $group, $user, %opt);
ARGS : group => STRING # グループ名 user => STRING # ユーザ名
OPTION : debug => BOOLEAN # true ならばデバッグモード test => BOOLEAN # true ならば動作テストモード nph => BOOLEAN # true ならば NPH no_db => BOOLEAN # true ならばデータベースにアクセスしない test_db_commit => BOOLEAN # true ならば commit する (test と併用)
コンストラクタ。$config_file はデータ定義ファイル。
$dbi->print_template($template, { %hash }); $dbi->print_template($template, { %hash }, %option);
ARGS : $template => STRING # テンプレートファイル名 $hashref => HASHREF # テンプレート中に渡される変数
OPTION : noexit => BOOLEAN # 終了しない status => STRING # HTTP ステータス fh => FILEHANDLE # 出力先 group => STRING # グループ名 dir => STRING # ディレクトリ decode => BOOLEAN # デコードを強制的に行う
$template に対応するテンプレートファイルを使って HTMLを出力して終了する。 テンプレートファイル中では、 URLエスケープを行った変数 %var や、行っていない変数 %nvar を使用できる。 %var は通常の表示、hidden タグの中、textarea で囲まれた領域での使用に 適している。 変数中のタグをそのまま表示したいときは %nvar を使うとよい (ただし、その分危険が伴う)。 $nvar{sys} には、頻繁に使われる変数が格納されている。 また、インスタンス変数や DB モジュール内のメソッド、 CGI.pm のオブジェクト $query なども使用できる。
noexit が true でない限り、処理が終わったら終了する。 noexit が true になり得る場合では、テンプレートファイル中で %nvar の値を変更すべきではない。
$dbi->add_log($type, $msg, %hash);
ARGS : $type => STRING # ログの種類 $msg => STRING # ログのメッセージ %hash => HASH # ログに残すキーと値の組
OPTION : file => STRING # ログファイルの名前
ログをとる。ログファイルの1行に、 日時、本システムのバージョン、ログのタイプ、呼び出し元の位置、 メッセージ、グループ名、REMOTE_ADDR、HTTP_USER_AGENT、%hash の内容を追加する。 また、UID があればそれを追加する。
$self->{log} を参照し、対応するファイルに追加する。 データ定義ファイルの設定次第で、 日付やタイプ別に、異なるファイル名を対応させることができる。
$type が 'Fatal', 'Error', 'Warning'(大文字・小文字の区別なし) のときは、caller関数を使ってプログラムの状態をログに書き出す。
$dbi->print_error($title, $err); $dbi->print_error($title, $err, $logtitle, %logs);
HTML形式でエラーを出力して終了する。
$dbif->fatal_error($msg, %vars);
致命的なエラー(ユーザ側に原因がないはずのエラー)の処理をする。 ログに書き出し、メッセージを出力し、 事務局にエラーの内容をメールで通知する。 処理が終わったら終了する。
$dbi->send_mail($to, $subject, $body, %opt);
ARGS : $to => STRING # To ヘッダ $subject => STRING # Subject ヘッダ $body => STRING or ARRAYREF # 本文
OPTION : $header => HASHREF # オプションのヘッダ
メールを送る。$to と $subject は必ず定義されていなければならない。 $body が配列へのリファレンスの場合は、改行で接続したものを本文とする。
@data = $dbi->col_split($data); @data = $dbi->col_split($data, $code);
ARGS : $data => STRING # 文字列(通常はカラムの値) $code => STRING # $self->{code} のキー
RET : @array
複数の値を持つカラムの値を、文字列から配列の形に変換する。 $code を指定した場合は、$self->{code}{$code} を参照して 対応する値を返す。
($path, $uri) = $dbi->fileinfo($value);
ARGS : $value => STRING # カラムの値
RET : @array 0 => STRING # URI 1 => STRING # パス
ファイル型のカラムに格納されているファイルのURIとパスを返す。 呼び出し元のコンテキストがスカラー値を求めているときはURIを返す。 戻り値は、$self->{sys}{export_mode} によって異なる。
$uri = $dbi->export_uri($did, $page);
RET : STRING # URI
$did, $page に対応するエクスポートされたファイルのURIを返す。
$value = $dbi->getcookie($name);
クッキーから対応する値を取得する。
$num = $dbi->cmp_order($order, @list);
RET : NUM # マッチした位置
ORDER句として、@list の中から $order と意味的に等しいもの、 または ORDERが正反対のものを探し、その index を返す。 もしなければ undef を返す。
$dbi->infilter(\$in);
ARGS : $inref => STRINGREF # フィルタをかける文字列へのリファレンス
OPTION : printerror => BOOLEAN # エラー画面を出力する file => BOOLEAN # ファイルからの読み込み code => STRING # 文字コード
RET : STRING # 変換後の文字列
入力の参照先の文字列に対して変換を行う。 通常は、外部からの入力に対して、まずこのフィルタが通される。
具体的には、次の順序で処理を行う。
1. 水平タブを半角空白に、改行コードを \x0A に置換する。 (ただし、タブ区切りファイル中の水平タブを除く) 2. 漢字コードや制御コードが含まれていなければメソッドを終了する。 3. HTTP_USER_AGENT を見て Win/Macの機種依存文字を適切に処理し、 文字コードをEUCに変換する。 (DBIPgSystem::Code::toeuc 参照) 4. 制御コード等が含まれていればエラーを出す。 5. 含まれるべきでない文字コード (JIS X 0208 9〜15区,85〜94区) が含まれていればエラーを出す。 6. 全角英数字を半角英数字に、半角カナを全角に、 全角空白を半角空白2個に置換する。 また $self->{__infilter}{codelist} のキーを対応する値に置換する。 7. 仮名+濁点/半濁点があれば、できるだけ一文字に統合する。 8. (データ定義ファイル中で定義されていれば) $self->{__infilter}{hook} を実行する。
$opt{file} が true のとき、解析不能なコードは \x0C に、 使用禁止の制御コードは \x0B に置換される。 さもなければ、どちらも $self->{global}{code_invalid} に置換される。 \x0B と \x0C は使用禁止のコードのため、これ以外の場合には出力されない。
エラー/警告がある場合、$opt{printerror} が true ならば、 print_error メソッドを呼び出す。 $opt{printerror} が false ならば、エラーコードを返す。
問題なく置換できれば undef を返す。
$str = $dbi->create_table() or die; $str = $dbi->create_table(dbtable => $dbtable) or die;
OPTION : dbtable => STRING # TABLEの指定 drop => BOOLEAN # DROP コマンドも返す
RET : STRING # CREATE TABLE コマンド
データ定義ファイルに従ってテーブル $opt{dbtable} を作成するような CREATE TABLE コマンドを返す。 $opt{dbtable} が設定されていなければ データ定義ファイルで定義されている全ての TABLE が対象になる。
$str = $dbi->create_userinfo_table() or die;
OPTION : drop => BOOLEAN # DROP コマンドも返す
RET : STRING # CREATE TABLE コマンド
データ定義ファイルに従ってテーブル system_userinfo を作成するような CREATE TABLE コマンドを返す。
$list = $dbi->selectrow_array($sql, %opt);
ARGS : $sql => STRING # SELECT文
OPTION : nofatal => BOOLEAN # fatal_error があっても強制終了しない
RET : STRING # DBI::selectrow_array の戻り値
DBI::selectrow_array を実行する。 フェッチで得られた配列を返す。 呼び出し元のコンテキストがスカラー値を求めているときは 配列の最初の要素を返す(DBI::selectrow_array と同じ)。 フェッチに失敗したときは undef を返す。
$list = $dbi->selectall_arrayref($sql, %opt);
ARGS : $sql => STRING # SELECT文
OPTION : nofatal => BOOLEAN # fatal_error があっても強制終了しない
RET : STRING # DBI::selectall_arrayref の戻り値
DBI::selectall_arrayref を実行する。 フェッチで得られた変数を返す。 フェッチに失敗したときは undef を返す。
$dbi->do($sql);
ARGS : $sql => STRING # コマンド
RET : STRING # DBI::do の戻り値
DBI::do を実行する。
$str = $dbi->get_errmsg($code, @var)
エラーメッセージを取得する。 $code が ':' で始まる場合は、$code の2文字目以降(':'以降)の文字列を エラーメッセージとする。 さもなければ、エラーメッセージ定義ファイルから対応するメッセージを得る。 エラーメッセージを適切にエスケープしてから、戻り値として返す。
$dbi->warn_(@msg);
@msg を標準出力に出力する。デバッグ時に用いると便利。
$html = $dbi->get_template_detail($page); $html = $dbi->get_template_detail($page, $group);
データの詳細表示で、次に表示するページ名を返す。 対応するページがない場合は、null を返す。
$html = $dbi->get_template_insert($page);
データの挿入で、次に表示するページ名を返す。 対応するページがない場合は、null を返す。
$collist = $dbi->file_collist();
RET : ARRAYREF # カラムのリスト
CSV/タブ区切りファイルのインポート時に受け付けるカラムの順序を返す。 戻り値の各要素は配列へのリファレンスで、対応するテーブルの名前 $dbt と、 $self->{dbcol}{$dbt}[$i] が格納される。 ただし、対応するテーブルが主テーブルの場合は、$dbt に空文字列が格納される。
$rid = $dbi->get_actid($did);
ARGS : $did => STRING # データID
RET : NUM # レコードID
指定されたDIDで、有効なデータのRIDを返す。 対応するデータは、検索可能でなければならない。
($total, $list) = $dbi->search($cols, $sql);
ARGS : $cols => STRING # 検索のカラム名 $sql => HASHREF # selectcmd に渡す SQL文
RET : LIST 0 => NUM # 検索結果の総計 1 => ARRAYREF # selectall_arrayref での検索結果
与えられた条件で検索を行う。検索結果の総計と、検索結果を返す。 条件に誤りがあれば undef を返す。
($data, $system) = $dbi->search_detail($rid, $revise);
ARGS : $rid => NUM # RID $revise => BOOLEAN # データの修正
RET : LIST 0 => HASHREF # データ 1 => HASHREF # システム定義カラムの情報 2 => HASHREF # revise が true ならば、 # 前回のシステム定義カラムの情報
system_rid が $rid のデータをデータベースから読み込み、 システム定義カラムの情報と共に出力する。
revise が true の場合、システム定義カラムの情報は戻り値の 3番目の要素に 格納される(一方 revise が false の場合は 2番目に格納される)。 この場合、戻り値の 2番目の要素は、 新しくデータを修正するときのシステム定義カラムの情報と解釈される。
revise が true の場合の戻り値の 2番目の要素には、 修正元のシステム定義カラムの情報のうち system_did, system_pre_rid, system_uid が格納されている。
revise が true の場合、 $self->{__search_detail}{hook_revise} が定義されていれば、実行される。
$warn = $dbi->get_errwarn($data, $cpage);
ARGS : $data => HASHREF # データ $cpage => HASHREF # ページ番号の情報
RET : HASHREF error => HASHREF # エラーの情報 warning => HASHREF # 警告の情報
$data からエラー/警告の情報を生成する。 このメソッドは、通常データの修正を開始する際に呼び出され、 data_check の $errwarn に対応する値を返す。
$list = $dbi->db2file($sql, $filename, $type, %opt);
ARGS : $sql => HASHREF # selectcmd に渡す SQL文 $filename => STRING # 出力先のデフォルトのファイル名 $type => STRING # ファイルの形式 (csv|tab)
OPTION : add_out_head => BOOLEAN # true ならばヘッダを出力する outfilter => SUBREF # outfilter
RET : STRING # SQL文
CSVファイル/タブ区切りファイルを出力して終了する。 $opt{outfilter} を指定して、出力にフィルタを通すことができる。
$list = $dbi->remove_data($sql, $total, %opt);
ARGS : $sql => HASHREF # selectcmd に渡す SQL文 $total => NUM # 削除される予定のデータの件数 $qs_prim => HASHREF # 入力された主テーブルの値
OPTION : rollback => BOOLEAN # rollback する
データの状態を invalid にする。
対象となるデータの中に状態が無効のものがあればエラーを出力する。 また、対象となるデータの件数と $total と比較をし、 一致しなければエラーを出力する。
$opt{rollback} が false ならば commit し、 無効にしたデータに対応する詳細表示用のHTMLを削除する。 true ならば rollback する。
$ret = $dbi->data_check($data, $qsdata, $errwarn, $system, $cmd, $cpage, $page, $restore, %opt);
ARGS : $data => HASHREF # (処理が済んでいる)データ $qsdata => HASHREF # フォームから送られてきた未処理のデータ $errwarn => HASHREF # エラー/警告の情報 $system => HASHREF # システム定義カラムの情報 $cmd => HASHREF # データの追加/修正画面で使えるコマンド $cpage => HASHREF # ページ番号の情報 $page => NUM # ページ番号 $restore => HASH # ファイル型のカラムの修正前の値
OPTION : noencoded => BOOLEAN # true ならば code を利用するカラムが # 既にエンコードされている islast => BOOLEAN # 全てのページを記入し終えたかどうか isfilename => BOOLEAN # true ならば $qsdata の値をファイル名とみなす
RET : STRING # エラーがあれば 'error'、さもなければ undef
入力されたデータをチェックし、結果を $data などに挿入する。 データにエラーが一つでも含まれていれば文字列 'error' を、 さもなければ undef を返す。
具体的には、次の順序で処理を行う。
A. (qsdata が対応するキーを持つ)各テーブルの各レコードについて、次の処理を行う。 1. filter_all に関するエラーを消去する。 2. 各カラムについて、次の処理を行う。 2-1. type が 'file' の場合 2-1-1. select が 'unchange' ならば何もしない。 2-1-2. select が 'none' ならば、必要ならばファイルを消去する。 2-1-3. select が 'restore' ならば、修正元のデータと同じ状態に戻す。 2-1-4. select がそれ以外の値ならば、ファイルを受け取り、 _convfile を呼び出す。エラーがあれば処理をする。 2-1-5. next(A. の次の繰り返しへ)。 2-2. 複数のコントロールから入力があった場合の処理 2-3. infilter を呼び出す(文字コードなどの変換を行う)。 エラーがあれば処理をする。 2-4. _filter_one_data を呼び出す(置換・入力制限のチェックを行う)。 エラーがあれば処理をする。 3. 関連テーブルの場合、レコードが全て空欄かどうかをチェックする。 4. 空欄によるエラーの処理をする。 5. エラーがなく、関連テーブルまたは $opt{islast} が true の場合は filter_all を呼び出す(カラム全体の置換・入力制限のチェックを行う)。 B. 関連テーブルのレコードについて、次の処理を行う。 1. inscmd に従って対応するレコードを挿入する。 2. delcmd に従って対応するレコードを消去する。 3. 全て空欄のレコードを消去する。 C. エラーがあればログに残す。 D. エラーが全くなければ、$errwarn と $system->{system_warning} を更新する。
ファイルのアップロードの場合、$opt{isfilename} が true ならば $qsdata の対応するキーにファイル名が格納されており、 $opt{isfilename} が false ならば CGI.pm によってアップロードして 得られる Fh オブジェクト(cgi.pm 参照)が格納されていなければならない。
データに不具合があった場合(または不具合なくなった場合)は、 $errwarn->{error}, $errwarn->{warning} の対応する値が更新される。 不具合は、一般に $errwarn->{不具合の種類}{テーブル名}[レコード番号]{カラム名} に配列へのリファレンスとして格納される。ただし、filter_all による不具合は、 $errwarn->{不具合の種類}{テーブル名}[レコード番号]{system_all} に配列へのリファレンスとして格納される。 これらの配列の各要素はハッシュへのリファレンスで、 次の値が格納される。
msg : 不具合のメッセージ print : カラムの名前 (system_all を除く) value : 不具合のあった値 (ファイル型, system_all を除く) table : 対応するテーブルの名前 num : テーブルの対応する列の番号 (system_all を除く) page : 対応する挿入画面のページ (system_all を除く) cols : page と print の組 (system_all のみ)
関連テーブルの insert や delete などで指定するレコードの順番は、 処理を行う前のレコードに対応させて処理を行う。 (恐らくこれは妥当な考え方だと思う。) 例えば、3番目のレコードを1番目の直前に移動させ、 1番目のレコードを削除させるように指定された場合、 3番目のレコードを1番目に移動させてから、 1番目のレコード(移動したレコード)を削除するのではなく、 実際には、3番目のレコードを1番目に移動させてから、 2番目のレコード(元々1番目にあったレコード)を削除する。 より微妙な込み入った処理を行いたい場合は、ソースを参照すること。
$ret = $dbi->data_verify_check($data, $presys, $system);
ARGS : $data => HASHREF # データ $presys => HASHREF # 修正前のデータのシステム定義カラムの情報 $system => HASHREF # システム定義カラムの情報
RET : STRING # エラーコード
データを draft用テーブルに挿入し、permission のチェックなどを行う。 エラーがあればエラーコードを返す。
$ret = $dbi->data_insert($data, $presys, $system, $errwarn);
ARGS : $data => HASHREF # データ $presys => HASHREF # 修正前のデータのシステム定義カラムの情報 $system => HASHREF # システム定義カラムの情報 $errwarn => HASHREF # エラー/警告の情報
RET : LIST 0 => NUM # system_rid 1 => STRING # エラーコード
1件のデータを本テーブルに挿入する。 データの修正の場合、$system->{system_state} が有効ならば、 DID の同じデータを無効にする。 $system->{system_state} が申請中ならば、修正元のデータを無効にする。
また、グループに staff の権限がなく、ユーザのメールアドレスが設定されており、 かつ $self->{global}{insert_mail} が設定されていれば、 挿入が完了した旨をメールで知らせる。
挿入に失敗した場合はエラーコードを返す。
$list = $dbi->file_check($fh, $system, $ftype, $nl, $revise, $remove_head, $state, %opt);
ARGS : $fh => FILEHANDLE # ファイルのファイルハンドル $system => HASHREF # システム定義カラムの情報 $ftype => STRING # ファイルの形式 (csv|tab) $newline => STRING # ファイルの改行文字 (\x0D\x0A|\x0D|\x0A) $revise => BOOLEAN # true ならばデータの修正 $remove_head => BOOLEAN # true ならばファイルの1行目を無視する $state => NUM # system_state
OPTION : report => BOOLEAN # 途中経過を出力する code => STRING # 文字コード
RET : HASHREF draft_rid => NUM # draft_rid error => ARRAYREF # エラーの情報 warning => ARRAYREF # 警告の情報 over => ARRAYREF # CSVファイル中に重複のあったデータの位置 ignored => ARRAYREF # 本テーブル中のデータと重複したデータの位置 invalid => ARRAYREF # 外部から修正のあったデータの位置 permission => ARRAYREF # アクセス権がなかったデータの位置 num => HASHREF error => NUM # エラーを含むデータの件数 over => NUM # scalar @{ $ret->{over} } と同じ ignored => NUM # scalar @{ $ret->{ignored} } と同じ success => NUM # 上記以外の(挿入に成功した)データの件数 warning => NUM # 挿入に成功したが警告があるデータの件数 noactive => NUM # データの修正の際 active ではないデータの件数 invalid => NUM # scalar @{ $ret->{invalid} } と同じ permission => NUM # scalar @{ $ret->{permission} } と同じ error_i => NUM # エラーの個数 warning_i => NUM # 警告の個数 total => NUM # データの総計
CSVファイル, タブ区切りファイルを draft用のテーブルに挿入する。
各レコードについて、エラーや警告のチェックを行い、 どのカラムにもエラーがなく、 ファイル内の他のレコードやデータベースの本テーブルと重複していなければ、 draft用のテーブルに挿入する。
メソッドの実行中に draft_rid を1回だけ取得し、 1個のファイルから挿入する全てのレコードに同一の draft_rid を対応付ける。 (draft_rid を利用して他の処理によるデータと識別を行う。)
また、主テーブルと関連テーブルのレコードを対応付けるため、 主テーブルの各レコード毎に seq_rid_dft から番号を取得し、 この値を主テーブルの system_next_rid と関連テーブルの system_rid に 格納する。
データを追加する場合は、ファイル内のシステム定義カラムを完全に無視する。
データを修正する場合は、ファイル内のシステム定義カラムのうち、 system_rid, system_did, system_state, system_uniq を参照する。 system_rid と system_did, system_uniq の組がデータベースの内容と一致し、 かつファイル内のデータとデータベースの対応するデータの system_state が 共に有効の場合のみ、そのデータの修正を試みる。 データが編集されていない場合(system_uniq の値が変わらない場合)は、 修正をしない。
データにエラーや警告があった場合は、 $ret->{error}, $ret->{warning} にハッシュの配列の形で情報を格納する。 ハッシュには次の内容が格納される。
msg : 不具合のメッセージ table : 対応するテーブルの名前 value : 不具合のあった値 num : テーブルの対応する列の番号 col : 不具合のあった列 print : カラムの名前 line : ファイルの対応する行
$ret->{over}, $ret->{ignored} には、 重複のため無効になったデータの $line_mt の値を配列の形で格納する。
$ret = $dbi->file_insert($draft_rid, $addr, $revise, %opt);
ARGS : $draft_rid => NUM # draft_rid $addr => STRING # ADDR $revise => BOOLEAN # true ならばデータの修正
OPTION : report => BOOLEAN # 途中経過を出力する
RET : HASHREF ignored => ARRAYREF # 重複のため無効になったデータの位置 invalid => ARRAYREF # 外部から修正のあったデータの位置 # ($dbi->file_check の $line) permission => ARRAYREF # アクセス権がなかったデータの位置 where_all => STRING # 挿入に成功したデータを検索するためのWHERE句 num => ignored => NUM # scalar @{ $ret->{ignored} } と同じ invalid => NUM # scalar @{ $ret->{invalid} } と同じ permission => NUM # scalar @{ $ret->{permission} } と同じ success => NUM # 上記以外のデータ(挿入に成功したデータ)の件数
file_check メソッドによって draft用のテーブルに挿入されたデータを 本テーブルへ挿入する。 その後、draft用の対応するデータを消去する。 また、挿入されたデータを検索するための WHERE句を生成する。
データの修正の場合は、修正するデータと同じ DID で、 状態が wait か active のデータを無効にする。
$dbi->setincode($code_dist);
文字コードの判別を行う。 $code_dist をデータ定義ファイルの $self->{global}{code} のキーと比較し、 一致するキーが見つかれば、そのキーに対応する値を 入力の文字コードとする($self->{global}{code} に代入する)。 一致するキーが見つからなければエラーを出す。 $self->{global}{code}{''} に値を設定すれば、 $code_dist に値がない場合のデフォルト値になる。 $self->{global}{code} がハッシュへのリファレンスでなく文字列の場合は、 その値を入力の文字コードとする。
$dbi->insert_userinfo($uid);
ARGS : $uid => NUM # UID
ユーザ情報を sys_userinfo に挿入する。 system_uid には指定された UID を挿入し、 その他のカラムには $self->{global}{userinfo}{init} の値を挿入する。
$hashref = $dbi->get_colpage();
RET : HASHREF
データの挿入の画面で、各カラムが何ページ目で入力を促されるかを調べ、 ハッシュに格納する。
$where_clause = $dbi->check_permission($type, %opt);
ARGS : $type => STRING # チェックの種類
OPTION : uid => NUM # system_uid state => NUM # system_state が一致する場合のみを対象にする
RET : STRING # WHERE句 BOOLEAN # true ならばアクセス権がある
データにアクセスできるかどうかを調べる。 $type の値によって、戻り値の意味が異なるが、 絞り込みのための WHERE句を返すか、またはアクセス権の有無を返す。
$cmd = $dbi->selectcmd($expr, %sql);
ARGS : $expr => STRING # テーブルの列名 %sql => HASH where => STRING # WHERE句(必須) from => STRING # FROM句(空文字列ならば主テーブル) where_and => STRING # WHERE句にANDで接続する文字列 join => STRING # JOIN句 order => STRING # ORDER BY句 limit => STRING # LIMIT句
RET : STRING # SELECT文
SQLのSELECT文を生成する。 $expr に集約関数があれば order と limit を無視する。 また、コマンドが文字 ';' で終了していないことを確認する。
$dbi->test_errcode();
$errcode に指定されたエラーコードが エラーメッセージ定義ファイルで定義されていることを確認する。
$dbi->test_conf();
読み込んだデータ定義ファイルが正当かどうかを確認する。
$self->_init();
$self->{db} に必要な情報を代入する。
$self->_print_header(%opt);
OPTION : status => STRING # HTTP ステータス fh => $fh # 出力先
HTTP のヘッダ部分を出力する。 既にヘッダが出力されている場合は、何も出力しない。
$fh = $self->_new_tmpfile($name, %opt); $fh = $self->_new_tmpfile(undef, %opt);
ARGS : $name => STRING or undef # テンポラリファイル名
OPTION : dir => STRING # ディレクトリ head => STRING # ファイル名の先頭の文字列 undelete => BOOLEAN # 削除しない nameref => STRINGREF # ファイル名の格納先
$opt{dir} に($opt{dir}が指定されていなければ $dbi->{global}{basedir}/$dbi->{global}{tmpdir} に) テンポラリファイルを作り、開いたファイルのファイルハンドルを返す。
$name が undef の場合は、tmpnam() を用いてファイル名を取得する。 $opt{nameref} が指定されたときは、$opt{nameref} にテンポラリファイルの ファイル名を格納する。
$val = $self->_get_nextval($seqence);
RET : NUM
SEQUENCE から次の値を取得する。 取得に失敗すれば fatal_error とする。
$ew = $self->_convfile($fh, $nameref, $nameref_tn, %opt);
RET : LIST # エラー・警告の情報 0 => STRING # 'error' or 'warning' 1 => STRING # エラーメッセージ
入力されたファイルを適切に変換する。 変換に成功すれば undef を返す。さもなければエラーメッセージを含む配列を返す。
変換に成功した場合、$nameref, $nameref_tn に新しいファイル名が格納され、 元々 $nameref, $nameref_tn に格納されていた名前のファイルは削除される。
($sth, $sysbnum) = $self->_prepare_insert_cmd($draft, $system, $isbind);
ARGS : $draft => BOOLEAN # true ならば draft用テーブル $system => HASHREF # システム定義カラムの情報 $isbind => HASHREF # bind するシステム定義カラムの情報
RET : LIST # INSERT文 0 => HASHREF # INSERT文のステートメントハンドルオブジェクト 1 => HASHREF # システム定義カラムを bind するための番号
INSERT文を準備する。
$self->_filter_one_data($dbt, $num, $dataref, $errwarn, $searchref, %opt);
OPTION : page => NUM # 対応するページ番号 noencode => BOOLEAN # code を使うデータについて、 # 既にエンコードされているとみなす check => BOOLEAN # 既に登録されているデータのチェック用
RET : undef
1つのカラムの値のチェック・置換を行う。
具体的には、次の順序で処理を行う。
1. $self->{db}{prefilter_each} が定義されていれば、このフィルタを通す。 2. subst が定義されていれば、このフィルタを通す。 3. 値が空文字列ならば、 3-1. エラーチェックや置換を行う。 3-2. 検索用カラムの処理を行う。 3-3. メソッドを終了する。 4. 値が対応するSQLのデータ型のフォーマットを満たすことを確かめる。 満たさなければエラー処理をした後、メソッドを終了する。 5. format_error が定義されていれば、入力制限をチェックする。 エラーが発生すればメソッドを終了する。 6. format_warning が定義されていれば、入力制限をチェックする。 7. 検索用カラムの処理を行う。
引数の $errwarn->{error} や $errwarn->{warning} は 配列へのリファレンスでなければならない。 データに不具合があった場合は、$errwarn->{error} や $errwarn->{warning} に要素が追加される。これらの要素はハッシュへのリファレンスで、 次のキーと値を持つ。
msg : 不具合のメッセージ table : 対応するテーブルの名前 value : 不具合のあった値 num : テーブルの対応する列の番号 print : カラムの名前 page : 対応する挿入画面のページ (= $opt{page})
$err = $self->_file_filter_indata($data, $infilter_error);
ARGS : data => ARRAYREF # データの情報(ファイルのカラム順) infilter_error => BOOLEAN # true ならば infilter メソッドでエラーがあった
RET : ARRAY 0 => HASHREF # データの情報 1 => HASHREF error => HASHREF # エラーの情報 warning => HASHREF # 警告の情報
ファイルから入力されたデータの各カラムやカラム全体のチェック・置換を行う。
$self->_insert_filedb($file, $dbtable, $num, $col, $system, $errwarn);
ファイルの情報をデータベースに挿入する。 挿入する情報は、ファイル名、サムネイルのファイル名、 利用元のテーブル名、system_num の値、利用元のカラム名、 ファイルが挿入されたときの system_rid の値、挿入された時刻等。
$self->{__export_html_detail} = $self->_init_export_html_detail($rid);
_export_html_detail メソッドを実行する前に必要な変数を初期化する。
$self->_export_html_detail($rid);
ARGS : $rid => NUM # レコードID
詳細表示のHTML を出力する。 テンプレートファイル側では、$var{export} の値を調べれば、 エクスポートしているかどうかを判別できる。
$rid が undef のときは、$self->{__export_html_detail} の設定のみを行う。
$num = $self->_update_invalid($where, $next_rid, %opt);
ARGS : $where => STRING # WHERE句 $next_rid => NUM # system_next_rid
OPTION : system => HASHREF # システム定義カラムの情報 join => STRING # JOIN句
RET : NUM # UPDATEされたデータの件数
$where で指定されたデータのうち、無効でないデータを無効にする。 データの修正の場合は通常、$next_rid に値を格納する必要がある。
必要に応じて、system_inv_method, system_inv_addr, system_inv_agent に値を格納できる。さもなければ、デフォルト値が使われる。
具体的には、データのシステム定義カラムを次のように変更する。
* system_state を invalid にする。 * system_uniq を null値にする。 * system_inv_date に現時刻を格納する。 * system_pre_state に更新前の system_state の値を格納する。 * system_next_rid に $next_rid を格納する。 * system_inv_method, system_inv_addr, system_inv_agent, system_inv_uid に 指定された値またはデフォルト値を格納する。
UPDATEコマンドの実行に失敗したときは rollback を実行するが、 成功しても commit を実行しない。
UPDATE に成功したデータの件数(件数が 0 の場合は '0E0')を返す。 Permission に引っかかった場合は、UPDATEコマンドを実行する前に undef を返す。
$uniq = $self->_calc_system_uniq($data);
ARGS : $data => HASHREF # データ
RET : STRING # system_uniq
主テーブルの1レコード分のデータ全てから、system_uniq を計算する。
$array = $self->_hash2array_data($hash, $dbt);
ARGS : $hash => HASHREF # テーブル $dbt のデータ $dbt => STRING # テーブル名
RET : ARRAYREF # $hash を配列に変えたデータ
テーブル $dbt の 1レコード分のデータを、 ハッシュへのリファレンスから配列へのリファレンスに変換する。
$uniq = $self->_commit(%opt);
OPTION : rollback => BOOLEAN # true ならば rollback する
commit文を実行する。
$self->_init_dbfile();
$self->{col_dbfile} に値を設定する。
$self->_init_userinfo();
$self->{col_userinfo} に値を設定する。
$self->_pgsqlunpack($ref);
PostgreSQL の文字列定数中の特殊な文字を逆スラッシュ('\')使って表す。
具体的には \x0A, \x1D を、それぞれ '\n', '\035' に変換する。 また、'\', ``''' の前に '\' を付ける。
$fh = $self->_cut_macbinary($fh_in, $fh_out);
RET : FH # $fh_out
$fh_in で示されるファイルが MacBinary かどうかを判別し、 もし MacBinary ならば、データフォークのみを抽出する。 $fh_in, $fh_out のファイルポインタは先頭を指していなければならない。
$fh_out が指定されていれば、MacBinary であるかどうかに関わらず、 データ部分を $fh_out に出力し、$fh_out を返す。 $fh_out が指定されていなければ、MacBinary だった場合のみ 新しく作ったテンポラリファイルにデータ部分を出力し、 そのファイルハンドルを返す。 $fh_out が指定されず、MacBinary でもない場合は undef を返す。
&dbdebug('sub', @_);
デバッグ情報を出力する。
IO::File, CGI, Text::CSV_XS, DBI, Jcode, Digest::MD5, DBIPgSystem::Code
Copyright (C) 2002 The Nagoya University Consumers' Co-operative Association
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the following URL for more details: http://www.gnu.org/licenses/gpl.txt
Written by Kenji Nakahira <nakahira@coop.nagoya-u.ac.jp>