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

<?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;
}
}