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

Revision 21441, 10.5 KB checked in by Seasoft, 12 years ago (diff)

#1613 (ソース整形・ソースコメントの改善)

  • Zend Framework PHP 標準コーディング規約への準拠を高めた
  • 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-2011 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($dsn);
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(CURRENT_TIMESTAMP, '%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(CURRENT_TIMESTAMP,INTERVAL -5 minute) AND date_add(CURRENT_TIMESTAMP,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(CURRENT_TIMESTAMP) <= DATE(DATE_ADD(" . $dtb_order_alias . ".payment_date, INTERVAL (SELECT downloadable_days FROM dtb_baseinfo) DAY))))";
146    }
147
148    /**
149     * 売上集計の期間別集計のSQLを返す
150     *
151     * @param mixed $type
152     * @return string 検索条件のSQL
153     */
154    function getOrderTotalDaysWhereSql($type) {
155        switch ($type) {
156        case 'month':
157            $format = '%m';
158            break;
159        case 'year':
160            $format = '%Y';
161            break;
162        case 'wday':
163            $format = '%a';
164            break;
165        case 'hour':
166            $format = '%H';
167            break;
168        default:
169            $format = '%Y-%m-%d';
170            break;
171        }
172
173        return " date_format(create_date, '".$format."') AS str_date,
174            COUNT(order_id) AS total_order,
175            SUM(CASE WHEN order_sex = 1 THEN 1 ELSE 0 END) AS men,
176            SUM(CASE WHEN order_sex = 2 THEN 1 ELSE 0 END) AS women,
177            SUM(CASE WHEN customer_id <> 0 AND order_sex = 1 THEN 1 ELSE 0 END) AS men_member,
178            SUM(CASE WHEN customer_id <> 0 AND order_sex = 2 THEN 1 ELSE 0 END) AS women_member,
179            SUM(CASE WHEN customer_id = 0 AND order_sex = 1 THEN 1 ELSE 0 END) AS men_nonmember,
180            SUM(CASE WHEN customer_id = 0 AND order_sex = 2 THEN 1 ELSE 0 END) AS women_nonmember,
181            SUM(total) AS total,
182            AVG(total) AS total_average";
183    }
184
185    /**
186     * 売上集計の年代別集計の年代抽出部分のSQLを返す
187     *
188     * @return string 年代抽出部分の SQL
189     */
190    function getOrderTotalAgeColSql() {
191        return 'TRUNC((YEAR(create_date) - YEAR(order_birth)) - (RIGHT(create_date, 5) < RIGHT(order_birth, 5)), -1)';
192    }
193
194    /**
195     * 文字列連結を行う.
196     *
197     * @param array $columns 連結を行うカラム名
198     * @return string 連結後の SQL 文
199     */
200    function concatColumn($columns) {
201        $sql = "concat(";
202        $i = 0;
203        $total = count($columns);
204        foreach ($columns as $column) {
205            $sql .= $column;
206            if ($i < $total -1) {
207                $sql .= ", ";
208            }
209            $i++;
210        }
211        $sql .= ")";
212        return $sql;
213    }
214
215    /**
216     * テーブルを検索する.
217     *
218     * 引数に部分一致するテーブル名を配列で返す.
219     *
220     * @param string $expression 検索文字列
221     * @return array テーブル名の配列
222     */
223    function findTableNames($expression = "") {
224        $objQuery =& SC_Query_Ex::getSingletonInstance();
225        $sql = "SHOW TABLES LIKE ". $objQuery->quote("%" . $expression . "%");
226        $arrColList = $objQuery->getAll($sql);
227        $arrColList = SC_Utils_Ex::sfSwapArray($arrColList, false);
228        return $arrColList[0];
229    }
230
231    /**
232     * ILIKE句 を LIKE句へ変換する.
233     *
234     * @access private
235     * @param string $sql SQL文
236     * @return string 変換後の SQL 文
237     */
238    function sfChangeILIKE($sql){
239        $changesql = eregi_replace("(ILIKE )", "LIKE ", $sql);
240        return $changesql;
241    }
242
243    /**
244     * RANDOM() を RAND() に変換する.
245     *
246     * @access private
247     * @param string $sql SQL文
248     * @return string 変換後の SQL 文
249     */
250    function sfChangeRANDOM($sql){
251        $changesql = eregi_replace("( RANDOM)", " RAND", $sql);
252        return $changesql;
253    }
254
255    /**
256     * TRUNC() を TRUNCATE() に変換する.
257     *
258     * @access private
259     * @param string $sql SQL文
260     * @return string 変換後の SQL 文
261     */
262    function sfChangeTrunc($sql){
263        $changesql = eregi_replace("( TRUNC)", " TRUNCATE", $sql);
264        return $changesql;
265    }
266
267    /**
268     * ARRAY_TO_STRING(ARRAY(A),B) を GROUP_CONCAT() に変換する.
269     *
270     * @access private
271     * @param string $sql SQL文
272     * @return string 変換後の SQL 文
273     */
274    function sfChangeArrayToString($sql){
275        if (strpos(strtoupper($sql), 'ARRAY_TO_STRING') !== FALSE) {
276            preg_match_all('/ARRAY_TO_STRING.*?\(.*?ARRAY\(.*?SELECT (.+?) FROM (.+?) WHERE (.+?)\).*?\,.*?\'(.+?)\'.*?\)/is', $sql, $match, PREG_SET_ORDER);
277
278            foreach ($match as $item) {
279                $replace = 'GROUP_CONCAT(' . $item[1] . ' SEPARATOR \'' . $item[4] . '\') FROM ' . $item[2] . ' WHERE ' . $item[3];
280                $sql = str_replace($item[0], $replace, $sql);
281            }
282        }
283        return $sql;
284    }
285
286    /**
287     * インデックス作成の追加定義を取得する
288     *
289     * 引数に部分一致するテーブル名を配列で返す.
290     *
291     * @param string $table 対象テーブル名
292     * @param string $name 対象カラム名
293     * @return array インデックス設定情報配列
294     */
295    function sfGetCreateIndexDefinition($table, $name, $definition) {
296        $objQuery =& SC_Query_Ex::getSingletonInstance();
297        $arrTblInfo = $objQuery->getTableInfo($table);
298        foreach ($arrTblInfo as $fieldInfo) {
299            if (array_key_exists($fieldInfo['name'], $definition['fields'])) {
300                if ($fieldInfo['nativetype'] == 'text') {
301                    // TODO: text型フィールドの場合に255文字以内決めうちでインデックス列のサイズとして
302                    //       指定して良いか確認は必要。
303                    $definition['fields'][$fieldInfo['name']]['length'] = '255';
304                }
305            }
306        }
307        return $definition;
308    }
309}
Note: See TracBrowser for help on using the repository browser.