<?php

/**
 * @started by Emil Novak
 * @author sverde1
 * @version 0.0.4
 * @filesource
 * @license GPL
 *
 * This class was modified by sverde1:
 * - serval modifications to make it work :P
 * - also added function queryCount()
 * - added class MySQL_OOP
 * - added class PEAR_MySQLi
 * - added class SQLite for SQLite support
 * - added class SQLite_OPP for oject SQLite support
 * - added feature to return native errors
 *
 * Class for connecting with MySQL server in different ways
 * @example ../examples/CyberPHP-DB_example.php Example with persistent connection to MySQL server
 **/
interface DBase
{
    
/**
     * @access public
     * @param string $host MySQL database server's address
     * @param string $user MySQL database username
     * @param string $pass MySQL database password
     * @param string $database MySQL database name
     * @param bool $persistent Use persistent connection or no
     * @param int $port MySQL connection port
     * @return resource
     * @see DBase::close()
     **/
    
public function connect($host$user null$pass null$database null$persistent false$port 3306);

    
/**
     * @access public
     * @return string
     **/
    
public function getError();

    
/**
     * @access public
     * @return string
     **/
    
public function getDbError();

    
/**
     * @access public
     * @param string $query Query to be sent to server
     * @return resource
     **/
    
public function query($query);

    
/**
     * @access public
     * @return int
     **/
    
public function queryCount();

    
/**
     * @access public
     * @param string $query Query to be escaped by server
     * @return string
     **/
    
public function escapeString($string);

    
/**
     * @access public
     * @param string $query Query to be escaped by server
     * @return string
     **/
    
public function escapeRealString($string);

    
/**
     * @access public
     * @param resource $result Result resource which you get from MySQL::query()
     * @return int
     * @see MySQL::query()
     **/
    
public function numRows($result);

    
/**
     * @access public
     * @param resource $result Result resource which you get from MySQL::query()
     * @return int
     **/
    
public function affectedRows($result);

    
/**
     * @access public
     * @param resource $result Result resource which you get from MySQL::query()
     * @return array
     **/
    
public function fetchRow($result);

    
/**
     * @access public
     * @param resource $result Result resource which you get from MySQL::query()
     * @return array
     **/
    
public function fetchAssoc($result);

    
/**
     * @access public
     * @param resource $result Result resource which you get from MySQL::query()
     * @return array
     **/
    
public function fetchArray($result);

    
/**
     * @access public
     * @param resource $result Result resource which you get from MySQL::query()
     * @return bool
     **/
    
public function free($result);

    
/**
     * @access public
     * @return bool
     **/
    
public function close();
}

/**
 * Class for connecting to MySQL databases < 4.1
 * @filesource
 **/
class MySQL implements DBase
{

    
/**
     * @access private
     * @var resource
     **/
    
private $db;

    
/**
     * @access private
     * @var string
     **/
    
private $error;

    
/**
     * @access private
     * @var string
     **/
    
private $dbase_error;
    
/**
     * @access private
     * @var int
     **/
    
private $query_count 0;

    
/**
     * @access public
     * @param string $host MySQL database server's address
     * @param string $user MySQL database username
     * @param string $pass MySQL database password
     * @param string $database MySQL database name
     * @param bool $persistent Use persistent connection or no
     * @param int $port MySQL connection port
     * @return resource
     * @see MySQL::close()
     **/
    
public function connect($host$user null$pass null$database null$persistent false$port 3306)
    {
        if(
$persistent == false)
        {
            
$this->db mysql_connect($host$user$pass);
            if(!
$this->db)
            {
                
$this->error .= "CyberPHP::DBase can't connect to MySQL server!\n";
                
$this->dbase_error .= "Could not connect: " mysql_error() . "\n";
            }
        }
        else
        {
            
$this->db mysql_pconnect($host$user$pass);
            if(!
$this-db)
            {
                
$this->error .= "CyberPHP::DBase can't connect to MySQL server!\n";
                
$this->dbase_error .= "Could not connect: " mysql_error() . "\n";
            }
        }

        if(!
mysql_select_db($database))
        {
            
$this->error .= "CyberPHP::DBase can't select MySQL database!\n";
            
$this->dbase_error .= "Can't use $database: " mysql_error() . "\n";
        }

        if(empty(
$this->error) && empty($this->dbase_error))
        {
            return 
false;
        }
        else
        {
            return 
true;
        }
    }

    
/**
     * @access public
     * @return string
     **/
    
public function getError()
    {
        return 
$this->error;
    }

    
/**
     * @access public
     * @return string
     **/
    
public function getDbError()
    {
        return 
$this->dbase_error;
    }

    
/**
     * @access public
     * @param string $query Query to be sent to server
     * @return resource
     **/
    
public function query($query)
    {
        
$this->query_count++;
        return 
mysql_query($query$this->db);
    }

    
/**
     * @access public
     * @return int
     **/
    
public function queryCount()
    {
        return 
$this->query_count;
    }

    
/**
     * @access public
     * @param string $query Query to be escaped by server
     * @return string
     **/
    
public function escapeString($string)
    {
        return 
mysql_escape_string($string);
    }

    
/**
     * @access public
     * @param string $query Query to be escaped by server
     * @return string
     **/
    
public function escapeRealString($string)
    {
        return 
mysql_real_escape_string($string$this->db);
    }

    
/**
     * @access public
     * @param resource $result Result resource which you get from MySQL::query()
     * @return int
     * @see MySQL::query()
     **/
    
public function numRows($result)
    {
        return 
mysql_num_rows($result);
    }

    
/**
     * @access public
     * @param resource $result Result resource which you get from MySQL::query()
     * @return int
     **/
    
public function affectedRows($result)
    {
        return 
mysql_affected_rows($result);
    }

    
/**
     * @access public
     * @param resource $result Result resource which you get from MySQL::query()
     * @return array
     **/
    
public function fetchAssoc($result)
    {
        return 
mysql_fetch_assoc($result);
    }

    
/**
     * @access public
     * @param resource $result Result resource which you get from MySQL::query()
     * @return array
     **/
    
public function fetchArray($result)
    {
        return 
mysql_fetch_array($result);
    }

    
/**
     * @access public
     * @param resource $result Result resource which you get from MySQL::query()
     * @return array
     **/
    
public function fetchRow($result)
    {
        return 
mysql_fetch_row($result);
    }

    
/**
     * @access public
     * @param resource $result Result resource which you get from MySQL::query()
     * @return bool
     **/
    
public function free($result)
    {
        return 
mysql_free_result($result);
    }

    
/**
     * @access public
     * @return bool
     **/
    
public function close()
    {
        
mysql_close($this->db);
        
$this->db NULL;

        return 
true;
    }
}

/**
 * Class for connecting to MySQL databases => 4.1 in API way
 * @filesource
 **/

class MySQLi_API implements DBase
{

    
/**
     * @access private
     * @var resource
     **/
    
private $db;

    
/**
     * @access private
     * @var string
     **/
    
private $error;

    
/**
     * @access private
     * @var string
     **/
    
private $dbase_error;

    
/**
     * @access private
     * @var int
     **/
    
private $query_count 0;

    
/**
     * @access public
     * @param string $host MySQL database server's address
     * @param string $user MySQL database username
     * @param string $pass MySQL database password
     * @param string $database MySQL database name
     * @param bool $persistent Use persistent connection or no
     * @param int $port MySQL connection port
     * @return resource
     * @see MySQLi_API::close()
     **/
    
public function connect($host$user null$pass null$database null$persistent false$port 3306)
    {
        if(
$persistent == false)
        {
            if(!
$this->db mysqli_connect($host$user$pass))
            {
                
$this->error .= "CyberPHP::DBase can't connect to MySQL server!\n";
                
$this->dbase_error .= "Connect failed: " mysqli_connect_error() . "\n";
            }
        }
        else
        {
            if(!
$this->db mysqli_pconnect($host$user$pass))
            {
                
$this->error .= "CyberPHP::DBase can't connect to MySQL server!\n";
                
$this->dbase_error .= "Connect failed: " mysqli_connect_error() . "\n";
            }
        }

        if(!
mysqli_select_db($this->db$database))
        {
            
$this->error .= "CyberPHP::DBase can't select MySQL database!\n";
            
$this->dbase_error .= "Can't use $database: " mysqli_error() . "\n";
        }

        if(empty(
$this->error) && empty($this->dbase_error))
        {
            return 
false;
        }
        else
        {
            return 
true;
        }
    }

    
/**
     * @access public
     * @return string
     **/
    
public function getError()
    {
        return 
$this->error;
    }

    
/**
     * @access public
     * @return string
     **/
    
public function getDbError()
    {
        return 
$this->dbase_error;
    }

    
/**
     * @access public
     * @param string $query Query to be sent to server
     * @return resource
     **/
    
public function query($query)
    {
        
$this->query_count++;
        return 
mysqli_query($this->db$query);
    }

    
/**
     * @access public
     * @return int
     **/
    
public function queryCount()
    {
        return 
$this->query_count;
    }

    
/**
     * @access public
     * @param string $query Query to be escaped by server
     * @return string
     **/
    
public function escapeString($string)
    {
        return 
mysqli_escape_string($this->db$string);
    }

    
/**
     * @access public
     * @param string $query Query to be escaped by server
     * @return string
     **/
    
public function escapeRealString($string)
    {
        return 
mysql_real_escape_string($this->db$string);
    }

    
/**
     * @access public
     * @param resource $result Result resource which you get from MySQLi::query()
     * @return int
     * @see MySQLi_API::query()
     **/
    
public function numRows($result)
    {
        return 
mysqli_num_rows($result);
    }

    
/**
     * @access public
     * @param resource $result Result resource which you get from MySQLi::query()
     * @return int
     **/
    
public function affectedRows($result)
    {
        return 
mysqli_affected_rows($this->db);
    }

    
/**
     * @access public
     * @param resource $result Result resource which you get from MySQLi::query()
     * @return array
     **/
    
public function fetchAssoc($result)
    {
        return 
mysqli_fetch_assoc($result);
    }

    
/**
     * @access public
     * @param resource $result Result resource which you get from MySQL::query()
     * @return array
     **/
    
public function fetchArray($result)
    {
        return 
mysqli_fetch_array($result);
    }

    
/**
     * @access public
     * @param resource $result Result resource which you get from MySQLi::query()
     * @return array
     **/
    
public function fetchRow($result)
    {
        return 
mysqli_fetch_row($result);
    }

    
/**
     * @access public
     * @param resource $result Result resource which you get from MySQLi::query()
     * @return bool
     **/
    
public function free($result)
    {
        return 
mysqli_free_result($result);
    }

    
/**
     * @access public
     * @return bool
     **/
    
public function close()
    {
        
mysqli_close($this->db);
        
$this->db NULL;

        return 
true;
    }
}

/**
 * Class for connecting to MySQL databases => 4.1 in OOP way
 * @filesource
 **/
class MySQLi_OOP implements DBase
{

    
/**
     * @access private
     * @var resource
     **/
    
private $db;

    
/**
     * @access private
     * @var string
     **/
    
private $error;

    
/**
     * @access private
     * @var string
     **/
    
private $dbase_error;

    
/**
     * @access private
     * @var int
     **/
    
private $query_count 0;

    
/**
     * @access public
     * @param string $host MySQL database server's address
     * @param string $user MySQL database username
     * @param string $pass MySQL database password
     * @param string $database MySQL database name
     * @param bool $persistent Use persistent connection or no
     * @param int $port MySQL connection port
     * @return resource
     * @see MySQLi_OOP::close()
     **/
    
public function connect($host$user null$pass null$database null$persistent false$port 3306)
    {
        if(!
$this->db = new mysqli($host$user$pass))
        {
            
$this->error .= "CyberPHP::DBase can't connect to MySQL server!\n";
            
$this->dbase_error .= "Connect failed: " mysqli_connect_error() . "\n";
        }

        if(!
$this->db->select_db($database))
        {
            
$this->error .= "CyberPHP::DBase can't select MySQL database!\n";
            
$this->dbase_error .= "Connect failed: " mysqli_connect_error() . "\n";
        }

        if(empty(
$this->error) && empty($this->dbase_error))
        {
            return 
false;
        }
        else
        {
            return 
true;
        }
    }

    
/**
     * @access public
     * @return string
     **/
    
public function getError()
    {
        return 
$this->error;
    }

    
/**
     * @access public
     * @return string
     **/
    
public function getDbError()
    {
        return 
$this->dbase_error;
    }

    
/**
     * @access public
     * @param string $query Query to be sent to server
     * @return resource
     **/
    
public function query($query)
    {
        
$this->query_count++;
        return 
$this->db->query($query);
    }

    
/**
     * @access public
     * @return int
     **/
    
public function queryCount()
    {
        return 
$this->query_count;
    }

    
/**
     * @access public
     * @param string $query Query to be escaped by server
     * @return string
     **/
    
public function escapeString($string)
    {
        return 
$this->db->escape_string($string);
    }

    
/**
     * @access public
     * @param string $query Query to be escaped by server
     * @return string
     **/
    
public function escapeRealString($string)
    {
        return 
$this->db->real_escape_string($string);
    }

    
/**
     * @access public
     * @param resource $result Result resource which you get from MySQLi::query()
     * @return int
     * @see MySQLi_OOP::query()
     **/
    
public function numRows($result)
    {
        return 
$result->num_rows;
    }

    
/**
     * @access public
     * @param resource $result Result resource which you get from MySQLi::query()
     * @return int
     **/
    
public function affectedRows($result)
    {
        return 
$this->db->affected_rows;
    }

    
/**
     * @access public
     * @param resource $result Result resource which you get from MySQLi::query()
     * @return array
     **/
    
public function fetchAssoc($result)
    {
        return 
$result->fetch_assoc();
    }

    
/**
     * @access public
     * @param resource $result Result resource which you get from MySQL::query()
     * @return array
     **/
    
public function fetchArray($result)
    {
        return 
$result->fetch_array();
    }

    
/**
     * @access public
     * @param resource $result Result resource which you get from MySQLi::query()
     * @return array
     **/
    
public function fetchRow($result)
    {
        return 
$result->fetch_row();
    }

    
/**
     * @access public
     * @param resource $result Result resource which you get from MySQLi::query()
     * @return bool
     **/
    
public function free($result)
    {
        return 
$result->free_result();
    }

    
/**
     * @access public
     * @return bool
     **/
    
public function close()
    {
        
$this->db->close();
        
$this->db NULL;

        return 
true;
    }
}

/**
 * Class for connecting to MySQL < 4.1 databases with PEAR package DB
 * @see http://pear.php.net/package/DB
 * @filesource
 **/
class PEAR_MySQL implements DBase
{

    
/**
     * @access private
     * @var resource
     **/
    
private $db;

    
/**
     * @access private
     * @var string
     **/
    
private $error;

    
/**
     * @access private
     * @var string
     **/
    
private $dbase_error;

    
/**
     * @access private
     * @var int
     **/
    
private $query_count 0;

    
/**
     * @access public
     * @param string $host MySQL database server's address
     * @param string $user MySQL database username
     * @param string $pass MySQL database password
     * @param string $database MySQL database name
     * @param bool $persistent Use persistent connection or no
     * @param int $port MySQL connection port
     * @return resource
     * @see PEAR_MySQL::close()
     **/
    
public function connect($host$user null$pass null$database null$persistent false$port 3306)
    {
        require_once(
'DB.php');

        
$this->db DB::connect("mysql://" $user ":" $pass "@" $host ":" $port "/" $database);

        if(
DB::isError($this->db))
        {
            
$this->error .= "CyberPHP::DBase can't connect to MySQL database with PEAR::DB!\n";
            
$this->dbase_error .= $this->db->getMessage() . "\n";
        }

        
$this->db->setOption('persistent'$persistent);

        if(empty(
$this->error) && empty($this->dbase_error))
        {
            return 
false;
        }
        else
        {
            return 
true;
        }
    }

    
/**
     * @access public
     * @return string
     **/
    
public function getError()
    {
        return 
$this->error;
    }

    
/**
     * @access public
     * @return string
     **/
    
public function getDbError()
    {
        return 
$this->dbase_error;
    }

    
/**
     * @access public
     * @param string $query Query to be sent to server
     * @return resource
     **/
    
public function query($query)
    {
        
$this->query_count++;
        return 
$this->db->query($query);
    }

    
/**
     * @access public
     * @return int
     **/
    
public function queryCount()
    {
        return 
$this->query_count;
    }

    
/**
     * @access public
     * @param string $query Query to be escaped by server
     * @return string
     **/
    
public function escapeString($string)
    {
        return 
$this->db->escapeSimple($string);
    }

    
/**
     * @access public
     * @param string $query Query to be escaped by server
     * @return string
     **/
    
public function escapeRealString($string)
    {
        return 
$this->db->escapeSimple($string);
    }

    
/**
     * @access public
     * @param resource $result Result resource which you get from PEAR_MySQL::query()
     * @return int
     * @see PEAR_MySQL::query()
     **/
    
public function numRows($result)
    {
        return 
$result->numRows();
    }

    
/**
     * @access public
     * @param resource $result Result resource which you get from PEAR_MySQL::query()
     * @return int
     **/
    
public function affectedRows($result)
    {
        return 
$this->db->affectedRows();
    }

    
/**
     * @access public
     * @param resource $result Result resource which you get from PEAR_MySQL::query()
     * @return array
     **/
    
public function fetchAssoc($result)
    {
        return 
$result->fetchRow(DB_FETCHMODE_ASSOC);
    }

    
/**
     * @access public
     * @param resource $result Result resource which you get from PEAR_MySQL::query()
     * @return array
     **/
    
public function fetchArray($result)
    {
        
$row $result->fetchRow(DB_FETCHMODE_ORDERED);
        
$assoc $result->fetchRow(DB_FETCHMODE_ASSOC);
        return 
array_merge($row$assoc);
    }

    
/**
     * @access public
     * @param resource $result Result resource which you get from PEAR_MySQL::query()
     * @return array
     **/
    
public function fetchRow($result)
    {
        return 
$result->fetchRow(DB_FETCHMODE_ORDERED);
    }

    
/**
     * @access public
     * @param resource $result Result resource which you get from PEAR_MySQL::query()
     * @return bool
     **/
    
public function free($result)
    {
        return 
$result->free();
    }

    
/**
     * @access public
     * @return bool
     **/
    
public function close()
    {
        
$this->db->disconnect();
        
$this->db NULL;

        return 
true;
    }
}

/**
 * Class for connecting to MySQL => 4.1 databases with PEAR package DB
 * @see http://pear.php.net/package/DB
 * @filesource
 **/
class PEAR_MySQLi implements DBase
{

    
/**
     * @access private
     * @var resource
     **/
    
private $db;

    
/**
     * @access private
     * @var string
     **/
    
private $error;

    
/**
     * @access private
     * @var string
     **/
    
private $dbase_error;

    
/**
     * @access private
     * @var int
     **/
    
private $query_count 0;

    
/**
     * @access public
     * @param string $host MySQL database server's address
     * @param string $user MySQL database username
     * @param string $pass MySQL database password
     * @param string $database MySQL database name
     * @param bool $persistent Use persistent connection or no
     * @param int $port MySQL connection port
     * @return resource
     * @see PEAR_MySQLi::close()
     **/
    
public function connect($host$user null$pass null$database null$persistent false$port 3306)
    {
        require_once(
'DB.php');

        
$this->db DB::connect("mysqli://" $user ":" $pass "@" $host ":" $port "/" $database);

        if(
DB::isError($this->db))
        {
            
$this->error .= "CyberPHP::DBase can't connect to MySQL database with PEAR::DB!\n";
            
$this->dbase_error .= $this->db->getMessage() . "\n";
        }

        
$this->db->setOption('persistent'$persistent);

        if(empty(
$this->error) && empty($this->dbase_error))
        {
            return 
false;
        }
        else
        {
            return 
true;
        }
    }

    
/**
     * @access public
     * @return string
     **/
    
public function getError()
    {
        return 
$this->error;
    }

    
/**
     * @access public
     * @return string
     **/
    
public function getDbError()
    {
        return 
$this->dbase_error;
    }

    
/**
     * @access public
     * @param string $query Query to be sent to server
     * @return resource
     **/
    
public function query($query)
    {
        
$this->query_count++;
        return 
$this->db->query($query);
    }

    
/**
     * @access public
     * @return int
     **/
    
public function queryCount()
    {
        return 
$this->query_count;
    }

    
/**
     * @access public
     * @param string $query Query to be escaped by server
     * @return string
     **/
    
public function escapeString($string)
    {
        return 
$this->db->escapeSimple($string);
    }

    
/**
     * @access public
     * @param string $query Query to be escaped by server
     * @return string
     **/
    
public function escapeRealString($string)
    {
        return 
$this->db->escapeSimple($string);
    }

    
/**
     * @access public
     * @param resource $result Result resource which you get from PEAR_MySQL::query()
     * @return int
     * @see PEAR_MySQLi::query()
     **/
    
public function numRows($result)
    {
        return 
$result->numRows();
    }

    
/**
     * @access public
     * @param resource $result Result resource which you get from PEAR_MySQL::query()
     * @return int
     **/
    
public function affectedRows($result)
    {
        return 
$this->db->affectedRows();
    }

    
/**
     * @access public
     * @param resource $result Result resource which you get from PEAR_MySQL::query()
     * @return array
     **/
    
public function fetchAssoc($result)
    {
        return 
$result->fetchRow(DB_FETCHMODE_ASSOC);
    }

    
/**
     * @access public
     * @param resource $result Result resource which you get from PEAR_MySQL::query()
     * @return array
     **/
    
public function fetchArray($result)
    {
        
$row $result->fetchRow(DB_FETCHMODE_ORDERED);
        
$assoc $result->fetchRow(DB_FETCHMODE_ASSOC);
        return 
array_merge($row$assoc);
    }

    
/**
     * @access public
     * @param resource $result Result resource which you get from PEAR_MySQL::query()
     * @return array
     **/
    
public function fetchRow($result)
    {
        return 
$result->fetchRow(DB_FETCHMODE_ORDERED);
    }

    
/**
     * @access public
     * @param resource $result Result resource which you get from PEAR_MySQL::query()
     * @return bool
     **/
    
public function free($result)
    {
        return 
$result->free();
    }

    
/**
     * @access public
     * @return bool
     **/
    
public function close()
    {
        
$this->db->disconnect();
        
$this->db NULL;

        return 
true;
    }
}

/**
 * Class for connecting to PHP built-in SQLite database
 * @filesource
 **/
class SQLite implements DBase
{

    
/**
     * @access private
     * @var resource
     **/
    
private $db;

    
/**
     * @access private
     * @var string
     **/
    
private $error;

    
/**
     * @access private
     * @var string
     **/
    
private $dbase_error;
    
/**
     * @access private
     * @var int
     **/
    
private $query_count 0;

    
/**
     * @access public
     * @param string $host SQLite file name
     * @param string $user MySQL database username (not used with SQLite)
     * @param string $pass MySQL database password (not used with SQLite)
     * @param string $database MySQL database name (not used with SQLite)
     * @param bool $persistent Use persistent connection or no
     * @param int $port MySQL connection port (not used with SQLite)
     * @return resource
     * @see SQLite::close()
     **/
    
public function connect($host$user null$pass null$database null$persistent false$port 3306)
    {
        if(
$persistent == false)
        {
            
$this->db sqlite_open($host '.sqlite'