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

Revision 22856, 11.1 KB checked in by Seasoft, 11 years ago (diff)

#2043 (typo修正・ソース整形・ソースコメントの改善 for 2.13.0)

  • 主に空白・空白行の調整。もう少し整えたいが、一旦現状コミット。
  • 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-2013 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/**
25 * MySQL 固有の処理をするクラス.
26 *
27 * このクラスを直接インスタンス化しないこと.
28 * 必ず SC_DB_DBFactory クラスを経由してインスタンス化する.
29 * また, SC_DB_DBFactory クラスの関数を必ずオーバーライドしている必要がある.
30 *
31 * @package DB
32 * @author LOCKON CO.,LTD.
33 * @version $Id:SC_DB_DBFactory_MYSQL.php 15267 2007-08-09 12:31:52Z nanasess $
34 */
35class SC_DB_DBFactory_MYSQL extends SC_DB_DBFactory
36{
37    /** SC_Query インスタンス */
38    var $objQuery;
39
40    /**
41     * DBのバージョンを取得する.
42     *
43     * @param string $dsn データソース名
44     * @return string データベースのバージョン
45     */
46    function sfGetDBVersion($dsn = '')
47    {
48        $objQuery =& SC_Query_Ex::getSingletonInstance($dsn);
49        $val = $objQuery->getOne('select version()');
50
51        return 'MySQL ' . $val;
52    }
53
54    /**
55     * MySQL 用の SQL 文に変更する.
56     *
57     * @access private
58     * @param string $sql SQL 文
59     * @return string MySQL 用に置換した SQL 文
60     */
61    function sfChangeMySQL($sql)
62    {
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
74        return $sql;
75    }
76
77    /**
78     * 文字コード情報を取得する
79     *
80     * @return array 文字コード情報
81     */
82    function getCharSet()
83    {
84        $objQuery =& SC_Query_Ex::getSingletonInstance();
85        $arrRet = $objQuery->getAll("SHOW VARIABLES LIKE 'char%'");
86
87        return $arrRet;
88    }
89
90    /**
91     * 昨日の売上高・売上件数を算出する SQL を返す.
92     *
93     * @param string $method SUM または COUNT
94     * @return string 昨日の売上高・売上件数を算出する SQL
95     */
96    function getOrderYesterdaySql($method)
97    {
98        return 'SELECT ' . $method . '(total) FROM dtb_order '
99               . 'WHERE del_flg = 0 '
100               . 'AND cast(create_date as date) = DATE_ADD(current_date, interval -1 day) '
101               . 'AND status <> ' . ORDER_CANCEL;
102    }
103
104    /**
105     * 当月の売上高・売上件数を算出する SQL を返す.
106     *
107     * @param string $method SUM または COUNT
108     * @return string 当月の売上高・売上件数を算出する SQL
109     */
110    function getOrderMonthSql($method)
111    {
112        return 'SELECT '.$method.'(total) FROM dtb_order '
113               . 'WHERE del_flg = 0 '
114               . "AND date_format(create_date, '%Y/%m') = ? "
115               . "AND date_format(create_date, '%Y/%m/%d') <> date_format(CURRENT_TIMESTAMP, '%Y/%m/%d') "
116               . 'AND status <> ' . ORDER_CANCEL;
117    }
118
119    /**
120     * 昨日のレビュー書き込み件数を算出する SQL を返す.
121     *
122     * @return string 昨日のレビュー書き込み件数を算出する SQL
123     */
124    function getReviewYesterdaySql()
125    {
126        return 'SELECT COUNT(*) FROM dtb_review AS A '
127               . 'LEFT JOIN dtb_products AS B '
128               . 'ON A.product_id = B.product_id '
129               . 'WHERE A.del_flg = 0 '
130               . 'AND B.del_flg = 0 '
131               . 'AND cast(A.create_date as date) = DATE_ADD(current_date, interval -1 day) '
132               . 'AND cast(A.create_date as date) != current_date';
133    }
134
135    /**
136     * メール送信履歴の start_date の検索条件の SQL を返す.
137     *
138     * @return string 検索条件の SQL
139     */
140    function getSendHistoryWhereStartdateSql()
141    {
142        return 'start_date BETWEEN date_add(CURRENT_TIMESTAMP,INTERVAL -5 minute) AND date_add(CURRENT_TIMESTAMP,INTERVAL 5 minute)';
143    }
144
145    /**
146     * ダウンロード販売の検索条件の SQL を返す.
147     *
148     * @param string $dtb_order_alias
149     * @return string 検索条件の SQL
150     */
151    function getDownloadableDaysWhereSql($dtb_order_alias = 'dtb_order')
152    {
153        return '(SELECT IF((SELECT d1.downloadable_days_unlimited FROM dtb_baseinfo d1)=1, 1, DATE(CURRENT_TIMESTAMP) <= DATE(DATE_ADD(' . $dtb_order_alias . '.payment_date, INTERVAL (SELECT downloadable_days FROM dtb_baseinfo) DAY))))';
154    }
155
156    /**
157     * 売上集計の期間別集計のSQLを返す
158     *
159     * @param mixed $type
160     * @return string 検索条件のSQL
161     */
162    function getOrderTotalDaysWhereSql($type)
163    {
164        switch ($type) {
165            case 'month':
166                $format = '%m';
167                break;
168            case 'year':
169                $format = '%Y';
170                break;
171            case 'wday':
172                $format = '%a';
173                break;
174            case 'hour':
175                $format = '%H';
176                break;
177            default:
178                $format = '%Y-%m-%d';
179                break;
180        }
181
182        return " date_format(create_date, '".$format."') AS str_date,
183            COUNT(order_id) AS total_order,
184            SUM(CASE WHEN order_sex = 1 THEN 1 ELSE 0 END) AS men,
185            SUM(CASE WHEN order_sex = 2 THEN 1 ELSE 0 END) AS women,
186            SUM(CASE WHEN customer_id <> 0 AND order_sex = 1 THEN 1 ELSE 0 END) AS men_member,
187            SUM(CASE WHEN customer_id <> 0 AND order_sex = 2 THEN 1 ELSE 0 END) AS women_member,
188            SUM(CASE WHEN customer_id = 0 AND order_sex = 1 THEN 1 ELSE 0 END) AS men_nonmember,
189            SUM(CASE WHEN customer_id = 0 AND order_sex = 2 THEN 1 ELSE 0 END) AS women_nonmember,
190            SUM(total) AS total,
191            AVG(total) AS total_average";
192    }
193
194    /**
195     * 売上集計の年代別集計の年代抽出部分のSQLを返す
196     *
197     * @return string 年代抽出部分の SQL
198     */
199    function getOrderTotalAgeColSql()
200    {
201        return 'TRUNC((YEAR(create_date) - YEAR(order_birth)) - (RIGHT(create_date, 5) < RIGHT(order_birth, 5)), -1)';
202    }
203
204    /**
205     * 文字列連結を行う.
206     *
207     * @param array $columns 連結を行うカラム名
208     * @return string 連結後の SQL 文
209     */
210    function concatColumn($columns)
211    {
212        $sql = 'concat(';
213        $i = 0;
214        $total = count($columns);
215        foreach ($columns as $column) {
216            $sql .= $column;
217            if ($i < $total -1) {
218                $sql .= ', ';
219            }
220            $i++;
221        }
222        $sql .= ')';
223
224        return $sql;
225    }
226
227    /**
228     * テーブルを検索する.
229     *
230     * 引数に部分一致するテーブル名を配列で返す.
231     *
232     * @param string $expression 検索文字列
233     * @return array テーブル名の配列
234     */
235    function findTableNames($expression = '')
236    {
237        $objQuery =& SC_Query_Ex::getSingletonInstance();
238        $sql = 'SHOW TABLES LIKE '. $objQuery->quote('%' . $expression . '%');
239        $arrColList = $objQuery->getAll($sql);
240        $arrColList = SC_Utils_Ex::sfSwapArray($arrColList, false);
241
242        return $arrColList[0];
243    }
244
245    /**
246     * ILIKE句 を LIKE句へ変換する.
247     *
248     * @access private
249     * @param string $sql SQL文
250     * @return string 変換後の SQL 文
251     */
252    function sfChangeILIKE($sql)
253    {
254        $changesql = preg_replace('/(^|[^\w])ILIKE([^\w]|$)/i', '$1LIKE$2', $sql);
255
256        return $changesql;
257    }
258
259    /**
260     * RANDOM() を RAND() に変換する.
261     *
262     * @access private
263     * @param string $sql SQL文
264     * @return string 変換後の SQL 文
265     */
266    function sfChangeRANDOM($sql)
267    {
268        $changesql = preg_replace('/(^|[^\w])RANDOM\(/i', '$1RAND(', $sql);
269
270        return $changesql;
271    }
272
273    /**
274     * TRUNC() を TRUNCATE() に変換する.
275     *
276     * @access private
277     * @param string $sql SQL文
278     * @return string 変換後の SQL 文
279     */
280    function sfChangeTrunc($sql)
281    {
282        $changesql = preg_replace('/(^|[^\w])TRUNC([^\w]|$)/i', '$1TRUNCATE$2', $sql);
283
284        return $changesql;
285    }
286
287    /**
288     * ARRAY_TO_STRING(ARRAY(A),B) を GROUP_CONCAT() に変換する.
289     *
290     * @access private
291     * @param string $sql SQL文
292     * @return string 変換後の SQL 文
293     */
294    function sfChangeArrayToString($sql)
295    {
296        if (strpos(strtoupper($sql), 'ARRAY_TO_STRING') !== FALSE) {
297            preg_match_all('/ARRAY_TO_STRING.*?\(.*?ARRAY\(.*?SELECT (.+?) FROM (.+?) WHERE (.+?)\).*?\,.*?\'(.+?)\'.*?\)/is', $sql, $match, PREG_SET_ORDER);
298
299            foreach ($match as $item) {
300                $replace = 'GROUP_CONCAT(' . $item[1] . ' SEPARATOR \'' . $item[4] . '\') FROM ' . $item[2] . ' WHERE ' . $item[3];
301                $sql = str_replace($item[0], $replace, $sql);
302            }
303        }
304
305        return $sql;
306    }
307
308    /**
309     * インデックス作成の追加定義を取得する
310     *
311     * 引数に部分一致するテーブル名を配列で返す.
312     *
313     * @param string $table 対象テーブル名
314     * @param string $name 対象カラム名
315     * @return array インデックス設定情報配列
316     */
317    function sfGetCreateIndexDefinition($table, $name, $definition)
318    {
319        $objQuery =& SC_Query_Ex::getSingletonInstance();
320        $arrTblInfo = $objQuery->getTableInfo($table);
321        foreach ($arrTblInfo as $fieldInfo) {
322            if (array_key_exists($fieldInfo['name'], $definition['fields'])) {
323                if ($fieldInfo['nativetype'] == 'text') {
324                    // TODO: text型フィールドの場合に255文字以内決めうちでインデックス列のサイズとして
325                    //       指定して良いか確認は必要。
326                    $definition['fields'][$fieldInfo['name']]['length'] = '255';
327                }
328            }
329        }
330
331        return $definition;
332    }
333
334    /**
335     * 擬似表を表すSQL文(FROM 句)を取得する
336     *
337     * @return string
338     */
339    function getDummyFromClauseSql()
340    {
341        return 'FROM DUAL';
342    }
343
344    /**
345     * 各 DB に応じた SC_Query での初期化を行う
346     *
347     * @param SC_Query $objQuery SC_Query インスタンス
348     * @return void
349     */
350    function initObjQuery(SC_Query &$objQuery)
351    {
352        $objQuery->exec('SET SESSION storage_engine = InnoDB');
353        $objQuery->exec("SET SESSION sql_mode = 'ANSI'");
354    }
355}
Note: See TracBrowser for help on using the repository browser.