/* public: connection parameters */ var $Host = ""; var $Database = ""; var $User = ""; var $Password = "";
/* public: configuration parameters */ var $Auto_Free = 1; ## Set to 1 for automatic mysql_free_result() var $Debug = 0; ## Set to 1 for debugging messages. var $Halt_On_Error = "yes"; ## "yes" (halt with message), "no" (ignore errors quietly), "report" (ignore errror, but spit a warning) var $PConnect = 0; ## Set to 1 to use persistent database connections var $Seq_Table = "db_sequence";
/* public: result array and current row number */ var $Record = array(); var $Row;
/* public: current error number and error text */ var $Errno = 0; var $Error = "";
/* public: this is an api revision, not a CVS revision. */ var $type = "mysql"; //var $revision = "1.2";
/* private: link and query handles */ var $Link_ID = 0; var $Query_ID = 0;
var $locked = false; ## set to true while we have a lock
/* public: constructor */ function DB_Sql() { $this->query($query); }
/* public: some trivial reporting */ function link_id() { return $this->Link_ID; }
if (!@mysql_select_db($Database,$this->Link_ID)) { $this->halt("cannot use database ".$Database); return 0; } }
return $this->Link_ID; }
/* public: discard the query result */ function free() { @mysql_free_result($this->Query_ID); $this->Query_ID = 0; }
/* public: perform a query */ function query($Query_String) { /* No empty queries, please, since PHP4 chokes on them. */ if ($Query_String == "") /* The empty query string is passed on from the constructor, * when calling the class without a query, e.g. in situations * like these: "$db = new DB_Sql_Subclass;" */ return 0;
if (!$this->connect()) { return 0; /* we already complained in connect() about that. */ };
# New query, discard previous result. if ($this->Query_ID) { $this->free(); }
if ($this->Debug) printf("Debug: query = %s<br>
", $Query_String);
/* public: position in result set */ function seek($pos = 0) { $status = @mysql_data_seek($this->Query_ID, $pos); if ($status) $this->Row = $pos; else { $this->halt("seek($pos) failed: result has ".$this->num_rows()." rows.");
/* half assed attempt to save the day, * but do not consider this documented or even * desireable behaviour. */ @mysql_data_seek($this->Query_ID, $this->num_rows()); $this->Row = $this->num_rows(); return 0; }
function f($Name) { if (isset($this->Record[$Name])) { return $this->Record[$Name]; } }
function p($Name) { if (isset($this->Record[$Name])) { print $this->Record[$Name]; } }
/* public: sequence numbers */ function nextid($seq_name) { /* if no current lock, lock sequence table */ if(!$this->locked) { if($this->lock($this->Seq_Table)) { $locked = true; } else { $this->halt("cannot lock ".$this->Seq_Table." - has it been created?"); return 0; } }
/* get sequence number and increment */ $q = sprintf("select nextid from %s where seq_name = "%s"", $this->Seq_Table, $seq_name); if(!$this->query($q)) { $this->halt("query failed in nextid: ".$q); return 0; }
/* No current value, make one */ if(!$this->next_record()) { $currentid = 0; $q = sprintf("insert into %s values("%s", %s)", $this->Seq_Table, $seq_name, $currentid); if(!$this->query($q)) { $this->halt("query failed in nextid: ".$q); return 0; } } else { $currentid = $this->f("nextid"); } $nextid = $currentid + 1; $q = sprintf("update %s set nextid = "%s" where seq_name = "%s"", $this->Seq_Table, $nextid, $seq_name); if(!$this->query($q)) { $this->halt("query failed in nextid: ".$q); return 0; }
/* if nextid() locked the sequence table, unlock it */ if($locked) { $this->unlock(); }
/* * 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" * This last one could be 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) { $this->connect(); $id = @mysql_list_fields($this->Database, $table); if (!$id) { $this->halt("Metadata query failed."); return false; } } else { $id = $this->Query_ID; if (!$id) { $this->halt("No query specified."); return false; } }
$count = @mysql_num_fields($id);
// made this IF due to performance (one if is faster than $count if"s) if (!$full) { 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); } } else { // full $res["num_fields"]= $count;