source: branches/version-2_5-dev/data/class/db/dbfactory/SC_DB_DBFactory_MYSQL.php @ 20507

Revision 20507, 10.7 KB checked in by shutta, 13 years ago (diff)

SC_Queryクラスのclass_extends対応

  • Property svn:eol-style set to LF
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-httpd-php; charset=UTF-8
Line 
1<?php
2/*
3 * This file is part of EC-CUBE
4 *
5 * Copyright(c) 2000-2010 LOCKON CO.,LTD. All Rights Reserved.
6 *
7 * http://www.lockon.co.jp/
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation; either version 2
12 * of the License, or (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22 */
23
24// {{{ requires
25require_once(CLASS_REALDIR . "db/SC_DB_DBFactory.php");
26
27/**
28 * MySQL 固有の処理をするクラス.
29 *
30 * このクラスを直接インスタンス化しないこと.
31 * 必ず SC_DB_DBFactory クラスを経由してインスタンス化する.
32 * また, SC_DB_DBFactory クラスの関数を必ずオーバーライドしている必要がある.
33 *
34 * @package DB
35 * @author LOCKON CO.,LTD.
36 * @version $Id:SC_DB_DBFactory_MYSQL.php 15267 2007-08-09 12:31:52Z nanasess $
37 */
38class SC_DB_DBFactory_MYSQL extends SC_DB_DBFactory {
39
40    /** SC_Query インスタンス */
41    var $objQuery;
42
43    /**
44     * DBのバージョンを取得する.
45     *
46     * @param string $dsn データソース名
47     * @return string データベースのバージョン
48     */
49    function sfGetDBVersion($dsn = "") {
50        $objQuery =& SC_Query_Ex::getSingletonInstance();
51        $val = $objQuery->getOne("select version()");
52        return "MySQL " . $val;
53    }
54
55    /**
56     * MySQL 用の SQL 文に変更する.
57     *
58     * @access private
59     * @param string $sql SQL 文
60     * @return string MySQL 用に置換した SQL 文
61     */
62    function sfChangeMySQL($sql){
63        // 改行、タブを1スペースに変換
64        $sql = preg_replace("/[\r\n\t]/"," ",$sql);
65        // ILIKE検索をLIKE検索に変換する
66        $sql = $this->sfChangeILIKE($sql);
67        // RANDOM()をRAND()に変換する
68        $sql = $this->sfChangeRANDOM($sql);
69        // TRUNCをTRUNCATEに変換する
70        $sql = $this->sfChangeTrunc($sql);
71        // ARRAY_TO_STRINGをGROUP_CONCATに変換する
72        $sql = $this->sfChangeArrayToString($sql);
73        return $sql;
74    }
75
76    /**
77     * 文字コード情報を取得する
78     *
79     * @return array 文字コード情報
80     */
81    function getCharSet() {
82        $objQuery =& SC_Query_Ex::getSingletonInstance();
83        $arrRet = $objQuery->getAll("SHOW VARIABLES LIKE 'char%'");
84        return $arrRet;
85    }
86
87    /**
88     * 昨日の売上高・売上件数を算出する SQL を返す.
89     *
90     * @param string $method SUM または COUNT
91     * @return string 昨日の売上高・売上件数を算出する SQL
92     */
93    function getOrderYesterdaySql($method) {
94        return "SELECT ".$method."(total) FROM dtb_order "
95              . "WHERE del_flg = 0 "
96                . "AND cast(create_date as date) = DATE_ADD(current_date, interval -1 day) "
97                . "AND status <> " . ORDER_CANCEL;
98    }
99
100    /**
101     * 当月の売上高・売上件数を算出する SQL を返す.
102     *
103     * @param string $method SUM または COUNT
104     * @return string 当月の売上高・売上件数を算出する SQL
105     */
106    function getOrderMonthSql($method) {
107        return "SELECT ".$method."(total) FROM dtb_order "
108              . "WHERE del_flg = 0 "
109                . "AND date_format(create_date, '%Y/%m') = ? "
110                . "AND date_format(create_date, '%Y/%m/%d') <> date_format(now(), '%Y/%m/%d') "
111                . "AND status <> " . ORDER_CANCEL;
112    }
113
114    /**
115     * 昨日のレビュー書き込み件数を算出する SQL を返す.
116     *
117     * @return string 昨日のレビュー書き込み件数を算出する SQL
118     */
119    function getReviewYesterdaySql() {
120        return "SELECT COUNT(*) FROM dtb_review AS A "
121          . "LEFT JOIN dtb_products AS B "
122                 . "ON A.product_id = B.product_id "
123              . "WHERE A.del_flg = 0 "
124                . "AND B.del_flg = 0 "
125                . "AND cast(A.create_date as date) = DATE_ADD(current_date, interval -1 day) "
126                . "AND cast(A.create_date as date) != current_date";
127    }
128
129    /**
130     * メール送信履歴の start_date の検索条件の SQL を返す.
131     *
132     * @return string 検索条件の SQL
133     */
134    function getSendHistoryWhereStartdateSql() {
135        return "start_date BETWEEN date_add(now(),INTERVAL -5 minute) AND date_add(now(),INTERVAL 5 minute)";
136    }
137
138    /**
139     * ダウンロード販売の検索条件の SQL を返す.
140     *
141     * @param string $dtb_order_alias
142     * @return string 検索条件の SQL
143     */
144    function getDownloadableDaysWhereSql($dtb_order_alias = 'dtb_order') {
145        return "(SELECT IF((SELECT d1.downloadable_days_unlimited FROM dtb_baseinfo d1)=1, 1, DATE(NOW()) <= DATE(DATE_ADD(" . $dtb_order_alias . ".payment_date, INTERVAL (SELECT downloadable_days FROM dtb_baseinfo) DAY))))";
146    }
147
148
149    /**
150     * 売上集計の期間別集計のSQLを返す
151     *
152     * @param mixed $type
153     * @return string 検索条件のSQL
154     */
155    function getOrderTotalDaysWhereSql($type) {
156        switch($type){
157        case 'month':
158            $format = '%m';
159            break;
160        case 'year':
161            $format = '%Y';
162            break;
163        case 'wday':
164            $format = '%a';
165            break;
166        case 'hour':
167            $format = '%H';
168            break;
169        default:
170            $format = '%Y-%m-%d';
171            break;
172        }
173
174        return " date_format(create_date, '".$format."') AS str_date,
175            COUNT(order_id) AS total_order,
176            SUM(CASE WHEN order_sex = 1 THEN 1 ELSE 0 END) AS men,
177            SUM(CASE WHEN order_sex = 2 THEN 1 ELSE 0 END) AS women,
178            SUM(CASE WHEN customer_id <> 0 AND order_sex = 1 THEN 1 ELSE 0 END) AS men_member,
179            SUM(CASE WHEN customer_id <> 0 AND order_sex = 2 THEN 1 ELSE 0 END) AS women_member,
180            SUM(CASE WHEN customer_id = 0 AND order_sex = 1 THEN 1 ELSE 0 END) AS men_nonmember,
181            SUM(CASE WHEN customer_id = 0 AND order_sex = 2 THEN 1 ELSE 0 END) AS women_nonmember,
182            SUM(total) AS total,
183            AVG(total) AS total_average";
184    }
185
186
187    /**
188     * 文字列連結を行う.
189     *
190     * @param array $columns 連結を行うカラム名
191     * @return string 連結後の SQL 文
192     */
193    function concatColumn($columns) {
194        $sql = "concat(";
195        $i = 0;
196        $total = count($columns);
197        foreach ($columns as $column) {
198            $sql .= $column;
199            if ($i < $total -1) {
200                $sql .= ", ";
201            }
202            $i++;
203        }
204        $sql .= ")";
205        return $sql;
206    }
207
208    /**
209     * テーブルのカラム一覧を取得する.
210     *
211     * @deprecated SC_Query::listTableFields() を使用してください
212     * @param string $table_name テーブル名
213     * @return array テーブルのカラム一覧の配列
214     */
215    function sfGetColumnList($table_name) {
216        $objQuery =& SC_Query_Ex::getSingletonInstance();
217        $sql = "SHOW COLUMNS FROM " . $table_name;
218        $arrColList = $objQuery->getAll($sql);
219        $arrColList = SC_Utils_Ex::sfswaparray($arrColList);
220        return $arrColList["Field"];
221    }
222
223    /**
224     * テーブルを検索する.
225     *
226     * 引数に部分一致するテーブル名を配列で返す.
227     *
228     * @param string $expression 検索文字列
229     * @return array テーブル名の配列
230     */
231    function findTableNames($expression = "") {
232        $objQuery =& SC_Query_Ex::getSingletonInstance();
233        $sql = "SHOW TABLES LIKE ". $objQuery->quote("%" . $expression . "%");
234        $arrColList = $objQuery->getAll($sql);
235        $arrColList = SC_Utils_Ex::sfswaparray($arrColList, false);
236        return $arrColList[0];
237    }
238
239    /**
240     * ILIKE句 を LIKE句へ変換する.
241     *
242     * @access private
243     * @param string $sql SQL文
244     * @return string 変換後の SQL 文
245     */
246    function sfChangeILIKE($sql){
247        $changesql = eregi_replace("(ILIKE )", "LIKE ", $sql);
248        return $changesql;
249    }
250
251    /**
252     * RANDOM() を RAND() に変換する.
253     *
254     * @access private
255     * @param string $sql SQL文
256     * @return string 変換後の SQL 文
257     */
258    function sfChangeRANDOM($sql){
259        $changesql = eregi_replace("( RANDOM)", " RAND", $sql);
260        return $changesql;
261    }
262
263    /**
264     * TRUNC() を TRUNCATE() に変換する.
265     *
266     * @access private
267     * @param string $sql SQL文
268     * @return string 変換後の SQL 文
269     */
270    function sfChangeTrunc($sql){
271        $changesql = eregi_replace("( TRUNC)", " TRUNCATE", $sql);
272        return $changesql;
273    }
274
275    /**
276     * ARRAY_TO_STRING(ARRAY(A),B) を GROUP_CONCAT() に変換する.
277     *
278     * @access private
279     * @param string $sql SQL文
280     * @return string 変換後の SQL 文
281     */
282    function sfChangeArrayToString($sql){
283        if(strpos(strtoupper($sql), 'ARRAY_TO_STRING') !== FALSE) {
284            preg_match_all('/ARRAY_TO_STRING.*?\(.*?ARRAY\(.*?SELECT (.+?) FROM (.+?) WHERE (.+?)\).*?\,.*?\'(.+?)\'.*?\)/is', $sql, $match, PREG_SET_ORDER);
285
286            foreach($match as $item) {
287                $replace = 'GROUP_CONCAT(' . $item[1] . ' SEPARATOR \'' . $item[4] . '\') FROM ' . $item[2] . ' WHERE ' . $item[3];
288                $sql = str_replace($item[0], $replace, $sql);
289            }
290        }
291        return $sql;
292    }
293
294    /**
295     * インデックス作成の追加定義を取得する
296     *
297     * 引数に部分一致するテーブル名を配列で返す.
298     *
299     * @param string $table 対象テーブル名
300     * @param string $name 対象カラム名
301     * @return array インデックス設定情報配列
302     */
303    function sfGetCreateIndexDefinition($table, $name, $definition) {
304        $objQuery =& SC_Query_Ex::getSingletonInstance();
305        $arrTblInfo = $objQuery->getTableInfo($table);
306        foreach($arrTblInfo as $fieldInfo) {
307            if(array_key_exists($fieldInfo['name'], $definition['fields'])) {
308                if($fieldInfo['nativetype'] == 'text') {
309                    // TODO: text型フィールドの場合に255文字以内決めうちでインデックス列のサイズとして
310                    //       指定して良いか確認は必要。
311                    $definition['fields'][$fieldInfo['name']]['length'] = '255';
312                }
313            }
314        }
315        return $definition;
316    }
317}
318?>
Note: See TracBrowser for help on using the repository browser.