Top マニュアル

DBIPgSystem::DB.pm


NAME

DBIPgSystem::DB - DBIPgSystem のよりコアの部分


DESCRIPTION

データ定義ファイルから読み込んだ情報を持ち、 データベースへアクセスしたり、 CSV/タブ区切り形式の入出力を行う。

METHODS --- API

new ( CONFIG_FILE, GROUP, USER [,OPTION] )
  $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 はデータ定義ファイル。

print_template ( TEMPLATE [,HASHREF [,OPTION] ] )
  $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 の値を変更すべきではない。

add_log ( TYPE, MSG [,HASH] )
  $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関数を使ってプログラムの状態をログに書き出す。

print_error ( TITLE, ERROR_CODE [,LOGTITLE [,LOGS] ] )
  $dbi->print_error($title, $err);
  $dbi->print_error($title, $err, $logtitle, %logs);

HTML形式でエラーを出力して終了する。

fatal_error ( MSG [,HASH] )
  $dbif->fatal_error($msg, %vars);

致命的なエラー(ユーザ側に原因がないはずのエラー)の処理をする。 ログに書き出し、メッセージを出力し、 事務局にエラーの内容をメールで通知する。 処理が終わったら終了する。

send_mail ( TO, SUBJECT, BODY [,OPTION] )
  $dbi->send_mail($to, $subject, $body, %opt);
    ARGS :
      $to => STRING            # To ヘッダ
      $subject => STRING       # Subject ヘッダ
      $body => STRING or ARRAYREF  # 本文
    OPTION :
      $header => HASHREF       # オプションのヘッダ

メールを送る。$to と $subject は必ず定義されていなければならない。 $body が配列へのリファレンスの場合は、改行で接続したものを本文とする。

col_split ( DATA [,CODE] )
  @data = $dbi->col_split($data);
  @data = $dbi->col_split($data, $code);
    ARGS :
      $data => STRING          # 文字列(通常はカラムの値)
      $code => STRING          # $self->{code} のキー
    RET : @array

複数の値を持つカラムの値を、文字列から配列の形に変換する。 $code を指定した場合は、$self->{code}{$code} を参照して 対応する値を返す。

fileinfo ( VALUE )
  ($path, $uri) = $dbi->fileinfo($value);
    ARGS :
      $value => STRING         # カラムの値
    RET : @array
      0 => STRING              # URI
      1 => STRING              # パス

ファイル型のカラムに格納されているファイルのURIとパスを返す。 呼び出し元のコンテキストがスカラー値を求めているときはURIを返す。 戻り値は、$self->{sys}{export_mode} によって異なる。

export_uri ( DID, PAGE )
  $uri = $dbi->export_uri($did, $page);
    RET : STRING                 # URI

$did, $page に対応するエクスポートされたファイルのURIを返す。

getcookie ( )
  $value = $dbi->getcookie($name);

クッキーから対応する値を取得する。

cmp_order ( ORDER, LIST )
  $num = $dbi->cmp_order($order, @list);
    RET : NUM                  # マッチした位置

ORDER句として、@list の中から $order と意味的に等しいもの、 または ORDERが正反対のものを探し、その index を返す。 もしなければ undef を返す。

infilter ( STRREF [,OPTION] )
  $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 を返す。

create_table ( [OPTION] )
  $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 が対象になる。

create_userinfo_table ( [OPTION] )
  $str = $dbi->create_userinfo_table() or die;
    OPTION :
      drop => BOOLEAN          # DROP コマンドも返す
    RET : STRING               # CREATE TABLE コマンド

データ定義ファイルに従ってテーブル system_userinfo を作成するような CREATE TABLE コマンドを返す。

selectrow_array ( SQL [,OPTION] )
  $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 を返す。

selectall_arrayref ( SQL [,OPTION] )
  $list = $dbi->selectall_arrayref($sql, %opt);
    ARGS :
      $sql => STRING           # SELECT文
    OPTION :
      nofatal => BOOLEAN       # fatal_error があっても強制終了しない
    RET : STRING               # DBI::selectall_arrayref の戻り値

DBI::selectall_arrayref を実行する。 フェッチで得られた変数を返す。 フェッチに失敗したときは undef を返す。

do ( SQL )
  $dbi->do($sql);
    ARGS :
      $sql => STRING           # コマンド
    RET : STRING               # DBI::do の戻り値

DBI::do を実行する。

get_errmsg ( CODE [,VAR] )
  $str = $dbi->get_errmsg($code, @var)

エラーメッセージを取得する。 $code が ':' で始まる場合は、$code の2文字目以降(':'以降)の文字列を エラーメッセージとする。 さもなければ、エラーメッセージ定義ファイルから対応するメッセージを得る。 エラーメッセージを適切にエスケープしてから、戻り値として返す。

warn_ ( MSG )
  $dbi->warn_(@msg);

@msg を標準出力に出力する。デバッグ時に用いると便利。

get_template_detail ( PAGE [,GROUP] )
  $html = $dbi->get_template_detail($page);
  $html = $dbi->get_template_detail($page, $group);

データの詳細表示で、次に表示するページ名を返す。 対応するページがない場合は、null を返す。

get_template_insert ( PAGE )
  $html = $dbi->get_template_insert($page);

データの挿入で、次に表示するページ名を返す。 対応するページがない場合は、null を返す。

file_collist ( )
  $collist = $dbi->file_collist();
    RET : ARRAYREF             # カラムのリスト

CSV/タブ区切りファイルのインポート時に受け付けるカラムの順序を返す。 戻り値の各要素は配列へのリファレンスで、対応するテーブルの名前 $dbt と、 $self->{dbcol}{$dbt}[$i] が格納される。 ただし、対応するテーブルが主テーブルの場合は、$dbt に空文字列が格納される。

get_actid ( DID )
  $rid = $dbi->get_actid($did);
    ARGS :
      $did => STRING           # データID
    RET : NUM                  # レコードID

指定されたDIDで、有効なデータのRIDを返す。 対応するデータは、検索可能でなければならない。

METHODS

search ( RID, REVISE [,OPTION] )
  ($total, $list) = $dbi->search($cols, $sql);
    ARGS :
      $cols => STRING          # 検索のカラム名
      $sql => HASHREF          # selectcmd に渡す SQL文
    RET : LIST
      0 => NUM                 # 検索結果の総計
      1 => ARRAYREF            # selectall_arrayref での検索結果

与えられた条件で検索を行う。検索結果の総計と、検索結果を返す。 条件に誤りがあれば undef を返す。

search_detail ( RID, REVISE )
  ($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} が定義されていれば、実行される。

get_errwarn ( DATA, CPAGE )
  $warn = $dbi->get_errwarn($data, $cpage);
    ARGS :
      $data => HASHREF         # データ
      $cpage => HASHREF        # ページ番号の情報
    RET : HASHREF
      error => HASHREF         # エラーの情報
      warning => HASHREF       # 警告の情報

$data からエラー/警告の情報を生成する。 このメソッドは、通常データの修正を開始する際に呼び出され、 data_check の $errwarn に対応する値を返す。

db2file ( SQL, FILENAME, TYPE [,OPTION] )
  $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} を指定して、出力にフィルタを通すことができる。

remove_data ( SQL, TOTAL [,OPTION] )
  $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 する。

data_check ( DATA, QSDATA, ERRWARN, SYSTEM, CMD, CPAGE, PAGE, RESTORE [,OPTION] )
  $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番目にあったレコード)を削除する。 より微妙な込み入った処理を行いたい場合は、ソースを参照すること。

data_verify_check ( DATA, PRESYS, SYSTEM )
  $ret = $dbi->data_verify_check($data, $presys, $system);
    ARGS :
      $data => HASHREF         # データ
      $presys => HASHREF       # 修正前のデータのシステム定義カラムの情報
      $system => HASHREF       # システム定義カラムの情報
    RET : STRING               # エラーコード

データを draft用テーブルに挿入し、permission のチェックなどを行う。 エラーがあればエラーコードを返す。

data_insert ( DATA, PRESYS, SYSTEM, ERRWARN )
  $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} が設定されていれば、 挿入が完了した旨をメールで知らせる。

挿入に失敗した場合はエラーコードを返す。

file_check ( FILEHANDLE, SYSTEM, FTYPE, NEWLINE, REVISE, REMOVE_HEAD, STATE [,OPTION] )
  $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 の値を配列の形で格納する。

file_insert ( DRAFT_RID, ADDR, REVISE [,OPTION] )
  $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 のデータを無効にする。

setincode ( CODE_DIST )
  $dbi->setincode($code_dist);

文字コードの判別を行う。 $code_dist をデータ定義ファイルの $self->{global}{code} のキーと比較し、 一致するキーが見つかれば、そのキーに対応する値を 入力の文字コードとする($self->{global}{code} に代入する)。 一致するキーが見つからなければエラーを出す。 $self->{global}{code}{''} に値を設定すれば、 $code_dist に値がない場合のデフォルト値になる。 $self->{global}{code} がハッシュへのリファレンスでなく文字列の場合は、 その値を入力の文字コードとする。

insert_userinfo ( UID )
  $dbi->insert_userinfo($uid);
    ARGS :
      $uid => NUM              # UID

ユーザ情報を sys_userinfo に挿入する。 system_uid には指定された UID を挿入し、 その他のカラムには $self->{global}{userinfo}{init} の値を挿入する。

get_colpage ( )
  $hashref = $dbi->get_colpage();
    RET : HASHREF

データの挿入の画面で、各カラムが何ページ目で入力を促されるかを調べ、 ハッシュに格納する。

check_permission ( KIND [,OPTION] )
  $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句を返すか、またはアクセス権の有無を返す。

selectcmd ( EXPRESSION [,SQL] )
  $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 を無視する。 また、コマンドが文字 ';' で終了していないことを確認する。

TEST METHODS

test_errcode ( )
  $dbi->test_errcode();

$errcode に指定されたエラーコードが エラーメッセージ定義ファイルで定義されていることを確認する。

test_conf ( )
  $dbi->test_conf();

読み込んだデータ定義ファイルが正当かどうかを確認する。

INTERNAL METHODS

_init ( )
  $self->_init();

$self->{db} に必要な情報を代入する。

_print_header ( [OPTION] )
  $self->_print_header(%opt);
    OPTION :
      status => STRING           # HTTP ステータス
      fh => $fh                # 出力先

HTTP のヘッダ部分を出力する。 既にヘッダが出力されている場合は、何も出力しない。

_new_tmpfile ( NAME [,OPTION] )
  $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} にテンポラリファイルの ファイル名を格納する。

_get_nextval ( SEQUENCE )
  $val = $self->_get_nextval($seqence);
    RET : NUM

SEQUENCE から次の値を取得する。 取得に失敗すれば fatal_error とする。

_convfile ( FH, NAMEREF, NAMEREF_TN [,OPTION] )
  $ew = $self->_convfile($fh, $nameref, $nameref_tn, %opt);
    RET : LIST                 # エラー・警告の情報
      0 => STRING              # 'error' or 'warning'
      1 => STRING              # エラーメッセージ

入力されたファイルを適切に変換する。 変換に成功すれば undef を返す。さもなければエラーメッセージを含む配列を返す。

変換に成功した場合、$nameref, $nameref_tn に新しいファイル名が格納され、 元々 $nameref, $nameref_tn に格納されていた名前のファイルは削除される。

_prepare_insert_cmd ( DRAFT, SYSTEM, ISBIND )
  ($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文を準備する。

_filter_one_data ( DBTABLE, NUM, DATAREF, ERRWARN, SEARCHREF [,OPTION] )
  $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})
_file_filter_indata ( DATA, INFILTER_ERROR )
  $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      # 警告の情報

ファイルから入力されたデータの各カラムやカラム全体のチェック・置換を行う。

_insert_filedb ( FILENAME, DBTABLE, NUM, COLNAME, SYSTEM, ERRWARN )
  $self->_insert_filedb($file, $dbtable, $num, $col, $system, $errwarn);

ファイルの情報をデータベースに挿入する。 挿入する情報は、ファイル名、サムネイルのファイル名、 利用元のテーブル名、system_num の値、利用元のカラム名、 ファイルが挿入されたときの system_rid の値、挿入された時刻等。

_init_export_html_detail ( RID )
  $self->{__export_html_detail} = $self->_init_export_html_detail($rid);

_export_html_detail メソッドを実行する前に必要な変数を初期化する。

_export_html_detail ( RID )
  $self->_export_html_detail($rid);
    ARGS :
      $rid => NUM              # レコードID

詳細表示のHTML を出力する。 テンプレートファイル側では、$var{export} の値を調べれば、 エクスポートしているかどうかを判別できる。

$rid が undef のときは、$self->{__export_html_detail} の設定のみを行う。

_update_invalid ( WHERE [,OPTION] )
  $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 を返す。

_calc_system_uniq ( DATA )
  $uniq = $self->_calc_system_uniq($data);
    ARGS :
      $data => HASHREF         # データ
    RET : STRING               # system_uniq

主テーブルの1レコード分のデータ全てから、system_uniq を計算する。

_hash2array_data ( HASH, DBTABLE )
  $array = $self->_hash2array_data($hash, $dbt);
    ARGS :
      $hash => HASHREF         # テーブル $dbt のデータ
      $dbt => STRING           # テーブル名
    RET : ARRAYREF             # $hash を配列に変えたデータ

テーブル $dbt の 1レコード分のデータを、 ハッシュへのリファレンスから配列へのリファレンスに変換する。

_commit ( [OPTION] )
  $uniq = $self->_commit(%opt);
    OPTION :
      rollback => BOOLEAN      # true ならば rollback する

commit文を実行する。

_init_dbfile ( )
  $self->_init_dbfile();

$self->{col_dbfile} に値を設定する。

_init_userinfo ( )
  $self->_init_userinfo();

$self->{col_userinfo} に値を設定する。

_pgsqlunpack ( REF )
  $self->_pgsqlunpack($ref);

PostgreSQL の文字列定数中の特殊な文字を逆スラッシュ('\')使って表す。

具体的には \x0A, \x1D を、それぞれ '\n', '\035' に変換する。 また、'\', ``''' の前に '\' を付ける。

_cut_macbinary ( FH_IN, FH_OUT )
  $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 を返す。

SUBROUTINES

dbdebug ( TYPE [,LIST] )
  &dbdebug('sub', @_);

デバッグ情報を出力する。


SEE ALSO

IO::File, CGI, Text::CSV_XS, DBI, Jcode, Digest::MD5, DBIPgSystem::Code


COPYRIGHT

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>