/environment/library/database/DB.class.php

https://github.com/dbernar1/Project-Pier · PHP · 346 lines · 117 code · 39 blank · 190 comment · 11 complexity · 58052ffef42a487a2b30b3914767eb6a MD5 · raw file

  1. <?php
  2. /**
  3. * This function holds open database connections and provides interface to them. It is also used
  4. * for SQL logging
  5. *
  6. * @version 1.0
  7. * @http://www.projectpier.org/
  8. */
  9. final class DB {
  10. /** ID of primary connection **/
  11. const PRIMARY_CONNECTION_ID = 'PRIMARY';
  12. /**
  13. * Collection of connections
  14. *
  15. * @var array
  16. */
  17. static private $connections = array();
  18. /**
  19. * ID of primary connection. This connection will be used if connection name is not suplied
  20. *
  21. * @var string
  22. */
  23. static private $primary_connection = self::PRIMARY_CONNECTION_ID;
  24. /**
  25. * SQL log
  26. *
  27. * @var array
  28. */
  29. static private $sql_log = array();
  30. /**
  31. * This function will return specific connection. If $connection_name is NULL primary connection will be used
  32. *
  33. * @access public
  34. * @param string $connection_name Connection name, if NULL primary connection will be used
  35. * @return AbstractDBAdapter
  36. */
  37. static function connection($connection_name = null) {
  38. if (is_null($connection_name)) {
  39. $connection_name = self::getPrimaryConnection();
  40. } // if
  41. return array_var(self::$connections, $connection_name);
  42. } // connection
  43. /**
  44. * Create new database connection
  45. *
  46. * @access public
  47. * @param string $adapter Adapter name (currently only mysql adapter is implemeted)
  48. * @param array $params Connection params
  49. * @param string $connection_name Name of the connection, if NULL default connection ID will be used
  50. * @return boolean
  51. * @throws FileDnxError
  52. * @throws DBAdapterDnx
  53. */
  54. static function connect($adapter, $params, $connection_name = null) {
  55. $connection_name = is_null($connection_name) || trim($connection_name) == '' ?
  56. self::PRIMARY_CONNECTION_ID :
  57. trim($connection_name);
  58. $adapter = self::connectAdapter($adapter, $params);
  59. if (($adapter instanceof AbstractDBAdapter) && $adapter->isConnected()) {
  60. self::$connections[$connection_name] = $adapter;
  61. return $adapter;
  62. } else {
  63. return null;
  64. } // if
  65. } // connect
  66. /**
  67. * This function will include adapter and try to connect. In case of error DBConnectError will be thrown
  68. *
  69. * @access public
  70. * @param string $adapter_name
  71. * @param array $params
  72. * @return AbstractDBAdapter
  73. * @throws DBAdapterDnx
  74. * @throws DBConnectError
  75. */
  76. private function connectAdapter($adapter_name, $params) {
  77. self::useAdapter($adapter_name);
  78. $adapter_class = self::getAdapterClass($adapter_name);
  79. if (!class_exists($adapter_class)) {
  80. throw new DBAdapterDnx($adapter_name, $adapter_class);
  81. } // if
  82. return new $adapter_class($params);
  83. } // connectAdapter
  84. /**
  85. * Figure out adapter location and include it
  86. *
  87. * @access public
  88. * @param string $adapter_class
  89. * @return void
  90. */
  91. private function useAdapter($adapter_name) {
  92. $adapter_class = self::getAdapterClass($adapter_name);
  93. $path = dirname(__FILE__) . "/adapters/$adapter_class.class.php";
  94. if (!is_readable($path)) {
  95. throw new FileDnxError($path);
  96. } // if
  97. include_once $path;
  98. } // useAdapter
  99. /**
  100. * Return class based on adapter name
  101. *
  102. * @access public
  103. * @param string $adapter_name
  104. * @return string
  105. */
  106. private function getAdapterClass($adapter_name) {
  107. return Inflector::camelize($adapter_name) . 'DBAdapter';
  108. } // getAdapterClass
  109. // ---------------------------------------------------
  110. // Interface to primary adapter
  111. // ---------------------------------------------------
  112. /**
  113. * Try to execute query, ignore the result
  114. *
  115. * @access public
  116. * @param string $sql
  117. * @return true
  118. */
  119. static function attempt($sql) {
  120. $arguments = func_get_args();
  121. array_shift($arguments);
  122. $arguments = count($arguments) ? array_flat($arguments) : null;
  123. try {
  124. self::connection()->execute($sql, $arguments);
  125. } catch(Exception $e) {
  126. }
  127. return true;
  128. } // execute
  129. /**
  130. * Execute query and return result
  131. *
  132. * @access public
  133. * @param string $sql
  134. * @return DBResult
  135. * @throws DBQueryError
  136. */
  137. static function execute($sql) {
  138. $arguments = func_get_args();
  139. array_shift($arguments);
  140. $arguments = count($arguments) ? array_flat($arguments) : null;
  141. return self::connection()->execute($sql, $arguments);
  142. } // execute
  143. /**
  144. * Execute query and return first row from result
  145. *
  146. * @access public
  147. * @param string $sql
  148. * @return array
  149. * @throws DBQueryError
  150. */
  151. static function executeOne($sql) {
  152. $arguments = func_get_args();
  153. array_shift($arguments);
  154. $arguments = count($arguments) ? array_flat($arguments) : null;
  155. return self::connection()->executeOne($sql, $arguments);
  156. } // executeOne
  157. /**
  158. * Execute query and return all rows
  159. *
  160. * @access public
  161. * @param string $sql
  162. * @return array
  163. * @throws DBQueryError
  164. */
  165. static function executeAll($sql) {
  166. $arguments = func_get_args();
  167. array_shift($arguments);
  168. $arguments = count($arguments) ? array_flat($arguments) : null;
  169. return self::connection()->executeAll($sql, $arguments);
  170. } // executeAll
  171. /**
  172. * Start transaction
  173. *
  174. * @access public
  175. * @param void
  176. * @return boolean
  177. * @throws DBQueryError
  178. */
  179. static function beginWork() {
  180. return self::connection()->beginWork();
  181. } // beginWork
  182. /**
  183. * Commit transaction
  184. *
  185. * @access public
  186. * @param void
  187. * @return boolean
  188. * @throws DBQueryError
  189. */
  190. static function commit() {
  191. return self::connection()->commit();
  192. } // commit
  193. /**
  194. * Rollback transaction
  195. *
  196. * @access public
  197. * @param void
  198. * @return boolean
  199. * @throws DBQueryError
  200. */
  201. static function rollback() {
  202. return self::connection()->rollback();
  203. } // rollback
  204. /**
  205. * Return insert ID
  206. *
  207. * @access public
  208. * @param void
  209. * @return integer
  210. */
  211. static function lastInsertId() {
  212. return self::connection()->lastInsertId();
  213. } // lastInsertId
  214. /**
  215. * Return number of affected rows
  216. *
  217. * @access public
  218. * @param void
  219. * @return integer
  220. */
  221. static function affectedRows() {
  222. return self::connection()->affectedRows();
  223. } // affectedRows
  224. /**
  225. * Escape value
  226. *
  227. * @access public
  228. * @param mixed $value
  229. * @return string
  230. */
  231. static function escape($value) {
  232. return self::connection()->escapeValue($value);
  233. } // escape
  234. /**
  235. * Escape field / table name
  236. *
  237. * @access public
  238. * @param string $field
  239. * @return string
  240. */
  241. static function escapeField($field) {
  242. return self::connection()->escapeField($field);
  243. } // escapeField
  244. /**
  245. * Prepare string. Replace every '?' with matching escaped value
  246. *
  247. * @param string $sql
  248. * @param array $arguments Array of arguments
  249. * @return string
  250. */
  251. static function prepareString($sql, $arguments = null) {
  252. if (is_array($arguments) && count($arguments)) {
  253. foreach ($arguments as $argument) {
  254. $sql = str_replace_first('?', DB::escape($argument), $sql);
  255. } // foreach
  256. } // if
  257. return $sql;
  258. } // prepareString
  259. // ---------------------------------------------------
  260. // Getters and setters
  261. // ---------------------------------------------------
  262. /**
  263. * Get primary_connection
  264. *
  265. * @access public
  266. * @param null
  267. * @return string
  268. */
  269. static function getPrimaryConnection() {
  270. return self::$primary_connection;
  271. } // getPrimaryConnection
  272. /**
  273. * Set primary_connection value
  274. *
  275. * @access public
  276. * @param string $value
  277. * @return null
  278. * @throws Error if connection does not exists
  279. */
  280. static function setPrimaryConnection($value) {
  281. if (!isset(self::$connections[$value])) {
  282. throw new Error("Connection '$value' does not exists");
  283. } // if
  284. self::$primary_connection = $value;
  285. } // setPrimaryConnection
  286. /**
  287. * Add query to SQL log
  288. *
  289. * @access public
  290. * @param string $sql
  291. * @return void
  292. */
  293. function addToSQLLog($sql) {
  294. self::$sql_log[] = $sql;
  295. } // addToSQLLog
  296. /**
  297. * Return SQL log
  298. *
  299. * @access public
  300. * @param void
  301. * @return array
  302. */
  303. function getSQLLog() {
  304. return self::$sql_log;
  305. } // getSQLLog
  306. } // DB
  307. ?>