- Timestamp:
- 2007/08/08 16:12:34 (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/feature-module-update/data/class/util/SC_Utils.php
r15224 r15238 20 20 class SC_Utils { 21 21 22 /* データベースのバージョン所得 */ 23 function sfGetDBVersion($dsn = "") { 24 if($dsn == "") { 25 if(defined('DEFAULT_DSN')) { 26 $dsn = DEFAULT_DSN; 27 } else { 28 return; 29 } 30 } 31 32 $objQuery = new SC_Query($dsn, true, true); 33 list($db_type) = split(":", $dsn); 34 if($db_type == 'mysql') { 35 $val = $objQuery->getOne("select version()"); 36 $version = "MySQL " . $val; 37 } 38 if($db_type == 'pgsql') { 39 $val = $objQuery->getOne("select version()"); 40 $arrLine = split(" " , $val); 41 $version = $arrLine[0] . " " . $arrLine[1]; 42 } 43 return $version; 44 } 45 46 /* テーブルの存在チェック */ 47 function sfTabaleExists($table_name, $dsn = "") { 48 if($dsn == "") { 49 if(defined('DEFAULT_DSN')) { 50 $dsn = DEFAULT_DSN; 51 } else { 52 return; 53 } 54 } 55 56 $objQuery = new SC_Query($dsn, true, true); 57 // 正常に接続されている場合 58 if(!$objQuery->isError()) { 59 list($db_type) = split(":", $dsn); 60 // postgresqlとmysqlとで処理を分ける 61 if ($db_type == "pgsql") { 62 $sql = "SELECT 63 relname 64 FROM 65 pg_class 66 WHERE 67 (relkind = 'r' OR relkind = 'v') AND 68 relname = ? 69 GROUP BY 70 relname"; 71 $arrRet = $objQuery->getAll($sql, array($table_name)); 72 if(count($arrRet) > 0) { 73 return true; 74 } 75 }else if ($db_type == "mysql") { 76 $sql = "SHOW TABLE STATUS LIKE ?"; 77 $arrRet = $objQuery->getAll($sql, array($table_name)); 78 if(count($arrRet) > 0) { 79 return true; 80 } 81 } 82 } 83 return false; 84 } 85 86 // カラムの存在チェックと作成 87 function sfColumnExists($table_name, $col_name, $col_type = "", $dsn = "", $add = false) { 88 if($dsn == "") { 89 if(defined('DEFAULT_DSN')) { 90 $dsn = DEFAULT_DSN; 91 } else { 92 return; 93 } 94 } 95 96 // テーブルが無ければエラー 97 if(!sfTabaleExists($table_name, $dsn)) return false; 98 99 $objQuery = new SC_Query($dsn, true, true); 100 // 正常に接続されている場合 101 if(!$objQuery->isError()) { 102 list($db_type) = split(":", $dsn); 103 104 // カラムリストを取得 105 $arrRet = sfGetColumnList($table_name, $objQuery, $db_type); 106 if(count($arrRet) > 0) { 107 if(in_array($col_name, $arrRet)){ 108 return true; 109 } 110 } 111 } 112 113 // カラムを追加する 114 if($add){ 115 $objQuery->query("ALTER TABLE $table_name ADD $col_name $col_type "); 116 return true; 117 } 118 119 return false; 120 } 121 122 // インデックスの存在チェックと作成 123 function sfIndexExists($table_name, $col_name, $index_name, $length = "", $dsn = "", $add = false) { 124 if($dsn == "") { 125 if(defined('DEFAULT_DSN')) { 126 $dsn = DEFAULT_DSN; 127 } else { 128 return; 129 } 130 } 131 132 // テーブルが無ければエラー 133 if(!sfTabaleExists($table_name, $dsn)) return false; 134 135 $objQuery = new SC_Query($dsn, true, true); 136 // 正常に接続されている場合 137 if(!$objQuery->isError()) { 138 list($db_type) = split(":", $dsn); 139 switch($db_type) { 140 case 'pgsql': 141 // インデックスの存在確認 142 $arrRet = $objQuery->getAll("SELECT relname FROM pg_class WHERE relname = ?", array($index_name)); 143 break; 144 case 'mysql': 145 // インデックスの存在確認 146 $arrRet = $objQuery->getAll("SHOW INDEX FROM ? WHERE Key_name = ?", array($table_name, $index_name)); 147 break; 148 default: 149 return false; 150 } 151 // すでにインデックスが存在する場合 152 if(count($arrRet) > 0) { 153 return true; 154 } 155 } 156 157 // インデックスを作成する 158 if($add){ 159 switch($db_type) { 160 case 'pgsql': 161 $objQuery->query("CREATE INDEX ? ON ? (?)", array($index_name, $table_name, $col_name)); 162 break; 163 case 'mysql': 164 $objQuery->query("CREATE INDEX ? ON ? (?(?))", array($index_name, $table_name, $col_name, $length)); 165 break; 166 default: 167 return false; 168 } 169 return true; 170 } 171 return false; 172 } 173 174 // データの存在チェック 175 function sfDataExists($table_name, $where, $arrval, $dsn = "", $sql = "", $add = false) { 176 if($dsn == "") { 177 if(defined('DEFAULT_DSN')) { 178 $dsn = DEFAULT_DSN; 179 } else { 180 return; 181 } 182 } 183 $objQuery = new SC_Query($dsn, true, true); 184 $count = $objQuery->count($table_name, $where, $arrval); 185 186 if($count > 0) { 187 $ret = true; 188 } else { 189 $ret = false; 190 } 191 // データを追加する 192 if(!$ret && $add) { 193 $objQuery->exec($sql); 194 } 195 196 return $ret; 197 } 198 199 /* 22 /** 200 23 * サイト管理情報から値を取得する。 201 24 * データが存在する場合、必ず1以上の数値が設定されている。 … … 234 57 235 58 return $control_flg; 236 }237 238 // テーブルのカラム一覧を取得する239 function sfGetColumnList($table_name, $objQuery = "", $db_type = DB_TYPE){240 if($objQuery == "") $objQuery = new SC_Query();241 $arrRet = array();242 243 // postgresqlとmysqlとで処理を分ける244 if ($db_type == "pgsql") {245 $sql = "SELECT a.attname FROM pg_class c, pg_attribute a WHERE c.relname=? AND c.oid=a.attrelid AND a.attnum > 0 AND not a.attname like '........pg.dropped.%........' ORDER BY a.attnum";246 $arrColList = $objQuery->getAll($sql, array($table_name));247 $arrColList = sfswaparray($arrColList);248 $arrRet = $arrColList["attname"];249 }else if ($db_type == "mysql") {250 $sql = "SHOW COLUMNS FROM $table_name";251 $arrColList = $objQuery->getAll($sql);252 $arrColList = sfswaparray($arrColList);253 $arrRet = $arrColList["Field"];254 }255 return $arrRet;256 59 } 257 60 … … 2542 2345 } 2543 2346 2544 //MySQL用のSQL文に変更する2545 function sfChangeMySQL($sql){2546 // 改行、タブを1スペースに変換2547 $sql = preg_replace("/[\r\n\t]/"," ",$sql);2548 2549 $sql = sfChangeView($sql); // view表をインラインビューに変換する2550 $sql = sfChangeILIKE($sql); // ILIKE検索をLIKE検索に変換する2551 $sql = sfChangeRANDOM($sql); // RANDOM()をRAND()に変換する2552 2553 return $sql;2554 }2555 2556 // SQLの中にviewが存在しているかチェックを行う。2557 function sfInArray($sql){2558 global $arrView;2559 2560 foreach($arrView as $key => $val){2561 if (strcasecmp($sql, $val) == 0){2562 $changesql = eregi_replace("($key)", "$val", $sql);2563 sfInArray($changesql);2564 }2565 }2566 return false;2567 }2568 2569 2347 // SQLシングルクォート対応 2570 2348 function sfQuoteSmart($in){ … … 2579 2357 return "'" . str_replace("'", "''", $in) . "'"; 2580 2358 } 2581 }2582 2583 // view表をインラインビューに変換する2584 function sfChangeView($sql){2585 global $arrView;2586 global $arrViewWhere;2587 2588 $arrViewTmp = $arrView;2589 2590 // viewのwhereを変換2591 foreach($arrViewTmp as $key => $val){2592 $arrViewTmp[$key] = strtr($arrViewTmp[$key], $arrViewWhere);2593 }2594 2595 // viewを変換2596 $changesql = strtr($sql, $arrViewTmp);2597 2598 return $changesql;2599 }2600 2601 // ILIKE検索をLIKE検索に変換する2602 function sfChangeILIKE($sql){2603 $changesql = eregi_replace("(ILIKE )", "LIKE BINARY ", $sql);2604 return $changesql;2605 }2606 2607 // RANDOM()をRAND()に変換する2608 function sfChangeRANDOM($sql){2609 $changesql = eregi_replace("( RANDOM)", " RAND", $sql);2610 return $changesql;2611 }2612 2613 // viewのwhereを置換する2614 function sfViewWhere($target, $where = "", $arrval = array(), $option = ""){2615 global $arrViewWhere;2616 $arrWhere = split("[?]", $where);2617 $where_tmp = " WHERE " . $arrWhere[0];2618 for($i = 1; $i < count($arrWhere); $i++){2619 $where_tmp .= sfQuoteSmart($arrval[$i - 1]) . $arrWhere[$i];2620 }2621 $arrViewWhere[$target] = $where_tmp . " " . $option;2622 2359 } 2623 2360
Note: See TracChangeset
for help on using the changeset viewer.