summaryrefslogtreecommitdiff
path: root/db.class
diff options
context:
space:
mode:
Diffstat (limited to 'db.class')
-rw-r--r--db.class250
1 files changed, 250 insertions, 0 deletions
diff --git a/db.class b/db.class
new file mode 100644
index 0000000..f94861a
--- /dev/null
+++ b/db.class
@@ -0,0 +1,250 @@
+<?php
+/*
+** $Id$
+**
+** ITools - the Internet Tools Library
+**
+** Copyright (C) 1995-2003 by the ITools Authors.
+** This program is free software; you can redistribute it and/or
+** modify it under the terms of either the GNU General Public License
+** or the GNU Lesser General Public License, as published by the Free
+** Software Foundation. See http://www.gnu.org/licenses/ for details.
+**
+** it_db.class - Generic Database class, currently using mysql.
+**
+** This tries to be as efficient as possible by maintaining
+** persistent database connections.
+*/
+
+
+/**
+ * Functions to handle SQL databases
+ * @see it_db_table, it_db_record
+ */
+class it_db
+{
+ /* public */
+ var $host; /* Database host */
+ var $host_update=''; /* Optional database host for updates */
+ var $name; /* Name of database */
+ var $numtables; /* Number of tables in databasee or 0 if not known */
+ var $tablenames = array(); /* Array(0..$numtables) of table names */
+
+ /* private */
+ var $link; /* MySQL Link Identifier */
+ var $username; /* MySQL username (if $updatehost) */
+ var $password; /* MySQL password (if $updatehost) */
+
+/**
+ * Constructor: connect to MySQL server and select database
+ * @param $databasename name of the database to select or empty for default
+ * @param $username username to connect with
+ * @param $password password to connect with
+ * @param $host Optional name of the host to connect to
+ * @param $host_update Optional name of the host for updates (writes)
+ */
+function it_db($databasename, $username, $password, $host='localhost', $host_update='')
+{
+ if (empty($databasename))
+ $databasename = strtr(ereg_replace('^www.', '', strtolower(ereg_replace(':.*$', '', getenv('HTTP_HOST')))), '.', '_');
+
+ if ($this->link = @mysql_connect($host, $username, $password, true))
+ {
+ if (mysql_select_db($databasename, $this->link))
+ {
+ $this->host = $host;
+ $this->name = $databasename;
+ }
+ else
+ internal_error("Can't select database \"$databasename\" on host \"$host\".");
+ }
+ else
+ internal_error("Can't connect to database server \"$host\" as user \"$username\".");
+
+ if ($host_update)
+ {
+ $this->host_update = $host_update;
+ $this->username = $username;
+ $this->password = $password;
+ }
+}
+
+
+/**
+ * Perform an SQL query.
+ * @see ::safe_sql_query, mysql_query
+ * @param $sql SQL query
+ * @return SQL handle or false in case of failure
+ */
+function sql_query($sql)
+{
+ debug("it_db::sql_query($sql) on {$this->host}", 5);
+
+ /*
+ ** If we have a special update host, and an update operation is to be
+ ** performed, we switch to this host. And we stay forever and ever and ever...
+ */
+ if ($this->host_update && eregi('^(UPDATE|INSERT|REPLACE|DELETE|ALTER) ', $sql))
+ {
+ /*debug('it_db::sql_query(): switching to update host "'.$this->host_update.'"', 3); */
+ if ($this->link = @mysql_connect($this->host_update, $this->username, $this->password, true))
+ {
+ if (mysql_select_db($this->name, $this->link))
+ $this->host = $this->host_update;
+ else
+ internal_error('Error selecting update database "'.$this->name.'" on host "'.$this->host_update.'".');
+
+ $this->host_update='';
+ }
+ else
+ internal_error('Error connecting to update database server "'.$this->host_update.'" as user "'.$this->username.'".');
+ }
+
+ return mysql_query($sql, $this->link);
+}
+
+
+/**
+ * Perform an SQL query. If the query fails, issue an error message
+ * and terminate program execution. No matching rows does not mean failure.
+ * @see ::sql_query, mysql_query
+ * @param $sql SQL query
+ * @return SQL handle
+ */
+function safe_sql_query($sql)
+{
+ /* debug("it_db::safe_sql_query($sql)", 4); */
+ if ($result = $this->sql_query($sql))
+ return $result;
+ else
+ {
+ if ($this->errno() == 1062) /* Duplicate entry */
+ return 0;
+
+ fail('SQL-Query db "'.$this->name.'" host "'.$this->host."\" failed: \"$sql\":<br>".$this->error().' ('.$this->errno().')');
+ }
+}
+
+
+/**
+ * Free resources used by SQL handle
+ * @see mysql_free_result
+ * @param $handle SQL handle
+ * @return
+ */
+function free($handle)
+{
+ return mysql_free_result($handle);
+}
+
+
+/**
+ * Fetch a row as an array
+ * @see mysql_fetch_array
+ * @param $handle SQL handle
+ * @return numeric & associative array with contents of table row
+ */
+function fetch_array($handle)
+{
+ return mysql_fetch_array($handle);
+}
+
+
+/**
+ * Fetch a row as an associative array
+ * @see mysql_fetch_array
+ * @param $handle SQL handle
+ * @return associative array with contents of table row
+ */
+function fetch_assoc($handle)
+{
+ return mysql_fetch_assoc($handle);
+}
+
+
+/**
+ * Return number of rows of a query
+ * @see mysql_num_rows
+ * @param $handle SQL handle
+ * @return number of rows the query returned
+ */
+function num_rows($handle)
+{
+ return mysql_num_rows($handle);
+}
+
+
+/**
+ * Return number of found rows of a limited query that had SQL_COUNT_FOUND_ROWS set
+ * @return number of rows the query would have returned without LIMIT
+ */
+function found_rows()
+{
+ list($count) = mysql_fetch_row($this->safe_sql_query('SELECT FOUND_ROWS()'));
+ return intval($count);
+}
+
+
+/* Internal: get information about tables */
+function _get_table_info()
+{
+ if ($this->numtables > 0) /* Already done! */
+ return;
+
+ if(($tables = mysql_list_tables($this->name,$this->link)) >= 0)
+ {
+ $this->numtables = mysql_numrows($tables);
+ for ($i=0; $i < $this->numtables; ++$i)
+ {
+ $name = mysql_tablename($tables, $i);
+ $this->tablenames[$i] = $name;
+ }
+ }
+ else internal_error("mysql_list_tables($this->name,$this->link) failed.");
+}
+
+
+/**
+ * Return a list of all table names of this database
+ * @return array with tablenames of this Database
+ */
+function table_names()
+{
+ $this->_get_table_info();
+ return $this->tablenames;
+}
+
+
+/**
+ * Return number of tables in this database
+ */
+function num_tables()
+{
+ $this->_get_table_info();
+ return $this->numtables;
+}
+
+
+/**
+ * Return last error number
+ * @see ::sql_query, ::safe_sql_query, mysql_errno
+ * @return last mySQL error number
+ */
+function errno()
+{
+ return mysql_errno($this->link);
+}
+
+
+/**
+ * Return last error string
+ * @see ::sql_query, ::safe_sql_query, mysql_error
+ * @return last mySQL error message
+ */
+function error()
+{
+ return mysql_error($this->link);
+}
+
+} /* End class it_db */
+?>