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-2007 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_PATH "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.     /**
  40.      * DBのバージョンを取得する.
  41.      *
  42.      * @param string $dsn データソース名
  43.      * @return string データベースのバージョン
  44.      */
  45.     function sfGetDBVersion($dsn ""{
  46.         $objQuery new SC_Query($this->getDSN($dsn)truetrue);
  47.         $val $objQuery->getOne("select version()");
  48.         return "MySQL " $val;
  49.     }
  50.  
  51.     /**
  52.      * MySQL 用の SQL 文に変更する.
  53.      *
  54.      * @access private
  55.      * @param string $sql SQL 文
  56.      * @return string MySQL 用に置換した SQL 文
  57.      */
  58.     function sfChangeMySQL($sql){
  59.         // 改行、タブを1スペースに変換
  60.         $sql preg_replace("/[\r\n\t]/"," ",$sql);
  61.         // view表をインラインビューに変換する
  62.         $sql $this->sfChangeView($sql);
  63.         // ILIKE検索をLIKE検索に変換する
  64.         $sql $this->sfChangeILIKE($sql);
  65.         // RANDOM()をRAND()に変換する
  66.         $sql $this->sfChangeRANDOM($sql);
  67.         // TRUNCをTRUNCATEに変換する
  68.         $sql $this->sfChangeTrunc($sql);
  69.         return $sql;
  70.     }
  71.     
  72.     /**
  73.      * 文字コード情報を取得する
  74.      * 
  75.      * @return array 文字コード情報
  76.      */
  77.     function getCharSet({
  78.         $objQuery new SC_Query();
  79.         $arrRet $objQuery->getAll("SHOW VARIABLES LIKE 'char%'");
  80.         return $arrRet;
  81.     }
  82.     
  83.     /**
  84.      * テーブルの存在チェックを行う SQL 文を返す.
  85.      *
  86.      * @return string テーブルの存在チェックを行う SQL 文
  87.      */
  88.     function getTableExistsSql({
  89.         return "SHOW TABLE STATUS LIKE ?";
  90.     }
  91.  
  92.     /**
  93.      * インデックスの検索結果を配列で返す.
  94.      *
  95.      * @param string $index_name インデックス名
  96.      * @param string $table_name テーブル名
  97.      * @return array インデックスの検索結果の配列
  98.      */
  99.     function getTableIndex($index_name$table_name ""{
  100.         $objQuery new SC_Query(""truetrue);
  101.         return $objQuery->getAll("SHOW INDEX FROM " $table_name " WHERE Key_name = ?",
  102.                                  array($index_name));
  103.     }
  104.  
  105.     /**
  106.      * インデックスを作成する.
  107.      *
  108.      * @param string $index_name インデックス名
  109.      * @param string $table_name テーブル名
  110.      * @param string $col_name カラム名
  111.      * @param integer $length 作成するインデックスのバイト長
  112.      * @return void 
  113.      */
  114.     function createTableIndex($index_name$table_name$col_name$length 0{
  115.         $objQuery new SC_Query($dsntruetrue);
  116.         $objQuery->query("CREATE INDEX ? ON ? (?(?))"array($index_name$table_name$col_name$length));
  117.     }
  118.  
  119.     /**
  120.      * テーブルのカラム一覧を取得する.
  121.      *
  122.      * @param string $table_name テーブル名
  123.      * @return array テーブルのカラム一覧の配列
  124.      */
  125.     function sfGetColumnList($table_name{
  126.         $objQuery new SC_Query();
  127.         $sql "SHOW COLUMNS FROM " $table_name;
  128.         $arrColList $objQuery->getAll($sql);
  129.         $arrColList SC_Utils_Ex::sfswaparray($arrColList);
  130.         return $arrColList["Field"];
  131.     }
  132.  
  133.     /**
  134.      * テーブルを検索する.
  135.      *
  136.      * 引数に部分一致するテーブル名を配列で返す.
  137.      *
  138.      * @param string $expression 検索文字列
  139.      * @return array テーブル名の配列
  140.      */
  141.     function findTableNames($expression ""{
  142.         $objQuery new SC_Query();
  143.         $sql "SHOW TABLES LIKE ?";
  144.         $arrColList $objQuery->getAll($sqlarray("%" $expression "%"));
  145.         $arrColList SC_Utils_Ex::sfswaparray($arrColListfalse);
  146.         return $arrColList[0];
  147.     }
  148.  
  149.     /**
  150.      * View の WHERE 句を置換する.
  151.      *
  152.      * @param string $target 置換対象の文字列
  153.      * @param string $where 置換する文字列
  154.      * @param array $arrval WHERE 句の要素の配列
  155.      * @param string $option SQL 文の追加文字列
  156.      * @return string 置換後の SQL 文
  157.      */
  158.     function sfViewWhere($target$where ""$arrval array()$option ""){
  159.  
  160.         $arrWhere split("[?]"$where);
  161.         $where_tmp " WHERE " $arrWhere[0];
  162.         for($i 1$i count($arrWhere)$i++){
  163.             $where_tmp .= SC_Utils_Ex::sfQuoteSmart($arrval[$i 1]$arrWhere[$i];
  164.         }
  165.         $arrWhere $this->getWhereConverter();
  166.         $arrWhere[$target$where_tmp " " $option;
  167.         return $arrWhere[$target];
  168.     }
  169.  
  170.     /**
  171.      * View をインラインビューに変換する.
  172.      *
  173.      * @access private
  174.      * @param string $sql SQL 文
  175.      * @return string インラインビューに変換した SQL 文
  176.      */
  177.     function sfChangeView($sql){
  178.         
  179.         $arrViewTmp $this->viewToSubQuery();
  180.         
  181.             // viewのwhereを変換
  182.         foreach($arrViewTmp as $key => $val){
  183.             $arrViewTmp[$keystrtr($arrViewTmp[$key]$this->getWhereConverter());
  184.         }
  185.             
  186.             // viewを変換
  187.         $changesql strtr($sql$arrViewTmp);
  188.         
  189.         return $changesql;
  190.     }
  191.  
  192.     /**
  193.      * ILIKE句 を LIKE句へ変換する.
  194.      *
  195.      * @access private
  196.      * @param string $sql SQL文
  197.      * @return string 変換後の SQL 文
  198.      */
  199.     function sfChangeILIKE($sql){
  200.         $changesql eregi_replace("(ILIKE )""LIKE "$sql);
  201.         return $changesql;
  202.     }
  203.  
  204.     /**
  205.      * RANDOM() を RAND() に変換する.
  206.      *
  207.      * @access private
  208.      * @param string $sql SQL文
  209.      * @return string 変換後の SQL 文
  210.      */
  211.     function sfChangeRANDOM($sql){
  212.         $changesql eregi_replace("( RANDOM)"" RAND"$sql);
  213.         return $changesql;
  214.     }
  215.  
  216.     /**
  217.      * TRUNC() を TRUNCATE() に変換する.
  218.      *
  219.      * @access private
  220.      * @param string $sql SQL文
  221.      * @return string 変換後の SQL 文
  222.      */
  223.     function sfChangeTrunc($sql){
  224.         $changesql eregi_replace("( TRUNC)"" TRUNCATE"$sql);
  225.         return $changesql;
  226.     }
  227.     
  228.     /**
  229.      * WHERE 句置換用の配列を返す.
  230.      *
  231.      * @access private
  232.      * @return array WHERE 句置換用の配列
  233.      */
  234.     function getWhereConverter({
  235.         return array(
  236.             "&&crscls_where&&" => "",
  237.             "&&crsprdcls_where&&" =>"",
  238.             "&&noncls_where&&" => "",
  239.             "&&allcls_where&&" => "",
  240.             "&&allclsdtl_where&&" => "",
  241.             "&&prdcls_where&&" => "",
  242.             "&&catcnt_where&&" => ""
  243.         );
  244.     }
  245.  
  246.     /**
  247.      * View をサブクエリに変換するための配列を返す.
  248.      *
  249.      * @access private
  250.      * @return array View をサブクエリに変換するための配列
  251.      */
  252.     function viewToSubQuery({
  253.         $sql['vw_products_allclass_detail'=<<< __EOS__
  254.             (
  255.                 SELECT
  256.                     dtb_products.product_id,
  257.                     dtb_products.name,
  258.                     dtb_products.deliv_fee,
  259.                     dtb_products.sale_limit,
  260.                     dtb_products.sale_unlimited,
  261.                     dtb_products.maker_id,
  262.                     dtb_products.rank,
  263.                     dtb_products.status,
  264.                     dtb_products.product_flag,
  265.                     dtb_products.point_rate,
  266.                     dtb_products.comment1,
  267.                     dtb_products.comment2,
  268.                     dtb_products.comment3,
  269.                     dtb_products.comment4,
  270.                     dtb_products.comment5,
  271.                     dtb_products.comment6,
  272.                     dtb_products.note,
  273.                     dtb_products.file1,
  274.                     dtb_products.file2,
  275.                     dtb_products.file3,
  276.                     dtb_products.file4,
  277.                     dtb_products.file5,
  278.                     dtb_products.file6,
  279.                     dtb_products.main_list_comment,
  280.                     dtb_products.main_list_image,
  281.                     dtb_products.main_comment,
  282.                     dtb_products.main_image,
  283.                     dtb_products.main_large_image,
  284.                     dtb_products.sub_title1,
  285.                     dtb_products.sub_comment1,
  286.                     dtb_products.sub_image1,
  287.                     dtb_products.sub_large_image1,
  288.                     dtb_products.sub_title2,
  289.                     dtb_products.sub_comment2,
  290.                     dtb_products.sub_image2,
  291.                     dtb_products.sub_large_image2,
  292.                     dtb_products.sub_title3,
  293.                     dtb_products.sub_comment3,
  294.                     dtb_products.sub_image3,
  295.                     dtb_products.sub_large_image3,
  296.                     dtb_products.sub_title4,
  297.                     dtb_products.sub_comment4,
  298.                     dtb_products.sub_image4,
  299.                     dtb_products.sub_large_image4,
  300.                     dtb_products.sub_title5,
  301.                     dtb_products.sub_comment5,
  302.                     dtb_products.sub_image5,
  303.                     dtb_products.sub_large_image5,
  304.                     dtb_products.sub_title6,
  305.                     dtb_products.sub_comment6,
  306.                     dtb_products.sub_image6,
  307.                     dtb_products.sub_large_image6,
  308.                     dtb_products.del_flg,
  309.                     dtb_products.creator_id,
  310.                     dtb_products.create_date,
  311.                     dtb_products.update_date,
  312.                     dtb_products.deliv_date_id,
  313.                     T4.product_code_min,
  314.                     T4.product_code_max,
  315.                     T4.price01_min,
  316.                     T4.price01_max,
  317.                     T4.price02_min,
  318.                     T4.price02_max,
  319.                     T4.stock_min,
  320.                     T4.stock_max,
  321.                     T4.stock_unlimited_min,
  322.                     T4.stock_unlimited_max,
  323.                     T4.class_count
  324.                 FROM
  325.                     dtb_products
  326.                     LEFT JOIN
  327.                         (
  328.                             SELECT
  329.                                 product_id,
  330.                                 MIN(product_code) AS product_code_min,
  331.                                 MAX(product_code) AS product_code_max,
  332.                                 MIN(price01) AS price01_min,
  333.                                 MAX(price01) AS price01_max,
  334.                                 MIN(price02) AS price02_min,
  335.                                 MAX(price02) AS price02_max,
  336.                                 MIN(stock) AS stock_min,
  337.                                 MAX(stock) AS stock_max,
  338.                                 MIN(stock_unlimited) AS stock_unlimited_min,
  339.                                 MAX(stock_unlimited) AS stock_unlimited_max,
  340.                                 COUNT(*) as class_count
  341.                             FROM dtb_products_class
  342.                             GROUP BY product_id
  343.                         ) AS T4
  344.                         ON dtb_products.product_id = T4.product_id
  345.             )
  346. __EOS__;
  347.  
  348.         return array(
  349.             "vw_cross_class" => '
  350.                 (SELECT T1.class_id AS class_id1, T2.class_id AS class_id2, T1.classcategory_id AS classcategory_id1, T2.classcategory_id AS classcategory_id2, T1.name AS name1, T2.name AS name2, T1.rank AS rank1, T2.rank AS rank2
  351.                 FROM dtb_classcategory AS T1, dtb_classcategory AS T2 ) ',
  352.  
  353.             "vw_cross_products_class" =>'
  354.                 (SELECT T1.class_id1, T1.class_id2, T1.classcategory_id1, T1.classcategory_id2, T2.product_id,
  355.                 T1.name1, T1.name2, T2.product_code, T2.stock, T2.price01, T2.price02, T1.rank1, T1.rank2
  356.                 FROM (SELECT T1.class_id AS class_id1, T2.class_id AS class_id2, T1.classcategory_id AS classcategory_id1, T2.classcategory_id AS classcategory_id2, T1.name AS name1, T2.name AS name2, T1.rank AS rank1, T2.rank AS rank2
  357.                 FROM dtb_classcategory AS T1, dtb_classcategory AS T2 ) AS T1 LEFT JOIN dtb_products_class AS T2
  358.                 ON T1.classcategory_id1 = T2.classcategory_id1 AND T1.classcategory_id2 = T2.classcategory_id2) ',
  359.  
  360.             "vw_products_nonclass" => '
  361.                 (SELECT
  362.                     T1.product_id,
  363.                     T1.name,
  364.                     T1.deliv_fee,
  365.                     T1.sale_limit,
  366.                     T1.sale_unlimited,
  367.                     T1.category_id,
  368.                     T1.rank,
  369.                     T1.status,
  370.                     T1.product_flag,
  371.                     T1.point_rate,
  372.                     T1.comment1,
  373.                     T1.comment2,
  374.                     T1.comment3,
  375.                     T1.comment4,
  376.                     T1.comment5,
  377.                     T1.comment6,
  378.                     T1.file1,
  379.                     T1.file2,
  380.                     T1.file3,
  381.                     T1.file4,
  382.                     T1.file5,
  383.                     T1.file6,
  384.                     T1.main_list_comment,
  385.                     T1.main_list_image,
  386.                     T1.main_comment,
  387.                     T1.main_image,
  388.                     T1.main_large_image,
  389.                     T1.sub_title1,
  390.                     T1.sub_comment1,
  391.                     T1.sub_image1,
  392.                     T1.sub_large_image1,
  393.                     T1.sub_title2,
  394.                     T1.sub_comment2,
  395.                     T1.sub_image2,
  396.                     T1.sub_large_image2,
  397.                     T1.sub_title3,
  398.                     T1.sub_comment3,
  399.                     T1.sub_image3,
  400.                     T1.sub_large_image3,
  401.                     T1.sub_title4,
  402.                     T1.sub_comment4,
  403.                     T1.sub_image4,
  404.                     T1.sub_large_image4,
  405.                     T1.sub_title5,
  406.                     T1.sub_comment5,
  407.                     T1.sub_image5,
  408.                     T1.sub_large_image5,
  409.                     T1.sub_title6,
  410.                     T1.sub_comment6,
  411.                     T1.sub_image6,
  412.                     T1.sub_large_image6,
  413.                     T1.del_flg,
  414.                     T1.creator_id,
  415.                     T1.create_date,
  416.                     T1.update_date,
  417.                     T1.deliv_date_id,
  418.                     T2.product_id_sub,
  419.                     T2.product_code,
  420.                     T2.price01,
  421.                     T2.price02,
  422.                     T2.stock,
  423.                     T2.stock_unlimited,
  424.                     T2.classcategory_id1,
  425.                     T2.classcategory_id2
  426.                 FROM (SELECT * FROM dtb_products &&noncls_where&&) AS T1 LEFT JOIN
  427.                 (SELECT
  428.                 product_id AS product_id_sub,
  429.                 product_code,
  430.                 price01,
  431.                 price02,
  432.                 stock,
  433.                 stock_unlimited,
  434.                 classcategory_id1,
  435.                 classcategory_id2
  436.                 FROM dtb_products_class WHERE classcategory_id1 = 0 AND classcategory_id2 = 0)
  437.                 AS T2
  438.                 ON T1.product_id = T2.product_id_sub) ',
  439.  
  440.             "vw_products_allclass" => "
  441.             (
  442.                 SELECT
  443.                     alldtl.*,
  444.                     dtb_category.rank AS category_rank,
  445.                     T2.category_id,
  446.                     T2.rank AS product_rank
  447.                 FROM
  448.                     {$sql['vw_products_allclass_detail']} AS alldtl
  449.                     LEFT JOIN
  450.                         dtb_product_categories AS T2
  451.                         ON alldtl.product_id = T2.product_id
  452.                     LEFT JOIN
  453.                         dtb_category
  454.                         ON T2.category_id = dtb_category.category_id
  455.             ) ",
  456.  
  457.             "vw_products_allclass_detail" => $sql['vw_products_allclass_detail'],
  458.  
  459.             "vw_product_class" => '
  460.                 (SELECT * FROM
  461.                 (SELECT T3.product_class_id, T3.product_id AS product_id_sub, classcategory_id1, classcategory_id2,
  462.                 T3.rank AS rank1, T4.rank AS rank2, T3.class_id AS class_id1, T4.class_id AS class_id2,
  463.                 stock, price01, price02, stock_unlimited, product_code
  464.                 FROM ( SELECT
  465.                         T1.product_class_id,
  466.                         T1.product_id,
  467.                         classcategory_id1,
  468.                         classcategory_id2,
  469.                         T2.rank,
  470.                         T2.class_id,
  471.                         stock,
  472.                         price01,
  473.                         price02,
  474.                         stock_unlimited,
  475.                         product_code
  476.                  FROM (dtb_products_class AS T1 LEFT JOIN dtb_classcategory AS T2
  477.                 ON T1.classcategory_id1 = T2.classcategory_id))
  478.                 AS T3 LEFT JOIN dtb_classcategory AS T4
  479.                 ON T3.classcategory_id2 = T4.classcategory_id) AS T5 LEFT JOIN dtb_products AS T6
  480.                 ON product_id_sub = T6.product_id) ',
  481.  
  482.             "vw_category_count" => '
  483.                 (SELECT T1.category_id, T1.category_name, T1.parent_category_id, T1.level, T1.rank, T2.product_count
  484.                 FROM dtb_category AS T1 LEFT JOIN dtb_category_total_count AS T2
  485.                 ON T1.category_id = T2.category_id) '
  486.         );
  487.     }
  488. }
  489. ?>

Documentation generated on Tue, 28 Apr 2009 18:13:15 +0900 by phpDocumentor 1.4.2