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

Revision 22567, 11.1 KB checked in by shutta, 11 years ago (diff)

#2043 (typo修正・ソース整形・ソースコメントの改善 for 2.12.4)
Zend Framework PHP 標準コーディング規約のコーディングスタイルへ準拠。
classおよびfunctionの開始波括弧「{」のスタイルを修正。

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