/surosql/wordpress_plugin/surosql/src/SurosqlWpdb.class.php
PHP | 295 lines | 248 code | 46 blank | 1 comment | 36 complexity | ae29e26034830d0eb0e4c63f48080637 MD5 | raw file
Possible License(s): LGPL-3.0, AGPL-1.0, GPL-2.0, LGPL-2.1
- <?php
-
- // version 1.1
-
- class SurosqlWpdb {
-
- static $osql;
-
- static function register($args = array()) {
- $defaults = array(
- 'osql' => new Surosql(),
- 'wpdb' => $GLOBALS['wpdb'],
- 'options' => array(),
- 'init_osql_func' => true);
- if(is_string($args)) {
- parse_str($args, $args);
- }
- extract(array_merge($defaults, $args));
-
- $osql->wpdb = $wpdb;
- if($init_osql_func && !function_exists('osql')) {
- self::$osql = $osql;
- self::init_osql_func($osql);
- SurosqlWpdbOOManager::register($osql);
- }
- foreach(get_class_methods('SurosqlWpdb') as $funcname) {
- if(substr($funcname, -6) == '_query') {
- $osql->imported_query_functions[substr($funcname, 0, -6)] = array('SurosqlWpdb', $funcname);
- } else if(substr($funcname, -5) == '_osql') {
- $osql->imported_osql_functions[substr($funcname, 0, -5)] = array('SurosqlWpdb', $funcname);
- }
- }
-
- $bin_string_operators = array('eq' => '=', 'neq' => '!=', 'lt' => '<', 'gt' => '>', 'lte' => '<=', 'gte' => '>=', 'like' => 'LIKE', 'is' => '');
- foreach($bin_string_operators as $opname => $op) {
- $osql->imported_osql_functions[$opname] = create_function('$osql, $key, $val = null', "return SurosqlWpdb::operator(\$osql, '$op', \$key, \$val);");
- $osql->imported_query_functions["if{$opname}"] = create_function('$query, $key, $val = null', "return \$query->andwhere(SurosqlWpdb::operator(\$query->osql, '$op', \$key, \$val));");
- }
-
- $bin_array_operators = array('in' => 'IN', 'nin' => 'NOT IN');
- foreach($bin_array_operators as $opname => $op) {
- $osql->imported_osql_functions[$opname] = create_function('$osql, $key, $val = null', "return SurosqlWpdb::operator_with_list_param(\$osql, '$op', \$key, \$val);");
- $osql->imported_query_functions["if{$opname}"] = create_function('$query, $key, $val = null', "return \$query->andwhere(SurosqlWpdb::operator_with_list_param(\$query->osql, '$op', \$key, \$val));");
- }
-
- return $osql;
- }
-
- static private function init_osql_func($osql) {
- function osql() {
- return SurosqlWpdb::$osql;
- }
- }
-
- static function quote_rec_osql($osql, $var, $maxdepth = PHP_INT_MAX, $depth = 0) {
- if(is_array($var) && $maxdepth > $depth) {
- foreach($var as $key => &$val) {
- $val = self::quote_rec_osql($osql, $val, $maxdepth, $depth + 1);
- }
- return $var;
- } else if(is_object($var) && $maxdepth > $depth) {
- $obj = clone $var;
- foreach(get_object_vars() as $field => $val) {
- $obj->$field = self::quote_rec_osql($osql, $val, $maxdepth, $depth + 1);
- }
- return $obj;
- } else {
- return '"' . $osql->wpdb->escape((string)$var) . '"';
- }
- }
-
- static function quote_osql($osql, $str) {
- return '"' . $osql->wpdb->escape((string)$str) . '"';
- }
-
- static function quote_lst($osql, $lst) {
- $lst = is_array($lst) ? Surosql::array_flatten($lst) : explode(',', (string)$lst);
- return implode(',', self::quote_rec_osql($osql, $lst, 1));
- }
-
- static function operator($osql, $operator, $key, $val = null, $quote_vals = true) {
- $where = array();
- if(is_null($val)) {
- foreach($key as $col => $colval) {
- $prepped_val = ($quote_vals ? self::quote_osql($osql, $val) : $colval);
- $where[] = "$col $operator $prepped_val";
- }
- } else {
- $keys = is_array($key) ? $key : array($key);
- $prepped_val = $quote_vals ? self::quote_osql($osql, $val) : $val;
- foreach($keys as $col) {
- $where[] = "$col $operator $prepped_val";
- }
- }
- return is_array($key) ? $where : $where[0];
- }
-
- static function operator_with_list_param($osql, $operator, $key, $val = null) {
- if(is_null($val)) {
- foreach($key as $col => &$colval) {
- $colval = '(' . self::quote_lst($osql, $colval) . ')';
- }
- } else {
- $val = '(' . self::quote_lst($osql, $val) . ')';
- }
- return self::operator($osql, $operator, $key, $val, false);
- }
-
- static private function wpdb_method($method, $query) {
- $wpdb = $query->osql->wpdb;
- $func_args = func_get_args();
- if(!isset($query->bound_args) || count($query->bound_args) == 0) {
- $arg = $query->sql();
- } else {
- $arg = call_user_func_array(array($wpdb, 'prepare'), array_merge(array($query->sql()), $query->bound_args));
- }
- return call_user_func_array(array($wpdb, $method), array_merge(array($arg), array_slice($func_args, 2)));
- }
-
- static function insert_osql($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), '%s'), array_values($values_unescaped));
- return $osql->exec("INSERT INTO `$table` (`" . implode('`, `', $names) . '`) VALUES (' . implode(', ', $sqlvalues) . ')', array_values($values_escaped));
- }
-
- static function escape_osql($osql, $var) {
- return $osql->wpdb->escape($var);
- }
-
- static function insert_id_osql($osql) {
- return $osql->wpdb->insert_id;
- }
-
- static function lastInsertId_osql($osql) {
- return $osql->wpdb->insert_id;
- }
-
- static function query_osql() {
- $args = func_get_args();
- return call_user_func_array(array('SurosqlWpdb', 'exec_osql'), $args);
- }
-
- static function exec_osql($osql, $query) {
- $func_args = func_get_args();
- if(func_num_args() == 2) {
- return $osql->wpdb->query($query);
- } else {
- return $osql->wpdb->query(call_user_func_array(array($osql->wpdb, 'prepare'), array_values(surosql::array_flatten(array_slice($func_args, 1)))));
- }
- }
-
- static function exec_query($query) {
- return self::wpdb_method('query', $query);
- }
-
- static function bind_query($query) {
- $sql = $query->sql();
- $func_args = func_get_args();
- $query->bound_args = array_values(surosql::array_flatten(array_slice($func_args, 1)));
- return $query;
- }
-
- static function get_results_query($query) {
- return self::wpdb_method('get_results', $query);
- }
-
- static function get_col_query($query) {
- return self::wpdb_method('get_col', $query);
- }
-
- static function get_var_query($query) {
- return self::wpdb_method('get_var', $query);
- }
-
- static function first_query($query, $default = null) {
- $r = self::wpdb_method('get_row', $query, ARRAY_A);
- if(!is_null($r)) {
- $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::wpdb_method('get_results', $query, ARRAY_A));
- }
-
- static function col_query($query, $col_num = 0) {
- return self::wpdb_method('get_col', $query, $col_num);
- }
-
- static function var_query($query) {
- return self::wpdb_method('get_var', $query);
- }
-
- static function getIteratorImpl_query($query) {
- return new ArrayIterator(self::all_query($query));
- }
- }
-
- class SurosqlWpdbOOManager {
-
- static function register($osql) {
- $funcs = array(
- 'insertobj' => array('SurosqlWpdbOOManager', 'insertobj'),
- 'updateobj' => array('SurosqlWpdbOOManager', 'updateobj'),
- 'deleteobj' => array('SurosqlWpdbOOManager', 'deleteobj'),
- );
- $osql->imported_osql_functions = array_merge($osql->imported_osql_functions, $funcs);
- }
-
- static function update($obj, $fields = null, $values_unescaped = array()) {
- return self::updateobj(SurosqlWpdb::$osql, $obj, $fields, $values_unescaped);
- }
-
- static function insert($obj, $fields = null, $values_unescaped = array()) {
- return self::insertobj(SurosqlWpdb::$osql, $obj, $fields, $values_unescaped);
- }
-
- static function delete($obj) {
- return self::deleteobj(SurosqlWpdb::$osql, $obj);
- }
-
- static function updateobj($osql, $obj, $fields = null, $values_unescaped = array()) {
- $oo = $osql->get_obj_info($obj);
- $fields = is_null($fields) ? array_diff($oo['columns'], array($oo['primary'])) : $fields;
- $bind_vars = array();
- foreach($fields as $field) {
- $bind_vars[$field] = isset($obj->$field) ? $obj->$field : null;
- $set[] = "`$field` = %s";
- }
- foreach($values_unescaped as $field => $value) {
- $set[] = "`$field` = $value";
- }
- $bind_vars = array_merge(array_values($osql->field_serialization($bind_vars, $oo)), array($obj->{$oo['primary']}));
- return $osql->update($oo['table'])->set(implode(', ', $set))->where("{$oo['primary']}=%d")->bind($bind_vars)->exec();
- }
-
- static function insertobj($osql, $obj, $fields = null, $values_unescaped = array()) {
- $oo = $osql->get_obj_info($obj);
- foreach($oo['columns'] as $field) {
- if(isset($obj->$field)) {
- $values_escaped[$field] = $obj->$field;
- }
- }
- if(isset($oo['primary']) && isset($values_escaped[$oo['primary']]) && is_null($values_escaped[$oo['primary']])) {
- unset($values_escaped[$oo['primary']]);
- }
- $osql->insert($oo['table'], $osql->field_serialization($values_escaped, $oo), $values_unescaped);
- return isset($oo['primary']) ? ($obj->{$oo['primary']} = $osql->lastInsertId()) : null;
- }
-
- static function deleteobj($osql, $obj) {
- $oo = $osql->get_obj_info($obj);
- return $osql->exec("DELETE FROM `{$oo['table']}` WHERE `{$oo['primary']}` = %d", $obj->{$oo['primary']});
- }
- }
-
- class SurosqlWpdbOO {
- const ONLY_COLUMN_FIELDS = 0;
- const ALSO_NON_COLUMN_FIELDS = 1;
-
- function __construct($field_array = null) {
- if(is_array($field_array)) {
- $this->set_fields_from_array($field_array);
- }
- }
-
- function set_fields_from_array($field_array, $which_fields = self::ONLY_COLUMN_FIELDS) {
- if($only_column_fields == self::ONLY_COLUMN_FIELDS) {
- $oo = SurosqlWpdb::$osql->get_obj_info($this);
- $field_array = array_intersect_key($field_array, array_flip($oo['columns']));
- }
- foreach($field_array as $name => $value) {
- $this->$name = $value;
- }
- }
-
- function update($fields = null, $values_unescaped = array()) {
- return SurosqlWpdbOOManager::update($this, $fields, $values_unescaped);
- }
-
- function insert($fields = null, $values_unescaped = array()) {
- return SurosqlWpdbOOManager::insert($this, $fields, $values_unescaped);
- }
-
- function delete() {
- return SurosqlWpdbOOManager::delete($this);
- }
- }
-
- ?>