PageRenderTime 51ms CodeModel.GetById 26ms RepoModel.GetById 0ms app.codeStats 0ms

/surosql/SurosqlPDO.class.php

https://bitbucket.org/SuRaMoN/surosql
PHP | 238 lines | 193 code | 42 blank | 3 comment | 28 complexity | af27ee805da48c9ca568e29ba8479bcc MD5 | raw file
Possible License(s): LGPL-3.0, AGPL-1.0, GPL-2.0, LGPL-2.1
  1. <?php
  2. // version: 3.2.0
  3. namespace ns;
  4. use \PDO;
  5. use \ArrayIterator;
  6. use \Exception;
  7. class SurosqlPDO {
  8. static $osql, $uid;
  9. static function register($args = array()) {
  10. if(is_string($args)) {
  11. parse_str($args, $args);
  12. }
  13. $defaults = array(
  14. 'osql' => new Surosql(),
  15. 'dsn' => null,
  16. 'username' => null,
  17. 'password' => null,
  18. 'driver_options' => array(),
  19. 'charset' => 'utf-8',
  20. 'set_as_default' => is_null(self::$osql),
  21. 'init_osql_func' => true,
  22. );
  23. extract(array_merge($defaults, $args), EXTR_SKIP);
  24. foreach(get_class_methods(__CLASS__) as $funcname) {
  25. if(substr($funcname, -6) == '_query') {
  26. $osql->imported_query_functions[substr($funcname, 0, -6)] = array(__CLASS__, $funcname);
  27. } else if(substr($funcname, -5) == '_osql') {
  28. $osql->imported_osql_functions[substr($funcname, 0, -5)] = array(__CLASS__, $funcname);
  29. }
  30. }
  31. if($set_as_default) {
  32. Surosql::$osql = self::$osql = $osql;
  33. if($init_osql_func && !function_exists('osql')) {
  34. function osql($from = null) {
  35. return is_null($from) ? SurosqlDriver::$osql : SurosqlDriver::$osql->fromoo($from);
  36. }
  37. }
  38. }
  39. $osql->pdo = new PDO($dsn, $username, $password, $driver_options);
  40. $osql->pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
  41. $osql->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  42. switch(strtolower(trim(substr($dsn, 0, strpos($dsn, ':'))))) {
  43. case 'sqlite':
  44. if(strtolower($charset) != 'utf-8') {
  45. throw new Exception('Sqlite must have utf-8 charset.');
  46. }
  47. break;
  48. case 'mysql':
  49. // So we don't have to mess around with cursors and unbuffered queries by default.
  50. $osql->pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
  51. // Because MySQL's prepared statements skip the query cache, because it's dumb.
  52. $osql->pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
  53. $charset = str_replace(array('utf-8'), array('utf8'), strtolower($charset));
  54. $osql->exec("SET CHARACTER SET '$charset'");
  55. break;
  56. }
  57. SurosqlOOManager::init($osql);
  58. return $osql;
  59. }
  60. static function getIteratorImpl_query($query) {
  61. return new ArrayIterator($query->all());
  62. }
  63. static function beginTransaction_osql($osql) {
  64. return $osql->pdo->beginTransaction();
  65. }
  66. static function rollBack_osql($osql) {
  67. return $osql->pdo->rollBack();
  68. }
  69. static function commit_osql($osql) {
  70. return $osql->pdo->commit();
  71. }
  72. static function lastInsertId_osql($osql) {
  73. return $osql->pdo->lastInsertId();
  74. }
  75. static function prepare_osql($osql, $query) {
  76. return $osql->pdo->prepare($query);
  77. }
  78. static function quote_osql($osql, $var) {
  79. return $osql->pdo->quote((string) $var);
  80. }
  81. static function prepare_query($query) {
  82. return $query->osql->pdo->prepare($query->sql());
  83. }
  84. static function first_query($query, $default = null) {
  85. $r = self::query_query($query)->fetch(PDO::FETCH_ASSOC);
  86. if($r !== false) {
  87. $r = $query->array_to_oo(array($r));
  88. return $r[0];
  89. } else if(func_num_args() == 1) {
  90. throw new Exception('Trying to fetch from empty resultset.');
  91. }
  92. return $default;
  93. }
  94. static function all_query($query) {
  95. return $query->array_to_oo(self::query_query($query)->fetchAll(PDO::FETCH_ASSOC));
  96. }
  97. static function col_query($query, $col_num = 0) {
  98. return self::query_query($query)->fetchAll(PDO::FETCH_COLUMN, $col_num);
  99. }
  100. static function var_query($query) {
  101. return self::fetchVar_query($query);
  102. }
  103. static function get_prepared_bindable_query($query, $var, $type) {
  104. $query->{"bound_{$type}_args"} = array();
  105. $prepped_bind = $var->parts;
  106. foreach($prepped_bind as $i => $param) {
  107. if($i % 2 == 0) { continue; }
  108. self::$uid += 1;
  109. $query->{"bound_{$type}_args"}[':bound_' . self::$uid . 'th_arg'] = $param;
  110. $prepped_bind[$i] = ':bound_' . self::$uid . 'th_arg';
  111. }
  112. return implode(' ', $prepped_bind);
  113. }
  114. static function insert_osql($osql, $table, $values_escaped = array(), $values_unescaped = array()) {
  115. return self::insert_replace('INSERT', $osql, $table, $values_escaped, $values_unescaped);
  116. }
  117. static function replace_osql($osql, $table, $values_escaped = array(), $values_unescaped = array()) {
  118. return self::insert_replace('REPLACE', $osql, $table, $values_escaped, $values_unescaped);
  119. }
  120. static function insert_replace($type, $osql, $table, $values_escaped = array(), $values_unescaped = array()) {
  121. $table = $osql->glalias2table($table);
  122. $names = array_merge(array_keys($values_escaped), array_keys($values_unescaped));
  123. $sqlvalues = array_merge(array_fill(0, count($values_escaped), '?'), array_values($values_unescaped));
  124. return $osql->pdo->prepare("$type INTO `$table` (`" . implode('`, `', $names) . '`) VALUES (' . implode(', ', $sqlvalues) . ')')->execute(array_values($values_escaped));
  125. }
  126. static function exec_osql($osql, $sql, $bound_args = array()) {
  127. if(count($bound_args) == 0) {
  128. return $osql->pdo->exec($sql);
  129. } else {
  130. $pdostmt = $osql->pdo->prepare($sql);
  131. $pdostmt->execute($bound_args);
  132. return $pdostmt->rowCount();
  133. }
  134. }
  135. static function query_osql($osql) {
  136. $args = func_get_args();
  137. return call_user_func_array(array($osql->pdo, 'query'), array_slice($args, 1));
  138. }
  139. static function exec_query($query) {
  140. $sql = $query->sql();
  141. $bound_args = self::get_bound_args($query);
  142. return call_user_func_array(array(__CLASS__, 'exec_osql'), array($query->osql, $sql, $bound_args));
  143. }
  144. static function query_query($query) {
  145. $sql = $query->sql();
  146. $bound_args = self::get_bound_args($query);
  147. if(count($bound_args) == 0) {
  148. return $query->osql->pdo->query($sql);
  149. } else {
  150. $pdostmt = $query->osql->pdo->prepare($sql);
  151. $pdostmt->execute($bound_args);
  152. return $pdostmt;
  153. }
  154. }
  155. static function fetch_query($query) {
  156. $func_args = func_get_args();
  157. return call_user_func_array(array(self::query_query($query), 'fetch'), array_slice($func_args, 1));
  158. }
  159. static function fetchVar_query($query) {
  160. $func_args = func_get_args();
  161. return call_user_func_array(array(self::query_query($query), 'fetchColumn'), array_slice($func_args, 1));
  162. }
  163. static function fetchAll_query($query) {
  164. $func_args = func_get_args();
  165. return call_user_func_array(array(self::query_query($query), 'fetchAll'), array_slice($func_args, 1));
  166. }
  167. static function bind_query($query) {
  168. $query->bound_args = array();
  169. $func_args = func_get_args();
  170. return call_user_func_array(array(__CLASS__, 'bindadd_query'), $func_args);
  171. }
  172. static function bindadd_query($query) {
  173. $query->bound_args = !isset($query->bound_args) ? array() : $query->bound_args;
  174. $sql = $query->sql();
  175. $func_args = func_get_args();
  176. foreach(Surosql::array_flatten(array_slice($func_args, 1)) as $key => $value) {
  177. if(is_int($key)) {
  178. $query->bound_args[] = $value;
  179. } else {
  180. $key = substr($key, 0, 1) != ':' ? ":$key" : $key;
  181. if(preg_match('/' . preg_quote($key) . '($|\s|\)|,)/', $sql) == 1) {
  182. $query->bound_args[$key] = $value;
  183. }
  184. }
  185. }
  186. return $query;
  187. }
  188. static function get_bound_args($query) {
  189. return array_merge(
  190. isset($query->bound_args) ? $query->bound_args : array(),
  191. isset($query->bound_set_args) ? $query->bound_set_args : array(),
  192. isset($query->bound_where_args) ? $query->bound_where_args : array()
  193. );
  194. }
  195. }
  196. ?>