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

Source for file edb.php

Documentation is available at edb.php

  1. <?php
  2. /**
  3.  * Project: EDB :: 확장 DB 추상화 layer<br>
  4.  * File:    edb.php
  5.  *
  6.  * 이 패키지는 다음의 DB 추상화 계층을 제공한다.
  7.  *
  8.  * - CUBRID
  9.  * - MSSQL
  10.  * - MYSQL
  11.  * - MYSQLi
  12.  * - PostgreSQL
  13.  * - SQLite2
  14.  * - SQLite3
  15.  * - SQLRelay
  16.  *
  17.  *
  18.  * @category    Database
  19.  * @package     EDB
  20.  * @author      JoungKyun.Kim <http://oops.org>
  21.  * @copyright   (c) 1997-2018 OOPS.org
  22.  * @license     BSD License
  23.  * @version     SVN: $Id$
  24.  * @link        http://pear.oops.org/package/EDB
  25.  * @since       File available since release 0.0.1
  26.  * @example        EDB/tests/cubrid.php Sample code of cubrid abstraction layer
  27.  * @example        EDB/tests/mysql.php Sample code of mysql abstraction layer
  28.  * @example        EDB/tests/mysqli.php Sample code of mysqli abstraction layer
  29.  * @example        EDB/tests/pgsql.php Sample code of postgresql abstraction layer
  30.  * @example        EDB/tests/sqlite2.php Sample code of sqlite2 abstraction layer
  31.  * @example        EDB/tests/sqlite3.php Sample code of sqlite3 abstraction layer
  32.  * @filesource
  33.  */
  34.  
  35. /**
  36.  * import myException class
  37.  */
  38. require_once 'myException.php';
  39. /**
  40.  * import EDB_Common class
  41.  */
  42. require_once 'EDB/EDB_Common.php';
  43.  
  44. /**
  45.  * 확장 DB 추상화 layer
  46.  *
  47.  * 이 패키지는 다음의 DB 추상화 계층을 제공한다.
  48.  *
  49.  * - CUBRID
  50.  * - MSSQL
  51.  * - MYSQL
  52.  * - MYSQLi
  53.  * - PostgreSQL
  54.  * - SQLite2
  55.  * - SQLite3
  56.  * - SQLRelay
  57.  *
  58.  * @package     EDB
  59.  */
  60. Class EDB extends EDB_Common
  61. {
  62.     // {{{ prpperties
  63.     /**
  64.      * EDB class의 DB 핸들러
  65.      * @access private
  66.      * @var    object 
  67.      */
  68.     private $db;
  69.     // }}}
  70.  
  71.     // {{{ (void) EDB::__construct (void)
  72.     /**
  73.      * EDB 클래스 초기화
  74.      *
  75.      * 지원되는 추상화 계층으로는 cubrid, mysql, mysqli, pgsql,
  76.      * sqlite2, sqlite3를 지원한다.
  77.      *
  78.      * @see EDB_CUBRID::__construct()
  79.      * @see EDB_MSSQL::__construct()
  80.      * @see EDB_PGSQL::__construct()
  81.      * @see EDB_MYSQL::__construct()
  82.      * @see EDB_MYSQLI::__construct()
  83.      * @see EDB_SQLITE2::__construct()
  84.      * @see EDB_SQLITE3::__construct()
  85.      * @access public
  86.      * @return resource 지정한 DB extension resource
  87.      * @param  string $host,... 데이터베이스 호스트
  88.      */
  89.     function __construct ({
  90.         $argc func_num_args ();
  91.         $argv func_get_args ();
  92.  
  93.         $iniset function_exists ('___ini_set''___ini_set' 'ini_set';
  94.         $iniset ('magic_quotes_gpc'false);
  95.  
  96.         if preg_match ('!^([^:]+)://!'$argv[0]$matches) ) {
  97.             $dbtype 'EDB_' strtoupper ($matches[1]);
  98.             if parent::file_exists ("EDB/{$dbtype}.php") ) {
  99.                 throw new myException ('Unsupported DB Engine'E_USER_ERROR);
  100.                 return;
  101.             }
  102.         else
  103.             $dbtype 'EDB_MYSQLI';
  104.  
  105.         /**
  106.          * DB 추상화 계층 class를 로드
  107.          */
  108.         require_once 'EDB/' $dbtype '.php';
  109.         $this->db new $dbtype ($argv);
  110.     }
  111.     // }}}
  112.  
  113.     // {{{ (array) public EDB::exquried (void)
  114.     /**
  115.      * 현재 세션에서 실행된 쿼리 목록을 반환
  116.      *
  117.      * @access public
  118.      * @return array 실행 쿼리 목록을 배열로 반환.
  119.      */
  120.     function exqueried ({
  121.         if $this->db->queryLog == null )
  122.             return array ();
  123.  
  124.         return $this->db->queryLog;
  125.     }
  126.     // }}}
  127.  
  128.     // {{{ (string) EDB::get_charset (void)
  129.     /**
  130.      * Get current db charset.
  131.      * 현재의 db 문자셋을 가져온다.
  132.      *
  133.      * 이 method는 실 DBMS에 의하여 제약이 있다.
  134.      * mysql, sqlite3는 <b>Unsupport</b>를 반환한다.
  135.      *
  136.      * @access public
  137.      * @return string 현재 문자셋 이름 반환
  138.      */
  139.     function get_charset ({
  140.         return $this->db->get_charset ();
  141.     }
  142.     // }}}
  143.  
  144.     // {{{ (bool) EDB::set_charset ($charset)
  145.     /**
  146.      * Set database charset.
  147.      * DB 문자셋을 설정/변경 한다.
  148.      *
  149.      * 이 method는 실 DB의 영향을 받는다.
  150.      *
  151.      * mysql과 mysqli만 지원을 하며, 나머지는 모두 아무런 동작 없이
  152.      * 항상 true만 반환한다.
  153.      *
  154.      * @access public
  155.      * @return bool 
  156.      * @param  string DB가 지원하는 문자셋 이름
  157.      */
  158.     function set_charset ($char 'utf8'{
  159.         return $this->db->set_charset ($char);
  160.     }
  161.     // }}}
  162.  
  163.     // {{{ (string) EDB::escape ($string)
  164.     /**
  165.      * SQL 문에 사용이 되어지는 특수 문자를 에스케이프 시킨다.
  166.      *
  167.      * DB API에서 지원을 할 경우 해당 API의 escape api를 사용하며, 지원하지
  168.      * 않을 경우, addslashes를 사용한다.
  169.      *
  170.      * SQLRELAY와 PGSQL의 경우 원 문자열을 그대로 반환한다. SQL RELAY의 경우
  171.      * 해당 DB의 escape function을 이용해야 하며, PGSQL의 경우 PGSQL에서 지원
  172.      * 하는 data type의 escape function을 사용하도록 한다.
  173.      *
  174.      * 권고사항!
  175.      * 이 함수를 사용해야 하는 경우라면, 이 함수를 사용하는것 보다 bind query
  176.      * 를 사용하는 것을 권장한다!
  177.      *
  178.      * @access public
  179.      * @return string 
  180.      * @param  string escape 되어질 원본 문자열
  181.      * @param  string (optional) escape 형식. 이 파라미터는 PGSQL에서만 사용된다.
  182.      *                 <ul>
  183.      *                     <li><b>i</b> - identifier</li>
  184.      *                     <li><b>b</b> - bytea</li>
  185.      *                     <li><b>s</b> - string (<b>기본값</b>)</li>
  186.      *                     <li><b>u</b> - unescape bytea</li>
  187.      *                 </ul>
  188.      */
  189.     function escape ($buf$type 's'{
  190.         return $this->db->escape ($buf$type);
  191.     }
  192.     // }}}
  193.  
  194.     // {{{ (int) EDB::query ($query, $param_type, $param1, $param2 ...)
  195.     /**
  196.      * 데이터베이스상에서 쿼리를 실행한다.
  197.      *
  198.      * blob 데이터 (binary data) 입력시에는 가능한 bind query를 사용하는
  199.      * 것을 권장한다.
  200.      *
  201.      * fetch가 필요 없는 query를 수행하더라고, 수행 후에는 free_result
  202.      * method를 호출해 주어야 한다.
  203.      *
  204.      * @access public
  205.      * @return integer|false  실제 적용된 row 수
  206.      * @param  string  $query  실행할 쿼리
  207.      * @param  string  $type   (optional) bind 파라미터 형식
  208.      *
  209.      *          bind parameter 형식은 각 DB 엔진의 영향을 받지 않으며 EDB
  210.      *          패키지가 직접 테스트를 하고, engine으로 전달이 되지는 않는다.
  211.      *
  212.      *          단, blob과 clob의 경우 해당 DB API에서 관련 API를 제공을 할
  213.      *          경우에는 해댱 API를 이용 하게 된다.
  214.      *
  215.      *          EDB 패키지에서 지원하는 형식은 다음과 같다.
  216.      *
  217.      *          - <b>b</b> blob
  218.      *          - <b>c</b> clob
  219.      *          - <b>i</b> integer
  220.      *          - <b>f</b> float, double
  221.      *          - <b>n</b> null
  222.      *          - <b>s</b> string
  223.      *           - 검사를 하지 않고 bypass.
  224.      *           - bcifn 외의 형식은 모두 s로 지정을 하면 무난하게 통과된다.
  225.      *
  226.      *          blob와 clob type으로 지정했을 경우 bind parameter 값은 data
  227.      *          멤버와 len 멤버를 가진 object로 주어져야 한다.
  228.      *
  229.      *          <code>
  230.      *          $param = (object) array ('data' => 'value', 'len' => 'value');
  231.      *          </code>
  232.      *
  233.      *          또한, blob 데이터 insert/update 시에 bind query를 사용하면
  234.      *          binary data를 escape 할 필요가 없다.
  235.      *
  236.      * @param  mixed   $param1 (optional) 첫번째 bind 파라미터 값
  237.      * @param  mixed   $param2,... (optional) 두번째 bind 파라미터 값
  238.      */
  239.     function query ({
  240.         $r $this->db->query (func_get_args ());
  241.         return $r;
  242.     }
  243.     // }}}
  244.  
  245.     // {{{ (int) EDB::lastId (void)
  246.     /**
  247.      * 마지막 실행한 쿼리에서 자동으로 생성된 키값(Primary Key) 또는
  248.      * row OID 값을 반환한다.
  249.      *
  250.      * @since 2.0.4
  251.      * @access public
  252.      * @return integer row OID를 반환. 이전 query가 새로운 row id를 생성하지
  253.      *                  않았을 경우나 실행 실패시에 0을 반환한다.
  254.      *  <pre>
  255.      *      - cubrid   : returns inserted value of AUTO_INCREMENT column
  256.      *      - mssql    : returns inserted row OID
  257.      *      - mysql    : returns inserted value of Primary Key
  258.      *      - mysqli   : returns inserted value of Primary key
  259.      *      - pgsql    : returns inserted row OID
  260.      *      - sqlite2  : returns inserted row OID
  261.      *      - sqlite3  : returns inserted row OID
  262.      *      - sqlrelay : returns inserted value of autoincrement column
  263.      *  </pre>
  264.      */
  265.     function lastId ({
  266.         $r $this->db->lastId ();
  267.         return $r $r 0;
  268.     }
  269.     // }}}
  270.  
  271.     // {{{ (bool) EDB::seek ($offset)
  272.     /**
  273.      * result row 포인터를 이동한다.
  274.      *
  275.      * sqlite/sqlite3의 경우 무조건 처음으로 돌아가서 원하는 offset까지
  276.      * 이동을 하므로 속도 저하가 발생할 수 있다.
  277.      *
  278.      * offset이 row num보다 클경우에는 마지막 row로 이동을 한다.
  279.      *
  280.      * @access public
  281.      * @return boolean 
  282.      * @param  integer 0부터 <b>전체 반환 row수 - 1</b> 까지의 범위
  283.      */
  284.     function seek ($offset{
  285.         return $this->db->seek ($offset);
  286.     }
  287.     // }}}
  288.  
  289.     // {{{ (object) EDB::fetch ($free = false)
  290.     /**
  291.      * associative 개체로 result row를 가져온다.
  292.      *
  293.      * @access public
  294.      * @return stdClass|falseresult row로 가져온 object.
  295.      *                         result row가 0일 경우 false를 반환한다.
  296.      * @param  boolean (optional) fetch 수행 후 result를 free한다.
  297.      *                  (기본값: false) EDB >= 2.0.3
  298.      */
  299.     function fetch ($free false{
  300.         return $this->db->fetch ($free);
  301.     }
  302.     // }}}
  303.  
  304.     // {{{ (array) EDB::fetch_all ($free = true)
  305.     /**
  306.      * 모든 result row를 associative object 배열로 반환한다.
  307.      *
  308.      * fetch_all method는 fetch를 수행후 result rows를 free한다.
  309.      * 만약 free하고 싶지 않다면, 첫번째 aurgument값으로 false를
  310.      * 지정하도록 한다.
  311.      *
  312.      * @access public
  313.      * @return array  associative object 배열. result row가 0일 경우
  314.      *                 빈 배열을 반환한다.
  315.      * @param  boolean (optional) fetch 수행후 result를 free 한다.
  316.      *                  (기본값: true)
  317.      */
  318.     function fetch_all ($free true{
  319.         return $this->db->fetch_all ($free);
  320.     }
  321.     // }}}
  322.  
  323.     // {{{ (string) EDB::field_name ($index)
  324.     /**
  325.      * 지정한 n번째의 컬럼 이름을 반환한다.
  326.      *
  327.      * @access public
  328.      * @return string 
  329.      * @param  integer 0부터 시작하는 컬럼 인덱스 번호
  330.      */
  331.     function field_name ($index{
  332.         return $this->db->field_name ($index);
  333.     }
  334.     // }}}
  335.  
  336.     // {{{ (string) EDB::field_type ($field_index[, $table = '')
  337.     /**
  338.      * 지정한 n번째의 컬럼 유형을 반환한다.
  339.      *
  340.      * sqlite3의 경우 null을 제외하고는 빈 값을 반환하므로,
  341.      * EDB package에서는 <b>unknown, maybe libsqlite3 bug?</b>로
  342.      * 반환한다.
  343.      *
  344.      * @access public
  345.      * @return string  db engine에 따라 자료형이 다르다.
  346.      * @param  integer 0부터 시작하는 컬럼 인덱스 번호
  347.      * @param  string  (optional) table 이름. sqlite2 engine에서만
  348.      *                  지정한다.
  349.      */
  350.     function field_type ($index$table ''{
  351.         return $this->db->field_type ($index$table);
  352.     }
  353.     // }}}
  354.  
  355.     // {{{ (int) EDB::num_fields (void)
  356.     /**
  357.      * 해당 row의 field 수를 반환한다.
  358.      *
  359.      * @access public
  360.      * @return integer 
  361.      */
  362.     function num_fields ({
  363.         return $this->db->num_fields ();
  364.     }
  365.     // }}}
  366.  
  367.     // {{{ (bool) EDB::free_result (void)
  368.     /**
  369.      * 주어진 문장 핸들에 대하여 메모리에 저장된 결과를 해제.
  370.      * query mehtod가 호출이 되면, fetch 결과가 있던 없던, 무조건 이
  371.      * method가 호출이 되어져야 한다.
  372.      *
  373.      * @access public
  374.      * @return boolean sqlite, sqlite3, mysqli는 항상 true를 반환한다.
  375.      */
  376.     function free_result ({
  377.         return $this->db->free_result();
  378.     }
  379.     // }}}
  380.  
  381.     // {{{ (void) EDB::transaction_start (void)
  382.     /**
  383.      * DB transaction을 시작한다.
  384.      *
  385.      * @access public
  386.      * @return void 
  387.      * @since 2.0.5
  388.      */
  389.     function transaction_start ({
  390.         $this->db->trstart ();
  391.     }
  392.     // }}}
  393.  
  394.     // {{{ (void) EDB::transaction_end ($v)
  395.     /**
  396.      * DB transaction을 종료한다.
  397.      *
  398.      * @access public
  399.      * @return void 
  400.      * @param bool false일경우 rollback을 수행한다.
  401.      * @since 2.0.5
  402.      */
  403.     function transaction_end ($v true{
  404.         $this->db->trend ($v);
  405.     }
  406.     // }}}
  407.  
  408.     // {{{ (void) EDB::close (void)
  409.     /**
  410.      * DB 핸들을 종료한다.
  411.      *
  412.      * 기본적으로 EDB는 페이지가 종료될 때 각 DB class의 __destruct에서
  413.      * close를 하기 때문에 따로 호출을 할 필요가 없다.
  414.      *
  415.      * 크드 중간에서 close를 명시적으로 해야할 필요가 있을 경우에 사용을
  416.      * 하면 된디.
  417.      *
  418.      * @access public
  419.      * @return void 
  420.      */
  421.     function close ({
  422.         try {
  423.             $this->db->free_result ();
  424.             $this->db->close ();
  425.         catch myException $e }
  426.     }
  427.     // }}}
  428. }
  429.  
  430. /*
  431.  * Local variables:
  432.  * tab-width: 4
  433.  * c-basic-offset: 4
  434.  * End:
  435.  * vim: set filetype=php noet sw=4 ts=4 fdm=marker:
  436.  * vim600: noet sw=4 ts=4 fdm=marker
  437.  * vim<600: noet sw=4 ts=4
  438.  */
  439. ?>

Documentation generated on Fri, 30 Aug 2024 06:10:08 +0900 by phpDocumentor 1.4.4