*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*/
class DB_Sql {
/* public: connection parameters */
public $Host = "";
public $Database = "";
public $User = "";
public $Password = "";
/* public: configuration parameters */
public $Auto_Free = 1; ## Set to 1 for automatic mysql_free_result()
public $Debug = 0; ## Set to 1 for debugging messages.
public $Halt_On_Error = "yes"; ## "yes" (halt with message), "no" (ignore errors quietly), "report" (ignore errror, but spit a warning)
/* public: result array and current row number */
public $Record = [];
public $Row;
public $RowCount;
public $ColumnCount;
/* public: current error number and error text */
public $Errno = 0;
public $Error = "";
protected $pdo;
protected $resultSet;
/* public: constructor */
function __construct($query = "") {
$this->pdo = DBManager::get();
$this->query($query);
}
function link_id() {
return TRUE;
}
function query_id() {
return !is_null($this->resultSet);
}
/* public: discard the query result */
function free() {
$this->resultSet = NULL;
$this->Errno = NULL;
$this->Error = NULL;
$this->Row = 0;
$this->RowCount = null;
$this->ColumnCount = null;
}
/* public: perform a query */
function query($Query_String) {
$Query_String = trim($Query_String);
if ($Query_String == "") {
return 0;
}
# New query, discard previous result.
$this->free();
if ($this->Debug) {
printf("Debug: query = %s
\n", $Query_String);
}
if(mb_stripos($Query_String, 'select') === 0 || mb_stripos($Query_String, 'show') === 0){
$this->resultSet = $this->pdo->query($Query_String);
# Will return nada if it fails. That's fine.
return $this->resultSet;
} else {
$this->RowCount = $this->pdo->exec($Query_String);
return $this->RowCount;
}
}
/* public: walk result set */
function next_record() {
if (!$this->resultSet) {
//$this->halt("next_record called with no query pending.");
return 0;
}
$this->Record = $this->resultSet->fetch();
$this->Row += 1;
/*
$this->Errno = $this->resultSet->errorCode();
$this->Error = $this->resultSet->errorInfo();
*/
$stat = is_array($this->Record);
if ($this->Row == $this->num_rows()) {
$this->ColumnCount = $this->resultSet->ColumnCount();
$this->resultSet = null;
}
return $stat;
}
/* public: evaluate the result (size, width) */
function affected_rows() {
return $this->num_rows();
}
function num_rows() {
return (!is_null($this->RowCount) ? $this->RowCount : ($this->resultSet ? ($this->RowCount = $this->resultSet->rowCount()) : FALSE));
}
function num_fields() {
return (!is_null($this->ColumnCount) ? $this->ColumnCount : ($this->resultSet ? ($this->ColumnCount = $this->resultSet->ColumnCount()) : FALSE));
}
/* public: shorthand notation */
function nf() {
return $this->num_rows();
}
function np() {
print $this->num_rows();
}
function f($Name) {
return $this->Record[$Name];
}
function p($Name) {
print $this->Record[$Name];
}
/* public: return table metadata */
function metadata($table='',$full=false) {
$count = 0;
$id = 0;
$res = [];
/*
* Due to compatibility problems with Table we changed the behavior
* of metadata();
* depending on $full, metadata returns the following values:
*
* - full is false (default):
* $result[]:
* [0]["table"] table name
* [0]["name"] field name
* [0]["type"] field type
* [0]["len"] field length
* [0]["flags"] field flags
*
* - full is true
* $result[]:
* ["num_fields"] number of metadata records
* [0]["table"] table name
* [0]["name"] field name
* [0]["type"] field type
* [0]["len"] field length
* [0]["flags"] field flags
* ["meta"][field name] index of field named "field name"
* The last one is used, if you have a field name, but no index.
* Test: if (isset($result['meta']['myfield'])) { ...
*/
// if no $table specified, assume that we are working with a query
// result
if ($table) {
throw new Exception('Not yet implemented.');
$this->connect();
$id = @mysql_list_fields($this->Database, $table);
if (!$id)
$this->halt("Metadata query failed.");
} else {
if (is_null($this->resultSet))
$this->halt("No query specified.");
}
$count = $this->resultSet->ColumnCount();
// made this IF due to performance (one if is faster than $count if's)
if (!$full) {
for ($i = 0; $i < $count; $i++) {
$meta = $this->resultSet->getColumnMeta($i);
$res[$i]["table"] = $meta['table'];
$res[$i]["name"] = $meta['name'];
$res[$i]["type"] = $meta['native_type'];
$res[$i]["len"] = $meta['len'];
$res[$i]["flags"] = $meta['flags'];
}
} else { // full
throw new Exception('Not yet implemented.');
$res["num_fields"]= $count;
for ($i=0; $i<$count; $i++) {
$res[$i]["table"] = @mysql_field_table ($id, $i);
$res[$i]["name"] = @mysql_field_name ($id, $i);
$res[$i]["type"] = @mysql_field_type ($id, $i);
$res[$i]["len"] = @mysql_field_len ($id, $i);
$res[$i]["flags"] = @mysql_field_flags ($id, $i);
$res["meta"][$res[$i]["name"]] = $i;
}
}
// free the result only if we were called on a table
if ($table) {
throw new Exception('Not yet implemented.');
@mysql_free_result($id);
}
return $res;
}
/* private: error handling */
function halt($msg) {
if ($this->Halt_On_Error == "no")
return;
$this->haltmsg($msg);
if ($this->Halt_On_Error != "report")
die("Session halted.");
}
function haltmsg($msg) {
printf("Database error: %s
\n", $msg);
printf("MySQL Error: %s (%s)
\n",
$this->Errno,
join(':',$this->Error));
}
/* public: perform a query using format string*/
function queryf($format /* , .. */) {
// get args
$args = func_get_args();
// get format string
$format = array_shift($args);
// do something
return $this->query(vsprintf($format, $args));
}
/**
* perform a query with caching directive for mysql
* @param string $Query_String
* @return Resultset | int
*/
public function cache_query($Query_String) {
trigger_error(__CLASS__ . ' no longer supports query caching - use query() instead.', E_USER_DEPRECATED);
return $this->query($Query_String);
}
}