パッケージ化したサブルーチン
0001: package IBCommon; 0002: use 5.006_001; 0003: use strict; 0004: use IBPerl; 0005: 0006: our (@ISA, @EXPORT); 0007: use Exporter(); 0008: @ISA = qw(Exporter); 0009: @EXPORT = qw( 0010: connectDB 0011: disconnectDB 0012: startTransaction 0013: commitTransaction 0014: checkSelect 0015: checkInsert 0016: checkInsertUpdate 0017: insertData 0018: updateData 0019: selectRows 0020: selectRowsLike 0021: selectOneLine 0022: deleteRows 0023: execProcedure 0024: ); 0025: 0026: # subroutine ###################################################### 0027: # DB 接続 0028: # 引数 $p_db : データベースハンドラへのポインタ 0029: # $dbpath : データベースへのパス(文字列) 0030: # $user : ユーザ名(文字列) 0031: # $password : パスワード(文字列) 0032: # $chaeset : CharacterSet(文字列) 0033: # 返値 データベースハンドラへのポインタ 0034: # エラー STDERRにメッセージを書いてexit(1) 0035: # 0036: sub connectDB 0037: { 0038: my($p_db, $dbpath, $user, $password, $charset)=@_; 0039: $$p_db=IBPerl::Connection->new(Path=>$dbpath, 0040: User=>$user, 0041: Password=>$password, 0042: Charset=>$charset, 0043: Dialect=>3); 0044: if ($$p_db->{Handle}<0){ 0045: print(STDERR "connectDB: $$p_db->{Handle} $$p_db->{Error}\n"); 0046: exit(1); 0047: } 0048: } 0049: 0050: # subroutine ###################################################### 0051: # DB 切断 0052: # 引数 $p_db : データベースハンドラへのポインタ 0053: # 返値 データベースハンドラへのポインタ 0054: # エラー STDERRにメッセージを書いてexit(1) 0055: # 0056: sub disconnectDB 0057: { 0058: my($p_db)=@_; 0059: if ($$p_db->disconnect()<0){ 0060: print(STDERR "disconnectDB: $$p_db->{Handle} $$p_db->{Error}\n"); 0061: exit(1); 0062: } 0063: } 0064: 0065: # subroutine ###################################################### 0066: # Transaction 開始 0067: # 引数 $p_db : データベースハンドラへのポインタ 0068: # $p_trans : トランザクションハンドラへのポインタ 0069: # 返値 トランザクションハンドラへのポインタ 0070: # エラー STDERRにメッセージを書いてexit(1) 0071: # 0072: sub startTransaction 0073: { 0074: my($p_db, $p_trans)=@_; 0075: $$p_trans=IBPerl::Transaction->new(Database=>$$p_db); 0076: if ($$p_trans->{Handle}<0){ 0077: print(STDERR "startTransaction: $$p_trans->{Handle} $$p_db->{Error}\n"); 0078: exit(1); 0079: } 0080: } 0081: 0082: # subroutine ###################################################### 0083: # Transaction コミット 0084: # 引数 $p_trans : トランザクションハンドラへのポインタ 0085: # 返値 トランザクションハンドラへのポインタ 0086: # エラー STDERRにメッセージを書いてexit(1) 0087: # 0088: sub commitTransaction 0089: { 0090: my($p_trans)=@_; 0091: if ($$p_trans->commit()<0){ 0092: print(STDERR "commitTransaction: $$p_trans->{Handle}\n"); 0093: exit(1); 0094: } 0095: } 0096: 0097: # subroutine ###################################################### 0098: # Transaction ロールバック 0099: # 引数 $p_trans : トランザクションハンドラへのポインタ 0100: # 返値 トランザクションハンドラへのポインタ 0101: # エラー STDERRにメッセージを書いてexit(1) 0102: # 0103: sub rollbackTransaction 0104: { 0105: my($p_trans)=@_; 0106: if ($$p_trans->rollback()<0){ 0107: print(STDERR "rollbackTransaction: $$p_trans->{Handle}\n"); 0108: exit(1); 0109: } 0110: } 0111: 0112: # subroutine ###################################################### 0113: # 行の存在チェック 0114: # 引数 $p_trans : トランザクションハンドラへのポインタ 0115: # $p_tbl : テーブル名(文字列)へのポインタ 0116: # $p_khash : キー名=>キー値のハッシュへのポインタ 0117: # $p_option : SQL文のオプション(文字列)へのポインタ 0118: # $p_sql : SQL を返すポインタ 0119: # 返値 存在すれば 1 0120: # 存在しなければ 0 0121: # 0122: sub checkSelect 0123: { 0124: my($p_trans, $p_tbl, $p_khash, $p_option, $p_sql)=@_; 0125: my($sql)="SELECT * FROM $$p_tbl WHERE "; 0126: for (keys %$p_khash){ 0127: $sql.="$_='" . $p_khash->{$_} . "' AND "; 0128: } 0129: $sql=~s/ AND $//; 0130: $sql.=" ".$$p_option if ($p_option); 0131: $$p_sql=$sql if ($p_sql); 0132: my($st)=IBPerl::Statement->new(Transaction=>$$p_trans, SQL=>$sql); 0133: my(%hash); 0134: $st->fetch(\%hash); 0135: return((%hash==0)?0:1); 0136: } 0137: 0138: # subroutine ###################################################### 0139: # 行の追加 0140: # 行の存在をチェックし、存在しなければ新規に追加する 0141: # 引数 $p_trans : トランザクションハンドラへのポインタ 0142: # $p_tbl : テーブル名(文字列)へのポインタ 0143: # $p_khash : キー名=>キー値のハッシュへのポインタ 0144: # $p_vhash : カラム名=>値のハッシュへのポインタ 0145: # $p_option : SQL文のオプション(文字列)へのポインタ 0146: # $p_sql : SQL文 を返すポインタ 0147: # 返値 INSERT すれば 1 0148: # スキップすれば 0 0149: # エラー STDERRにメッセージを書いてexit(1) 0150: # 0151: sub checkInsert 0152: { 0153: my($p_trans, $p_tbl, $p_khash, $p_vhash, $p_option, $p_sql)=@_; 0154: my($sql)="SELECT * FROM $$p_tbl WHERE "; 0155: for (keys %$p_khash){ 0156: $sql.="$_='" . $p_khash->{$_} . "' AND "; 0157: } 0158: $sql=~s/ AND $//; 0159: $sql.=$$p_option if ($p_option); 0160: $$p_sql=$sql if ($p_sql); 0161: my($st)=IBPerl::Statement->new(Transaction=>$$p_trans, SQL=>$sql); 0162: my(%hash); 0163: $st->fetch(\%hash); 0164: if (%hash){ 0165: # 存在する 0166: return(0); 0167: }else{ 0168: # 存在しない 0169: my($sql)="INSERT INTO $$p_tbl("; 0170: for (keys %$p_vhash){ 0171: $sql.="$_,"; 0172: } 0173: $sql=~s/,$//; 0174: $sql.=") VALUES("; 0175: for (values %$p_vhash){ 0176: $sql.="'".$_."',"; 0177: } 0178: $sql=~s/,$//; 0179: $sql.=")"; 0180: $$p_sql.=" ".$sql if ($p_sql); 0181: my($st)=IBPerl::Statement->new(Transaction=>$$p_trans, SQL=>$sql); 0182: if ($st->{Handle}<0){ 0183: print(STDERR "checkInsert new: $st->{Handle} $st->{Error}\n"); 0184: exit(1); 0185: } 0186: $st->execute(); 0187: if ($st->{Handle}<0){ 0188: print(STDERR "checkInsert execute: $st->{Handle} $st->{Error}\n"); 0189: exit(1); 0190: } 0191: return(1); 0192: } 0193: } 0194: 0195: # subroutine ###################################################### 0196: # 行の追加または更新 0197: # 行の存在をチェックし、存在すれば更新する 0198: # 存在しなければ新規に追加する 0199: # 引数 $p_trans : トランザクションハンドラへのポインタ 0200: # $p_tbl : テーブル名(文字列)へのポインタ 0201: # $p_khash : キー名=>キー値のハッシュへのポインタ 0202: # $p_vhash : カラム名=>値のハッシュへのポインタ 0203: # $p_option : SQL文のオプション(文字列)へのポインタ 0204: # $p_sql : SQL文 を返すポインタ 0205: # 返値 INSERT ならば 1 0206: # UPDATE ならば 0 0207: # エラー STDERRにメッセージを書いてexit(1) 0208: # 0209: sub checkInsertUpdate 0210: { 0211: my($p_trans, $p_tbl, $p_khash, $p_vhash, $p_option, $p_sql)=@_; 0212: my($sql)="SELECT * FROM $$p_tbl WHERE "; 0213: for (keys %$p_khash){ 0214: $sql.="$_='" . $p_khash->{$_} . "' AND "; 0215: } 0216: $sql=~s/ AND $//; 0217: $$p_sql=$sql if ($p_sql); 0218: my($st)=IBPerl::Statement->new(Transaction=>$$p_trans, SQL=>$sql); 0219: my(%hash); 0220: $st->fetch(\%hash); 0221: unless (%hash){ 0222: # 存在しない 0223: my($sql)="INSERT INTO $$p_tbl("; 0224: for (keys %$p_vhash){ 0225: $sql.="$_,"; 0226: } 0227: $sql=~s/,$//; 0228: $sql.=") VALUES("; 0229: for (values %$p_vhash){ 0230: $sql.="'".$_."',"; 0231: } 0232: $sql=~s/,$//; 0233: $sql.=")"; 0234: $$p_sql.=" ".$sql if ($p_sql); 0235: my($st)=IBPerl::Statement->new(Transaction=>$$p_trans, SQL=>$sql); 0236: if ($st->{Handle}<0){ 0237: print(STDERR "checkInsertUpdate new: $st->{Handle} $st->{Error}\n"); 0238: exit(1); 0239: } 0240: $st->execute(); 0241: if ($st->{Handle}<0){ 0242: print(STDERR "checkInsertUpdate execute: $st->{Handle} $st->{Error}\n"); 0243: exit(1); 0244: } 0245: return(1); 0246: }else{ 0247: # 存在する 0248: my($sql)="UPDATE $$p_tbl SET "; 0249: for (keys %$p_vhash){ 0250: $sql.="$_='".$$p_vhash{$_}."',"; 0251: } 0252: $sql=~s/,$//; 0253: $sql.=" WHERE "; 0254: for (keys %$p_khash){ 0255: $sql.="$_='".$$p_khash{$_}."' AND "; 0256: } 0257: $sql=~s/ AND $//; 0258: $$p_sql.=" ".$sql if ($p_sql); 0259: my($st)=IBPerl::Statement->new(Transaction=>$$p_trans, SQL=>$sql); 0260: if ($st->{Handle}<0){ 0261: print(STDERR "checkInsertUpdate new: $st->{Handle} $st->{Error}\n"); 0262: exit(1); 0263: } 0264: $st->execute(); 0265: if ($st->{Handle}<0){ 0266: print(STDERR "checkInsertUpdate execute: $st->{Handle} $st->{Error}\n"); 0267: exit(1); 0268: } 0269: return(0); 0270: } 0271: } 0272: 0273: # subroutine ###################################################### 0274: # 行の追加 0275: # 引数 $p_trans : トランザクションハンドラへのポインタ 0276: # $p_tbl : テーブル名(文字列)へのポインタ 0277: # $p_vhash : カラム名=>値のハッシュへのポインタ 0278: # $p_sql : SQL文 を返すポインタ 0279: # 返値 SQL実行後のステートメントハンドラ 0280: # エラー STDERRにメッセージを書いてexit(1) 0281: # 0282: sub insertData 0283: { 0284: my($p_trans, $p_tbl, $p_vhash, $p_sql)=@_; 0285: my($sql)="INSERT INTO $$p_tbl("; 0286: for (keys %$p_vhash){ 0287: $sql.="$_,"; 0288: } 0289: $sql=~s/,$//; 0290: $sql.=") VALUES("; 0291: for (values %$p_vhash){ 0292: $sql.="'".$_."',"; 0293: } 0294: $sql=~s/,$//; 0295: $sql.=")"; 0296: $$p_sql=$sql if ($p_sql); 0297: my($st)=IBPerl::Statement->new(Transaction=>$$p_trans, SQL=>$sql); 0298: if ($st->{'Handle'}<0){ 0299: print(STDERR "insertData new: $st->{Handle} $st->{Error}\n"); 0300: return 0; 0301: # exit(1); 0302: } 0303: $st->execute(); 0304: if ($st->{'Handle'}<0){ 0305: print(STDERR "insertData execute: $st->{Handle} $st->{Error}\n"); 0306: return 0; 0307: # exit(1); 0308: } 0309: } 0310: 0311: # subroutine ###################################################### 0312: # 行の更新 0313: # 引数 $p_trans : トランザクションハンドラへのポインタ 0314: # $p_tbl : テーブル名(文字列)へのポインタ 0315: # $p_khash : キー名=>キー値のハッシュへのポインタ 0316: # $p_vhash : カラム名=>値のハッシュへのポインタ 0317: # $p_option : SQL文のオプション(文字列)へのポインタ 0318: # $p_sql : SQL文 を返すポインタ 0319: # 返値 SQL実行後のステートメントハンドラ 0320: # エラー STDERRにメッセージを書いてexit(1) 0321: # 0322: sub updateData 0323: { 0324: my($p_trans, $p_tbl, $p_khash, $p_vhash, $p_sql)=@_; 0325: my($sql); 0326: $sql="UPDATE $$p_tbl SET "; 0327: for (keys %$p_vhash){ 0328: $sql.="$_='".$$p_vhash{$_}."',"; 0329: } 0330: $sql=~s/,$//; 0331: $sql.=" WHERE "; 0332: for (keys %$p_khash){ 0333: $sql.="$_='".$$p_khash{$_}."' AND "; 0334: } 0335: $sql=~s/ AND $//; 0336: $$p_sql=$sql if ($p_sql); 0337: my($st)=IBPerl::Statement->new(Transaction=>$$p_trans, SQL=>$sql); 0338: if ($st->{Handle}<0){ 0339: print(STDERR "updateData new: $st->{Handle} $st->{Error}\n"); 0340: exit(1); 0341: } 0342: $st->execute(); 0343: if ($st->{Handle}<0){ 0344: print(STDERR "updateData execute: $st->{Handle} $st->{Error}\n"); 0345: exit(1); 0346: } 0347: } 0348: 0349: # subroutine ###################################################### 0350: # 行の検索 0351: # 引数 $p_trans : トランザクションハンドラへのポインタ 0352: # $p_tbl : テーブル名(文字列)へのポインタ 0353: # $p_khash : キー名=>キー値のハッシュへのポインタ 0354: # $p_option : SQL文のオプション(文字列)へのポインタ 0355: # $p_sql : SQL文 を返すポインタ 0356: # $dtfmt : 日付フォーマット(デフォルト %F) 0357: # $tmfmt : 時刻フォーマット(デフォルト %T) 0358: # 返値 生成したステートメントオブジェクト 0359: # エラー STDERRにメッセージを書いてexit(1) 0360: # 0361: sub selectRows{ 0362: my($p_trans, $p_tbl, $p_khash, $p_option, $p_sql, $dtfmt, $tmfmt)=@_; 0363: my($sql)="SELECT * FROM $$p_tbl"; 0364: if ($p_khash){ 0365: $sql.=" WHERE "; 0366: for (keys %$p_khash){ 0367: $sql.="$_='".$$p_khash{$_}."' AND "; 0368: } 0369: $sql=~s/AND $//; 0370: } 0371: $sql.=" ".$$p_option if ($p_option); 0372: $$p_sql=$sql if ($p_sql); 0373: my($dtformat)="%F"; 0374: my($tmformat)="%T"; 0375: $dtformat=$dtfmt if ($dtfmt); 0376: $tmformat=$tmfmt if ($tmfmt); 0377: my($tsformat)=$dtformat." ".$tmformat; 0378: my($st)=IBPerl::Statement->new(Transaction=>$$p_trans, 0379: SQL=>"$sql", 0380: TimeFormat=>$tmformat, 0381: DateFormat=>$dtformat, 0382: TimeStampFormat=>$tsformat); 0383: if ($st->{Handle}<0){ 0384: print(STDERR "selectRowsbyKey new: $st->{Handle} $st->{Error}\n"); 0385: exit(1); 0386: } 0387: return($st); 0388: } 0389: 0390: # subroutine ###################################################### 0391: # 行の検索 0392: # 引数 $p_trans : トランザクションハンドラへのポインタ 0393: # $p_tbl : テーブル名(文字列)へのポインタ 0394: # $p_khash : キー名=>キー値のハッシュへのポインタ 0395: # $p_option : SQL文のオプション(文字列)へのポインタ 0396: # $p_sql : SQL文 を返すポインタ 0397: # $dtfmt : 日付フォーマット(デフォルト %F) 0398: # $tmfmt : 時刻フォーマット(デフォルト %T) 0399: # 返値 生成したステートメントオブジェクト 0400: # エラー STDERRにメッセージを書いてexit(1) 0401: # 0402: sub selectRowsLike{ 0403: my($p_trans, $p_tbl, $p_khash, $p_option, $p_sql, $dtfmt, $tmfmt)=@_; 0404: my($sql)="SELECT * FROM $$p_tbl"; 0405: if ($p_khash){ 0406: $sql.=" WHERE "; 0407: for (keys %$p_khash){ 0408: $sql.="$_ LIKE '".$$p_khash{$_}."' AND "; 0409: } 0410: $sql=~s/AND $//; 0411: } 0412: $sql.=" ".$$p_option if ($p_option); 0413: $$p_sql=$sql if ($p_sql); 0414: my($dtformat)="%F"; 0415: my($tmformat)="%T"; 0416: $dtformat=$dtfmt if ($dtfmt); 0417: $tmformat=$tmfmt if ($tmfmt); 0418: my($tsformat)=$dtformat." ".$tmformat; 0419: my($st)=IBPerl::Statement->new(Transaction=>$$p_trans, 0420: SQL=>"$sql", 0421: TimeFormat=>$tmformat, 0422: DateFormat=>$dtformat, 0423: TimeStampFormat=>$tsformat); 0424: if ($st->{Handle}<0){ 0425: print(STDERR "selectRowsbyKey new: $st->{Handle} $st->{Error}\n"); 0426: exit(1); 0427: } 0428: return($st); 0429: } 0430: 0431: # subroutine ###################################################### 0432: # 1行のみfetchして返す 0433: # 引数 $p_trans : トランザクションハンドラへのポインタ 0434: # $p_tbl : テーブル名(文字列)へのポインタ 0435: # $p_khash : キー名=>キー値のハッシュへのポインタ 0436: # $p_sql : SQL文 を返すポインタ 0437: # $dtfmt : 日付フォーマット(デフォルト %F) 0438: # $tmfmt : 時刻フォーマット(デフォルト %T) 0439: # 返値 検索結果のハッシュ 0440: # エラー STDERRにメッセージを書いてexit(1) 0441: # 0442: sub selectOneLine{ 0443: my($p_trans, $p_tbl, $p_khash, $p_option, $p_sql, $dtfmt, $tmfmt)=@_; 0444: my($sql)="SELECT * FROM $$p_tbl WHERE "; 0445: for (keys %$p_khash){ 0446: $sql.="$_='".$$p_khash{$_}."' AND "; 0447: } 0448: $sql=~s/AND $//; 0449: $$p_sql=$sql if ($p_sql); 0450: my($dtformat)="%F"; 0451: my($tmformat)="%T"; 0452: $dtformat=$dtfmt if ($dtfmt); 0453: $tmformat=$tmfmt if ($tmfmt); 0454: my($tsformat)=$dtformat." ".$tmformat; 0455: my($st)=IBPerl::Statement->new(Transaction=>$$p_trans, 0456: SQL=>"$sql", 0457: TimeFormat=>$tmformat, 0458: DateFormat=>$dtformat, 0459: TimeStampFormat=>$tsformat); 0460: if ($st->{Handle}<0){ 0461: print(STDERR "selectOneLine new: $st->{Handle} $st->{Error}\n"); 0462: exit(1); 0463: } 0464: my(%hash); 0465: $st->fetch(\%hash); 0466: if ($st->{Handle}<0){ 0467: print(STDERR "selectOneLine fetch: $st->{Handle} $st->{Error}\n"); 0468: exit(1); 0469: } 0470: return(%hash); 0471: } 0472: 0473: # subroutine ###################################################### 0474: # 行の削除 0475: # 引数 $p_trans : トランザクションハンドラへのポインタ 0476: # $p_tbl : テーブル名(文字列)へのポインタ 0477: # $p_khash : キー名=>キー値のハッシュへのポインタ 0478: # $p_sql : SQL文 を返すポインタ 0479: # 返値 生成したステートメントオブジェクト 0480: # エラー STDERRにメッセージを書いてexit(1) 0481: # 0482: sub deleteRows{ 0483: my($p_trans, $p_tbl, $p_khash, $p_sql)=@_; 0484: my($sql)="DELETE FROM $$p_tbl"; 0485: if ($p_khash){ 0486: $sql.=" WHERE "; 0487: for (keys %$p_khash){ 0488: $sql.="$_='".$$p_khash{$_}."' AND "; 0489: } 0490: } 0491: $sql=~s/AND $//; 0492: $$p_sql=$sql if ($p_sql); 0493: my($st)=IBPerl::Statement->new(Transaction=>$$p_trans, SQL=>"$sql"); 0494: if ($st->{Handle}<0){ 0495: print(STDERR "deleteRows new: $st->{Handle} $st->{Error}\n"); 0496: exit(1); 0497: } 0498: $st->execute(); 0499: if ($st->{Handle}<0){ 0500: print(STDERR "deleteRows execute: $st->{Handle} $st->{Error}\n"); 0501: exit(1); 0502: } 0503: return($st); 0504: } 0505: 0506: # subroutine ###################################################### 0507: # Stored Procedure の実行 0508: # 引数 $p_trans : トランザクションハンドラへのポインタ 0509: # $p_proc : プロシージャ名(文字列)へのポインタ 0510: # $mode : 実行指示 0511: # 0 : EXECUTE した結果のステートメントハンドラを返す 0512: # 1 : fetch した1行のハッシュを返す 0513: # 2 : SELECT した結果のステートメントハンドラを返す 0514: # $p_params : パラメータの配列へのポインタ 0515: # $p_option : オプション文字列へのポインタ 0516: # $p_sql : SQL文 を返すポインタ 0517: # $dtfmt : 日付フォーマット(デフォルト %F) 0518: # $tmfmt : 時刻フォーマット(デフォルト %T) 0519: # 返値 生成したステートメントオブジェクト or 1行のハッシュ 0520: # エラー STDERRにメッセージを書いてexit(1) 0521: # 0522: sub execProcedure 0523: { 0524: my($p_trans, $p_proc, $mode, $p_params, $p_option, $p_sql, $dtfmt, $tmfmt)=@_; 0525: my($sql)=(($mode==2)?"SELECT * FROM":"EXECUTE PROCEDURE")." $$p_proc"; 0526: $$p_sql=$sql if ($p_sql); 0527: if ($p_params){ 0528: $sql.="("; 0529: for (@$p_params){ 0530: $sql.="'" . $_ ."',"; 0531: } 0532: $sql=~s/,$/\)/; 0533: } 0534: $sql.=" ".$$p_option if ($p_option); 0535: $$p_sql=$sql if ($p_sql); 0536: my($dtformat)="%F"; 0537: my($tmformat)="%T"; 0538: $dtformat=$dtfmt if ($dtfmt); 0539: $tmformat=$tmfmt if ($tmfmt); 0540: my($tsformat)=$dtformat." ".$tmformat; 0541: my($st)=IBPerl::Statement->new(Transaction=>$$p_trans, 0542: SQL=>"$sql", 0543: TimeFormat=>$tmformat, 0544: DateFormat=>$dtformat, 0545: TimeStampFormat=>$tsformat); 0546: $st->execute(); 0547: if ($mode==1){ 0548: my(%hash); 0549: $st->fetch(\%hash); 0550: return %hash; 0551: }else{ 0552: return($st); 0553: } 0554: } 0555: 0556: return 1;
この HTML を検査する。( XHTML 1.0 Strict で書かれています )
Another HTML Lint Gateway ( Mirrored by htmllint.oosato.org )