You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
324 lines
7.7 KiB
324 lines
7.7 KiB
<?php |
|
class wfDB { |
|
public $errorMsg = false; |
|
|
|
public static function shared() { |
|
static $_shared = null; |
|
if ($_shared === null) { |
|
$_shared = new wfDB(); |
|
} |
|
return $_shared; |
|
} |
|
|
|
/** |
|
* Returns the table prefix for the main site on multisites and the site itself on single site installations. |
|
* |
|
* @return string |
|
*/ |
|
public static function networkPrefix() { |
|
global $wpdb; |
|
return $wpdb->base_prefix; |
|
} |
|
|
|
/** |
|
* Returns the table with the site (single site installations) or network (multisite) prefix added. |
|
* |
|
* @param string $table |
|
* @param bool $applyCaseConversion Whether or not to convert the table case to what is actually in use. |
|
* @return string |
|
*/ |
|
public static function networkTable($table, $applyCaseConversion = true) { |
|
if (wfSchema::usingLowercase() && $applyCaseConversion) { |
|
$table = strtolower($table); |
|
} |
|
return self::networkPrefix() . $table; |
|
} |
|
|
|
/** |
|
* Returns the table prefix for the given blog ID. On single site installations, this will be equivalent to wfDB::networkPrefix(). |
|
* |
|
* @param int $blogID |
|
* @return string |
|
*/ |
|
public static function blogPrefix($blogID) { |
|
global $wpdb; |
|
return $wpdb->get_blog_prefix($blogID); |
|
} |
|
|
|
/** |
|
* Returns the table with the site (single site installations) or blog-specific (multisite) prefix added. |
|
* |
|
* @param string $table |
|
* @param bool $applyCaseConversion Whether or not to convert the table case to what is actually in use. |
|
* @return string |
|
*/ |
|
public static function blogTable($table, $blogID, $applyCaseConversion = true) { |
|
if (wfSchema::usingLowercase() && $applyCaseConversion) { |
|
$table = strtolower($table); |
|
} |
|
return self::blogPrefix($blogID) . $table; |
|
} |
|
|
|
public function querySingle(){ |
|
global $wpdb; |
|
if(func_num_args() > 1){ |
|
$args = func_get_args(); |
|
return $wpdb->get_var(call_user_func_array(array($wpdb, 'prepare'), $args)); |
|
} else { |
|
return $wpdb->get_var(func_get_arg(0)); |
|
} |
|
} |
|
public function querySingleRec(){ //queryInSprintfFormat, arg1, arg2, ... :: Returns a single assoc-array or null if nothing found. |
|
global $wpdb; |
|
if(func_num_args() > 1){ |
|
$args = func_get_args(); |
|
return $wpdb->get_row(call_user_func_array(array($wpdb, 'prepare'), $args), ARRAY_A); |
|
} else { |
|
return $wpdb->get_row(func_get_arg(0), ARRAY_A); |
|
} |
|
} |
|
public function queryWrite(){ |
|
global $wpdb; |
|
if(func_num_args() > 1){ |
|
$args = func_get_args(); |
|
return $wpdb->query(call_user_func_array(array($wpdb, 'prepare'), $args)); |
|
} else { |
|
return $wpdb->query(func_get_arg(0)); |
|
} |
|
} |
|
public function flush(){ //Clear cache |
|
global $wpdb; |
|
$wpdb->flush(); |
|
} |
|
public function querySelect(){ //sprintfString, arguments :: always returns array() and will be empty if no results. |
|
global $wpdb; |
|
if(func_num_args() > 1){ |
|
$args = func_get_args(); |
|
return $wpdb->get_results(call_user_func_array(array($wpdb, 'prepare'), $args), ARRAY_A); |
|
} else { |
|
return $wpdb->get_results(func_get_arg(0), ARRAY_A); |
|
} |
|
} |
|
public function queryWriteIgnoreError(){ //sprintfString, arguments |
|
global $wpdb; |
|
$oldSuppress = $wpdb->suppress_errors(true); |
|
$args = func_get_args(); |
|
call_user_func_array(array($this, 'queryWrite'), $args); |
|
$wpdb->suppress_errors($oldSuppress); |
|
} |
|
public function columnExists($table, $col){ |
|
$table = wfDB::networkTable($table); |
|
$q = $this->querySelect("desc $table"); |
|
foreach($q as $row){ |
|
if($row['Field'] == $col){ |
|
return true; |
|
} |
|
} |
|
return false; |
|
} |
|
public function dropColumn($table, $col){ |
|
$table = wfDB::networkTable($table); |
|
$this->queryWrite("alter table $table drop column $col"); |
|
} |
|
public function createKeyIfNotExists($table, $col, $keyName){ |
|
$table = wfDB::networkTable($table); |
|
|
|
$exists = $this->querySingle(<<<SQL |
|
SELECT TABLE_NAME FROM information_schema.TABLES |
|
WHERE TABLE_SCHEMA=DATABASE() |
|
AND TABLE_NAME='%s' |
|
SQL |
|
, $table); |
|
$keyFound = false; |
|
if($exists){ |
|
$q = $this->querySelect("show keys from $table"); |
|
foreach($q as $row){ |
|
if($row['Key_name'] == $keyName){ |
|
$keyFound = true; |
|
} |
|
} |
|
} |
|
if(! $keyFound){ |
|
$this->queryWrite("alter table $table add KEY $keyName($col)"); |
|
} |
|
} |
|
public function getMaxAllowedPacketBytes(){ |
|
$rec = $this->querySingleRec("show variables like 'max_allowed_packet'"); |
|
return intval($rec['Value']); |
|
} |
|
public function getMaxLongDataSizeBytes() { |
|
$rec = $this->querySingleRec("show variables like 'max_long_data_size'"); |
|
return $rec['Value']; |
|
} |
|
public function truncate($table){ //Ensures everything is deleted if user is using MySQL >= 5.1.16 and does not have "drop" privileges |
|
$this->queryWrite("truncate table $table"); |
|
$this->queryWrite("delete from $table"); |
|
} |
|
public function getLastError(){ |
|
global $wpdb; |
|
return $wpdb->last_error; |
|
} |
|
public function realEscape($str){ |
|
global $wpdb; |
|
return $wpdb->_real_escape($str); |
|
} |
|
} |
|
|
|
abstract class wfModel { |
|
|
|
private $data; |
|
private $db; |
|
private $dirty = false; |
|
|
|
/** |
|
* Column name of the primary key field. |
|
* |
|
* @return string |
|
*/ |
|
abstract public function getIDColumn(); |
|
|
|
/** |
|
* Table name. |
|
* |
|
* @return mixed |
|
*/ |
|
abstract public function getTable(); |
|
|
|
/** |
|
* Checks if this is a valid column in the table before setting data on the model. |
|
* |
|
* @param string $column |
|
* @return boolean |
|
*/ |
|
abstract public function hasColumn($column); |
|
|
|
/** |
|
* wfModel constructor. |
|
* @param array|int|string $data |
|
*/ |
|
public function __construct($data = array()) { |
|
if (is_array($data) || is_object($data)) { |
|
$this->setData($data); |
|
} else if (is_numeric($data)) { |
|
$this->fetchByID($data); |
|
} |
|
} |
|
|
|
public function fetchByID($id) { |
|
$id = absint($id); |
|
$data = $this->getDB()->get_row($this->getDB()->prepare('SELECT * FROM ' . $this->getTable() . |
|
' WHERE ' . $this->getIDColumn() . ' = %d', $id)); |
|
if ($data) { |
|
$this->setData($data); |
|
return true; |
|
} |
|
return false; |
|
} |
|
|
|
/** |
|
* @return bool |
|
*/ |
|
public function save() { |
|
if (!$this->dirty) { |
|
return false; |
|
} |
|
$this->dirty = ($this->getPrimaryKey() ? $this->update() : $this->insert()) === false; |
|
return !$this->dirty; |
|
} |
|
|
|
/** |
|
* @return false|int |
|
*/ |
|
public function insert() { |
|
$data = $this->getData(); |
|
unset($data[$this->getPrimaryKey()]); |
|
$rowsAffected = $this->getDB()->insert($this->getTable(), $data); |
|
$this->setPrimaryKey($this->getDB()->insert_id); |
|
return $rowsAffected; |
|
} |
|
|
|
/** |
|
* @return false|int |
|
*/ |
|
public function update() { |
|
return $this->getDB()->update($this->getTable(), $this->getData(), array( |
|
$this->getIDColumn() => $this->getPrimaryKey(), |
|
)); |
|
} |
|
|
|
/** |
|
* @param $name string |
|
* @return mixed |
|
*/ |
|
public function __get($name) { |
|
if (!$this->hasColumn($name)) { |
|
return null; |
|
} |
|
return array_key_exists($name, $this->data) ? $this->data[$name] : null; |
|
} |
|
|
|
/** |
|
* @param $name string |
|
* @param $value mixed |
|
*/ |
|
public function __set($name, $value) { |
|
if (!$this->hasColumn($name)) { |
|
return; |
|
} |
|
$this->data[$name] = $value; |
|
$this->dirty = true; |
|
} |
|
|
|
/** |
|
* @return array |
|
*/ |
|
public function getData() { |
|
return $this->data; |
|
} |
|
|
|
/** |
|
* @param array $data |
|
* @param bool $flagDirty |
|
*/ |
|
public function setData($data, $flagDirty = true) { |
|
$this->data = array(); |
|
foreach ($data as $column => $value) { |
|
if ($this->hasColumn($column)) { |
|
$this->data[$column] = $value; |
|
$this->dirty = (bool) $flagDirty; |
|
} |
|
} |
|
} |
|
|
|
/** |
|
* @return wpdb |
|
*/ |
|
public function getDB() { |
|
if ($this->db === null) { |
|
global $wpdb; |
|
$this->db = $wpdb; |
|
} |
|
return $this->db; |
|
} |
|
|
|
/** |
|
* @param wpdb $db |
|
*/ |
|
public function setDB($db) { |
|
$this->db = $db; |
|
} |
|
|
|
/** |
|
* @return int |
|
*/ |
|
public function getPrimaryKey() { |
|
return $this->{$this->getIDColumn()}; |
|
} |
|
|
|
/** |
|
* @param int $value |
|
*/ |
|
public function setPrimaryKey($value) { |
|
$this->{$this->getIDColumn()} = $value; |
|
} |
|
}
|
|
|