/fsn-site-central/library/Yab/Db/Adapter/Abstract.php

https://gitlab.com/team_fsn/fsn-php · PHP · 303 lines · 165 code · 127 blank · 11 comment · 19 complexity · 21b80d00af094bca001349f76d7acf4a MD5 · raw file

  1. <?php
  2. /**
  3. * Yab Framework
  4. *
  5. * @category Yab_Db_Adapter
  6. * @package Yab_Db_Adapter_Abstract
  7. * @author Yann BELLUZZI
  8. * @copyright (c) 2010 YBellu
  9. * @license http://www.ybellu.com/yab-framework/license.html
  10. * @link http://www.ybellu.com/yab-framework
  11. */
  12. abstract class Yab_Db_Adapter_Abstract {
  13. const DEFAULT_ENCODING = 'UTF-8';
  14. static private $_default_adapter = null;
  15. private $_columns = array();
  16. private $_schema = null;
  17. final public function __construct() {
  18. if(!self::hasDefaultAdapter())
  19. self::setDefaultAdapter($this);
  20. $args = func_get_args();
  21. Yab_Loader::getInstance()->invoke($this, 'construct', $args);
  22. }
  23. public function construct() {}
  24. abstract public function setEncoding($encoding = self::DEFAULT_ENCODING);
  25. abstract public function isConnected();
  26. abstract public function _quoteIdentifier($text);
  27. abstract public function fetch($rowset);
  28. abstract public function free($rowset);
  29. abstract public function limit($sql, $from, $offset);
  30. abstract public function getSelectedRows($rowset);
  31. abstract public function getSelectedSchema();
  32. abstract public function getTables($schema = null);
  33. abstract public function _columns($table);
  34. abstract public function formatTable(Yab_Db_Table $table);
  35. abstract protected function _lastInsertId($table);
  36. abstract protected function _disconnect();
  37. abstract protected function _setSchema($schema);
  38. abstract protected function _connect();
  39. abstract protected function _error();
  40. abstract protected function _query($sql);
  41. abstract protected function _affectedRows();
  42. abstract protected function _quote($text);
  43. final public function setDefault() {
  44. self::setDefaultAdapter($this);
  45. return $this;
  46. }
  47. final public function quote($text) {
  48. if(!$this->isConnected())
  49. $this->connect();
  50. return $this->_quote($text);
  51. }
  52. final public function quoteIdentifier($text) {
  53. return $this->_quoteIdentifier($this->unQuoteIdentifier($text));
  54. }
  55. final public function getAffectedRows() {
  56. if(!$this->isConnected())
  57. $this->connect();
  58. return $this->_affectedRows();
  59. }
  60. final public function getLastInsertId($table) {
  61. if(!$this->isConnected())
  62. $this->connect();
  63. return $this->_lastInsertId($table);
  64. }
  65. final public function disconnect() {
  66. if(!$this->isConnected())
  67. throw new Yab_Exception('can not disconnect from db server, no connexion');
  68. $this->_disconnect();
  69. return $this;
  70. }
  71. final public function setSchema($schema) {
  72. $this->_schema = $schema;
  73. if(!$this->isConnected())
  74. return $this;
  75. $this->_setSchema($schema);
  76. return $this;
  77. }
  78. final public function connect() {
  79. if($this->isConnected())
  80. throw new Yab_Exception('already connected to the db server');
  81. $this->_connect();
  82. if($this->_schema)
  83. $this->_setSchema($this->_schema);
  84. return $this;
  85. }
  86. final static public function hasDefaultAdapter() {
  87. return self::$_default_adapter instanceof Yab_Db_Adapter_Abstract;
  88. }
  89. final static public function setDefaultAdapter(Yab_Db_Adapter_Abstract $adapter) {
  90. self::$_default_adapter = $adapter;
  91. }
  92. final static public function getDefaultAdapter() {
  93. if(!self::$_default_adapter)
  94. throw new Yab_Exception('no default db adapter defined');
  95. return self::$_default_adapter;
  96. }
  97. final public function getError() {
  98. if(!$this->isConnected())
  99. $this->connect();
  100. return $this->_error();
  101. }
  102. final public function query($sql) {
  103. if(!$this->isConnected())
  104. $this->connect();
  105. Yab_Loader::getInstance('Yab_Observer')->notify('SQL_QUERY', array($sql));
  106. $sql = rtrim($sql, ';');
  107. $rowset = $this->_query($sql);
  108. if(!$rowset)
  109. throw new Yab_Exception($this->getError());
  110. return $rowset;
  111. }
  112. final public function __destruct() {
  113. if($this->isConnected())
  114. $this->disconnect();
  115. }
  116. final public function resetColumns($table = null) {
  117. $table_name = (string) $table;
  118. if($table_name) {
  119. if(array_key_exists($table_name, $this->_columns))
  120. unset($this->_columns[$table_name]);
  121. } else {
  122. $this->_columns = array();
  123. }
  124. return $this;
  125. }
  126. final public function getColumns($table) {
  127. $table_name = (string) $table;
  128. if(array_key_exists($table_name, $this->_columns))
  129. return $this->_columns[$table_name];
  130. $this->_columns[$table_name] = $this->_columns($table);
  131. return $this->_columns[$table_name];
  132. }
  133. final public function getTable($name, $schema = null) {
  134. if($name instanceof Yab_Db_Table)
  135. return $name;
  136. try {
  137. if($schema === null)
  138. return Yab_Loader::getInstance()->invoke($name, array($this), 'Yab_Db_Table');
  139. } catch(Yab_Exception $e) {}
  140. $name = $this->quoteIdentifier($name);
  141. $schema = $this->quoteIdentifier($schema);
  142. $key = $this->unQuoteIdentifier($schema.'.'.$name);
  143. return new Yab_Db_Table($this, $key);
  144. }
  145. final public function prepare($sql) {
  146. return new Yab_Db_Statement($this, $sql);
  147. }
  148. final public function insert($table, array $values) {
  149. $table = $this->getTable($table);
  150. foreach($values as $key => $value)
  151. $values[$key] = $value !== null ? ($table->getColumn($key)->getQuotable() ? $this->quote($value) : (is_numeric($value) ? $value : 'NULL')) : 'NULL';
  152. $this->query('INSERT INTO '.$this->quoteIdentifier($table).' ('.implode(', ', array_map(array($this, 'quoteIdentifier'), array_keys($values))).') VALUES ('.implode(', ', $values).')');
  153. return $this->getAffectedRows();
  154. }
  155. final public function update($table, array $values, $where) {
  156. $table = $this->getTable($table);
  157. foreach($values as $key => $value)
  158. $values[$key] = $this->quoteIdentifier($key).' = '.($value !== null ? ($table->getColumn($key)->getQuotable() ? $this->quote($value) : (is_numeric($value) ? $value : 'NULL')) : 'NULL');
  159. $this->query('UPDATE '.$this->quoteIdentifier($table).' SET '.implode(', ', $values).' WHERE '.$where);
  160. return $this->getAffectedRows();
  161. }
  162. final public function delete($table, $where) {
  163. $this->query('DELETE FROM '.$this->quoteIdentifier($table).' WHERE '.$where);
  164. return $this->getAffectedRows();
  165. }
  166. final public function truncate($table) {
  167. $this->query('DELETE FROM '.$this->quoteIdentifier($table));
  168. return $this->getAffectedRows();
  169. }
  170. final public function unQuoteIdentifier($text) {
  171. $text = preg_replace('#^[^a-zA-Z0-9_\-]*#', '', trim((string) $text));
  172. $text = preg_replace('#[^a-zA-Z0-9_\-]*$#', '', trim((string) $text));
  173. return trim((string) $text);
  174. }
  175. }
  176. // Do not clause PHP tags unless it is really necessary