PageRenderTime 50ms CodeModel.GetById 27ms RepoModel.GetById 1ms app.codeStats 0ms

/class_generator/libs/SurosqlPDO.class.php

https://bitbucket.org/SuRaMoN/surosql
PHP | 227 lines | 188 code | 39 blank | 0 comment | 25 complexity | 09aff1e6681295f0c3a621fa01b3b66c MD5 | raw file
Possible License(s): LGPL-3.0, AGPL-1.0, GPL-2.0, LGPL-2.1
  1. <?php
  2. class SurosqlPDO {
  3. static $osql;
  4. static function register($osql, $dsn, $username = null, $password = null, $driver_options = array()) {
  5. $osql->pdo = new PDO($dsn, $username, $password, $driver_options);
  6. $osql->pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
  7. $osql->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  8. if(!isset($driver_options['auto_register']) || $driver_options['auto_register']) {
  9. self::$osql = $osql;
  10. self::init_osql_func($osql);
  11. SurosqlPDOOOManager::register($osql);
  12. }
  13. foreach(get_class_methods('SurosqlPDO') as $funcname) {
  14. if(substr($funcname, -6) == '_query') {
  15. $osql->imported_query_functions[substr($funcname, 0, -6)] = array('SurosqlPDO', $funcname);
  16. } else if(substr($funcname, -5) == '_osql') {
  17. $osql->imported_osql_functions[substr($funcname, 0, -5)] = array('SurosqlPDO', $funcname);
  18. }
  19. }
  20. }
  21. static function init_osql_func($osql) {
  22. function osql() {
  23. return SurosqlPDO::$osql;
  24. }
  25. }
  26. static function beginTransaction_osql($osql) {
  27. return $osql->pdo->beginTransaction();
  28. }
  29. static function rollBack_osql($osql) {
  30. return $osql->pdo->rollBack();
  31. }
  32. static function commit_osql($osql) {
  33. return $osql->pdo->commit();
  34. }
  35. static function lastInsertId_osql($osql) {
  36. return $osql->pdo->lastInsertId();
  37. }
  38. static function prepare_osql($osql, $query) {
  39. return $osql->pdo->prepare($query);
  40. }
  41. static function quote_osql($osql, $query) {
  42. return $osql->pdo->quote($query);
  43. }
  44. static function insert_osql($osql, $table, $values_escaped = array(), $values_unescaped = array()) {
  45. $table = $osql->glalias2table($table);
  46. $names = array_merge(array_keys($values_escaped), array_keys($values_unescaped));
  47. $sqlvalues = array_merge(array_fill(0, count($values_escaped), '?'), array_values($values_unescaped));
  48. return $osql->pdo->prepare("INSERT INTO `$table` (`" . implode('`, `', $names) . '`) VALUES (' . implode(', ', $sqlvalues) . ')')->execute(array_values($values_escaped));
  49. }
  50. static function exec_osql($osql, $query) {
  51. $func_args = func_get_args();
  52. if(func_num_args() == 2) {
  53. return $osql->pdo->exec($query);
  54. } else {
  55. $pdostmt = $osql->pdo->prepare($query);
  56. $pdostmt->execute(array_slice($func_args, 2));
  57. return $pdostmt->rowCount();
  58. }
  59. }
  60. static function exec_query($query) {
  61. return call_user_func_array(array('SurosqlPDO', 'exec_osql'), array_merge(array($query->osql, $query->sql()), isset($query->bound_args) ? $query->bound_args : array()));
  62. }
  63. static function bind_query($query) {
  64. $sql = $query->sql();
  65. $func_args = func_get_args();
  66. $query->bound_args = array();
  67. foreach(surosql::array_flatten(array_slice($func_args, 1)) as $key => $value) {
  68. if(is_int($key)) {
  69. $query->bound_args[] = $value;
  70. } else {
  71. $key = substr($key, 0, 1) != ':' ? ":$key" : $key;
  72. if(preg_match('/' . preg_quote($key) . '($|\s|\)|,)/', $sql) == 1) {
  73. $query->bound_args[$key] = $value;
  74. }
  75. }
  76. }
  77. return $query;
  78. }
  79. static function prepare_query($query) {
  80. return $query->osql->pdo->prepare($query->sql());
  81. }
  82. static function query_query($query) {
  83. if(!isset($query->bound_args) || count($query->bound_args) == 0) {
  84. return $query->osql->pdo->query($query->sql());
  85. } else {
  86. $pdostmt = $query->osql->pdo->prepare($query->sql());
  87. $pdostmt->execute($query->bound_args);
  88. return $pdostmt;
  89. }
  90. }
  91. static function fetch_query($query) {
  92. $func_args = func_get_args();
  93. return call_user_func_array(array(self::query_query($query), 'fetch'), array_slice($func_args, 1));
  94. }
  95. static function fetchVar_query($query) {
  96. $func_args = func_get_args();
  97. return call_user_func_array(array(self::query_query($query), 'fetchColumn'), array_slice($func_args, 1));
  98. }
  99. static function fetchAll_query($query) {
  100. $func_args = func_get_args();
  101. return call_user_func_array(array(self::query_query($query), 'fetchAll'), array_slice($func_args, 1));
  102. }
  103. static function first_query($query, $default = null) {
  104. $r = self::query_query($query)->fetch(PDO::FETCH_ASSOC);
  105. if($r !== false) {
  106. $r = $query->array_to_oo(array($r));
  107. return $r[0];
  108. } else if(func_num_args() == 1) {
  109. throw new Exception('Trying to fetch from empty resultset.');
  110. }
  111. return $default;
  112. }
  113. static function all_query($query) {
  114. return $query->array_to_oo(self::query_query($query)->fetchAll(PDO::FETCH_ASSOC));
  115. }
  116. static function var_query($query) {
  117. return self::fetchVar_query($query);
  118. }
  119. static function getIteratorImpl_query($query) {
  120. return new ArrayIterator(self::fetchAll_query($query));
  121. }
  122. }
  123. class SurosqlPDOOOManager {
  124. static function register($osql) {
  125. $funcs = array(
  126. 'insertobj' => array('SurosqlPDOOOManager', 'insertobj'),
  127. 'updateobj' => array('SurosqlPDOOOManager', 'updateobj'),
  128. 'deleteobj' => array('SurosqlPDOOOManager', 'deleteobj'),
  129. );
  130. $osql->imported_osql_functions = array_merge($osql->imported_osql_functions, $funcs);
  131. }
  132. static function update($obj, $fields = null, $values_unescaped = array()) {
  133. return self::updateobj(SurosqlPDO::$osql, $obj, $fields, $values_unescaped);
  134. }
  135. static function insert($obj, $fields = null, $values_unescaped = array()) {
  136. return self::insertobj(SurosqlPDO::$osql, $obj, $fields, $values_unescaped);
  137. }
  138. static function delete($obj) {
  139. return self::deleteobj(SurosqlPDO::$osql, $obj);
  140. }
  141. static function updateobj($osql, $obj, $fields = null, $values_unescaped = array()) {
  142. $oo = $osql->get_obj_info($obj);
  143. $fields = is_null($fields) ? array_diff($oo['columns'], array($oo['primary'])) : $fields;
  144. $bind_vars = array();
  145. foreach($fields as $field) {
  146. $bind_vars[$field] = isset($obj->$field) ? $obj->$field : null;
  147. $set[] = "`$field` = ?";
  148. }
  149. foreach($values_unescaped as $field => $value) {
  150. $set[] = "`$field` = $value";
  151. }
  152. $bind_vars = array_merge(array_values($osql->field_serialization($bind_vars, $oo)), array($obj->{$oo['primary']}));
  153. return $osql->update($oo['table'])->set(implode(', ', $set))->where("{$oo['primary']}=?")->bind($bind_vars)->exec();
  154. }
  155. static function insertobj($osql, $obj, $fields = null, $values_unescaped = array()) {
  156. $oo = $osql->get_obj_info($obj);
  157. foreach($oo['columns'] as $field) {
  158. if(isset($obj->$field)) {
  159. $values_escaped[$field] = $obj->$field;
  160. }
  161. }
  162. $osql->insert($oo['table'], $osql->field_serialization($values_escaped, $oo), $values_unescaped);
  163. return isset($oo['primary']) ? ($obj->{$oo['primary']} = $osql->lastInsertId()) : null;
  164. }
  165. static function deleteobj($osql, $obj) {
  166. $oo = $osql->get_obj_info($obj);
  167. return $osql->exec("DELETE FROM `{$oo['table']}` WHERE `{$oo['primary']}` = ?", $obj->{$oo['primary']});
  168. }
  169. }
  170. class SurosqlPDOOO {
  171. function __construct($field_array = null) {
  172. if(is_array($field_array)) {
  173. foreach($field_array as $name => $value) {
  174. $this->$name = $value;
  175. }
  176. }
  177. }
  178. function update($fields = null, $values_unescaped = array()) {
  179. return SurosqlPDOOOManager::update($this, $fields, $values_unescaped);
  180. }
  181. function insert($fields = null, $values_unescaped = array()) {
  182. return SurosqlPDOOOManager::insert($this, $fields, $values_unescaped);
  183. }
  184. function delete() {
  185. return SurosqlPDOOOManager::delete($this);
  186. }
  187. }
  188. ?>