DB
[ class tree: DB ] [ index: DB ] [ all elements ]

Source for file SC_DB_DBFactory_MYSQL.php

Documentation is available at SC_DB_DBFactory_MYSQL.php

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

Documentation generated on Fri, 24 Feb 2012 14:02:31 +0900 by Seasoft