/surosql/SurosqlPDO.class.php
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
- <?php
-
- // version: 3.2.0
-
- namespace ns;
-
- use \PDO;
- use \ArrayIterator;
- use \Exception;
-
-
- class SurosqlPDO {
-
- static $osql, $uid;
-
- static function register($args = array()) {
- if(is_string($args)) {
- parse_str($args, $args);
- }
- $defaults = array(
- 'osql' => new Surosql(),
- 'dsn' => null,
- 'username' => null,
- 'password' => null,
- 'driver_options' => array(),
- 'charset' => 'utf-8',
- 'set_as_default' => is_null(self::$osql),
- 'init_osql_func' => true,
- );
- extract(array_merge($defaults, $args), EXTR_SKIP);
-
- foreach(get_class_methods(__CLASS__) as $funcname) {
- if(substr($funcname, -6) == '_query') {
- $osql->imported_query_functions[substr($funcname, 0, -6)] = array(__CLASS__, $funcname);
- } else if(substr($funcname, -5) == '_osql') {
- $osql->imported_osql_functions[substr($funcname, 0, -5)] = array(__CLASS__, $funcname);
- }
- }
-
- if($set_as_default) {
- Surosql::$osql = self::$osql = $osql;
-
- if($init_osql_func && !function_exists('osql')) {
- function osql($from = null) {
- return is_null($from) ? SurosqlDriver::$osql : SurosqlDriver::$osql->fromoo($from);
- }
- }
- }
-
- $osql->pdo = new PDO($dsn, $username, $password, $driver_options);
- $osql->pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
- $osql->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
-
- switch(strtolower(trim(substr($dsn, 0, strpos($dsn, ':'))))) {
- case 'sqlite':
- if(strtolower($charset) != 'utf-8') {
- throw new Exception('Sqlite must have utf-8 charset.');
- }
- break;
- case 'mysql':
- // So we don't have to mess around with cursors and unbuffered queries by default.
- $osql->pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
- // Because MySQL's prepared statements skip the query cache, because it's dumb.
- $osql->pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
- $charset = str_replace(array('utf-8'), array('utf8'), strtolower($charset));
- $osql->exec("SET CHARACTER SET '$charset'");
- break;
- }
-
- SurosqlOOManager::init($osql);
-
- return $osql;
- }
-
- static function getIteratorImpl_query($query) {
- return new ArrayIterator($query->all());
- }
-
- static function beginTransaction_osql($osql) {
- return $osql->pdo->beginTransaction();
- }
-
- static function rollBack_osql($osql) {
- return $osql->pdo->rollBack();
- }
-
- static function commit_osql($osql) {
- return $osql->pdo->commit();
- }
-
- static function lastInsertId_osql($osql) {
- return $osql->pdo->lastInsertId();
- }
-
- static function prepare_osql($osql, $query) {
- return $osql->pdo->prepare($query);
- }
-
- static function quote_osql($osql, $var) {
- return $osql->pdo->quote((string) $var);
- }
-
- static function prepare_query($query) {
- return $query->osql->pdo->prepare($query->sql());
- }
-
- static function first_query($query, $default = null) {
- $r = self::query_query($query)->fetch(PDO::FETCH_ASSOC);
- if($r !== false) {
- $r = $query->array_to_oo(array($r));
- return $r[0];
- } else if(func_num_args() == 1) {
- throw new Exception('Trying to fetch from empty resultset.');
- }
- return $default;
- }
-
- static function all_query($query) {
- return $query->array_to_oo(self::query_query($query)->fetchAll(PDO::FETCH_ASSOC));
- }
-
- static function col_query($query, $col_num = 0) {
- return self::query_query($query)->fetchAll(PDO::FETCH_COLUMN, $col_num);
- }
-
- static function var_query($query) {
- return self::fetchVar_query($query);
- }
-
- static function get_prepared_bindable_query($query, $var, $type) {
- $query->{"bound_{$type}_args"} = array();
- $prepped_bind = $var->parts;
- foreach($prepped_bind as $i => $param) {
- if($i % 2 == 0) { continue; }
-
- self::$uid += 1;
- $query->{"bound_{$type}_args"}[':bound_' . self::$uid . 'th_arg'] = $param;
- $prepped_bind[$i] = ':bound_' . self::$uid . 'th_arg';
- }
- return implode(' ', $prepped_bind);
- }
-
- static function insert_osql($osql, $table, $values_escaped = array(), $values_unescaped = array()) {
- return self::insert_replace('INSERT', $osql, $table, $values_escaped, $values_unescaped);
- }
-
- static function replace_osql($osql, $table, $values_escaped = array(), $values_unescaped = array()) {
- return self::insert_replace('REPLACE', $osql, $table, $values_escaped, $values_unescaped);
- }
-
- static function insert_replace($type, $osql, $table, $values_escaped = array(), $values_unescaped = array()) {
- $table = $osql->glalias2table($table);
- $names = array_merge(array_keys($values_escaped), array_keys($values_unescaped));
- $sqlvalues = array_merge(array_fill(0, count($values_escaped), '?'), array_values($values_unescaped));
- return $osql->pdo->prepare("$type INTO `$table` (`" . implode('`, `', $names) . '`) VALUES (' . implode(', ', $sqlvalues) . ')')->execute(array_values($values_escaped));
- }
-
- static function exec_osql($osql, $sql, $bound_args = array()) {
- if(count($bound_args) == 0) {
- return $osql->pdo->exec($sql);
- } else {
- $pdostmt = $osql->pdo->prepare($sql);
- $pdostmt->execute($bound_args);
- return $pdostmt->rowCount();
- }
- }
-
- static function query_osql($osql) {
- $args = func_get_args();
- return call_user_func_array(array($osql->pdo, 'query'), array_slice($args, 1));
- }
-
- static function exec_query($query) {
- $sql = $query->sql();
- $bound_args = self::get_bound_args($query);
- return call_user_func_array(array(__CLASS__, 'exec_osql'), array($query->osql, $sql, $bound_args));
- }
-
- static function query_query($query) {
- $sql = $query->sql();
- $bound_args = self::get_bound_args($query);
- if(count($bound_args) == 0) {
- return $query->osql->pdo->query($sql);
- } else {
- $pdostmt = $query->osql->pdo->prepare($sql);
- $pdostmt->execute($bound_args);
- return $pdostmt;
- }
- }
-
- static function fetch_query($query) {
- $func_args = func_get_args();
- return call_user_func_array(array(self::query_query($query), 'fetch'), array_slice($func_args, 1));
- }
-
- static function fetchVar_query($query) {
- $func_args = func_get_args();
- return call_user_func_array(array(self::query_query($query), 'fetchColumn'), array_slice($func_args, 1));
- }
-
- static function fetchAll_query($query) {
- $func_args = func_get_args();
- return call_user_func_array(array(self::query_query($query), 'fetchAll'), array_slice($func_args, 1));
- }
-
- static function bind_query($query) {
- $query->bound_args = array();
- $func_args = func_get_args();
- return call_user_func_array(array(__CLASS__, 'bindadd_query'), $func_args);
- }
-
- static function bindadd_query($query) {
- $query->bound_args = !isset($query->bound_args) ? array() : $query->bound_args;
- $sql = $query->sql();
- $func_args = func_get_args();
- foreach(Surosql::array_flatten(array_slice($func_args, 1)) as $key => $value) {
- if(is_int($key)) {
- $query->bound_args[] = $value;
- } else {
- $key = substr($key, 0, 1) != ':' ? ":$key" : $key;
- if(preg_match('/' . preg_quote($key) . '($|\s|\)|,)/', $sql) == 1) {
- $query->bound_args[$key] = $value;
- }
- }
- }
- return $query;
- }
-
- static function get_bound_args($query) {
- return array_merge(
- isset($query->bound_args) ? $query->bound_args : array(),
- isset($query->bound_set_args) ? $query->bound_set_args : array(),
- isset($query->bound_where_args) ? $query->bound_where_args : array()
- );
- }
- }
-
- ?>