2018-10-16 16:28:42 +00:00
< ? php
/**
* CodeIgniter
*
* An open source application development framework for PHP
*
* This content is released under the MIT License ( MIT )
*
2018-12-29 15:16:49 +00:00
* Copyright ( c ) 2014 - 2018 , British Columbia Institute of Technology
2018-10-16 16:28:42 +00:00
*
* Permission is hereby granted , free of charge , to any person obtaining a copy
* of this software and associated documentation files ( the " Software " ), to deal
* in the Software without restriction , including without limitation the rights
* to use , copy , modify , merge , publish , distribute , sublicense , and / or sell
* copies of the Software , and to permit persons to whom the Software is
* furnished to do so , subject to the following conditions :
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software .
*
* THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
* IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM , DAMAGES OR OTHER
* LIABILITY , WHETHER IN AN ACTION OF CONTRACT , TORT OR OTHERWISE , ARISING FROM ,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE .
*
* @ package CodeIgniter
* @ author EllisLab Dev Team
* @ copyright Copyright ( c ) 2008 - 2014 , EllisLab , Inc . ( https :// ellislab . com / )
2018-12-29 15:16:49 +00:00
* @ copyright Copyright ( c ) 2014 - 2018 , British Columbia Institute of Technology ( http :// bcit . ca / )
2018-10-16 16:28:42 +00:00
* @ license http :// opensource . org / licenses / MIT MIT License
* @ link https :// codeigniter . com
* @ since Version 3.0 . 0
* @ filesource
*/
defined ( 'BASEPATH' ) OR exit ( 'No direct script access allowed' );
/**
* Firebird / Interbase Database Adapter Class
*
* Note : _DB is an extender class that the app controller
* creates dynamically based on whether the query builder
* class is being used or not .
*
* @ package CodeIgniter
* @ subpackage Drivers
* @ category Database
* @ author EllisLab Dev Team
* @ link https :// codeigniter . com / user_guide / database /
*/
class CI_DB_ibase_driver extends CI_DB {
/**
* Database driver
*
* @ var string
*/
public $dbdriver = 'ibase' ;
// --------------------------------------------------------------------
/**
* ORDER BY random keyword
*
* @ var array
*/
protected $_random_keyword = array ( 'RAND()' , 'RAND()' );
/**
* IBase Transaction status flag
*
* @ var resource
*/
protected $_ibase_trans ;
// --------------------------------------------------------------------
/**
* Non - persistent database connection
*
* @ param bool $persistent
* @ return resource
*/
public function db_connect ( $persistent = FALSE )
{
return ( $persistent === TRUE )
? ibase_pconnect ( $this -> hostname . ':' . $this -> database , $this -> username , $this -> password , $this -> char_set )
: ibase_connect ( $this -> hostname . ':' . $this -> database , $this -> username , $this -> password , $this -> char_set );
}
// --------------------------------------------------------------------
/**
* Database version number
*
* @ return string
*/
public function version ()
{
if ( isset ( $this -> data_cache [ 'version' ]))
{
return $this -> data_cache [ 'version' ];
}
if (( $service = ibase_service_attach ( $this -> hostname , $this -> username , $this -> password )))
{
$this -> data_cache [ 'version' ] = ibase_server_info ( $service , IBASE_SVC_SERVER_VERSION );
// Don't keep the service open
ibase_service_detach ( $service );
return $this -> data_cache [ 'version' ];
}
return FALSE ;
}
// --------------------------------------------------------------------
/**
* Execute the query
*
* @ param string $sql an SQL query
* @ return resource
*/
protected function _execute ( $sql )
{
return ibase_query ( isset ( $this -> _ibase_trans ) ? $this -> _ibase_trans : $this -> conn_id , $sql );
}
// --------------------------------------------------------------------
/**
* Begin Transaction
*
* @ return bool
*/
protected function _trans_begin ()
{
if (( $trans_handle = ibase_trans ( $this -> conn_id )) === FALSE )
{
return FALSE ;
}
$this -> _ibase_trans = $trans_handle ;
return TRUE ;
}
// --------------------------------------------------------------------
/**
* Commit Transaction
*
* @ return bool
*/
protected function _trans_commit ()
{
if ( ibase_commit ( $this -> _ibase_trans ))
{
$this -> _ibase_trans = NULL ;
return TRUE ;
}
return FALSE ;
}
// --------------------------------------------------------------------
/**
* Rollback Transaction
*
* @ return bool
*/
protected function _trans_rollback ()
{
if ( ibase_rollback ( $this -> _ibase_trans ))
{
$this -> _ibase_trans = NULL ;
return TRUE ;
}
return FALSE ;
}
// --------------------------------------------------------------------
/**
* Affected Rows
*
* @ return int
*/
public function affected_rows ()
{
return ibase_affected_rows ( $this -> conn_id );
}
// --------------------------------------------------------------------
/**
* Insert ID
*
* @ param string $generator_name
* @ param int $inc_by
* @ return int
*/
public function insert_id ( $generator_name , $inc_by = 0 )
{
//If a generator hasn't been used before it will return 0
return ibase_gen_id ( '"' . $generator_name . '"' , $inc_by );
}
// --------------------------------------------------------------------
/**
* List table query
*
* Generates a platform - specific query string so that the table names can be fetched
*
* @ param bool $prefix_limit
* @ return string
*/
protected function _list_tables ( $prefix_limit = FALSE )
{
$sql = 'SELECT TRIM("RDB$RELATION_NAME") AS TABLE_NAME FROM "RDB$RELATIONS" WHERE "RDB$RELATION_NAME" NOT LIKE \'RDB$%\' AND "RDB$RELATION_NAME" NOT LIKE \'MON$%\'' ;
if ( $prefix_limit !== FALSE && $this -> dbprefix !== '' )
{
return $sql . ' AND TRIM("RDB$RELATION_NAME") AS TABLE_NAME LIKE \'' . $this -> escape_like_str ( $this -> dbprefix ) . " %' "
. sprintf ( $this -> _like_escape_str , $this -> _like_escape_chr );
}
return $sql ;
}
// --------------------------------------------------------------------
/**
* Show column query
*
* Generates a platform - specific query string so that the column names can be fetched
*
* @ param string $table
* @ return string
*/
protected function _list_columns ( $table = '' )
{
return 'SELECT TRIM("RDB$FIELD_NAME") AS COLUMN_NAME FROM "RDB$RELATION_FIELDS" WHERE "RDB$RELATION_NAME" = ' . $this -> escape ( $table );
}
// --------------------------------------------------------------------
/**
* Returns an object with field data
*
* @ param string $table
* @ return array
*/
public function field_data ( $table )
{
$sql = ' SELECT " rfields " . " RDB $FIELD_NAME " AS " name " ,
CASE " fields " . " RDB $FIELD_TYPE "
WHEN 7 THEN \ ' SMALLINT\ '
WHEN 8 THEN \ ' INTEGER\ '
WHEN 9 THEN \ ' QUAD\ '
WHEN 10 THEN \ ' FLOAT\ '
WHEN 11 THEN \ ' DFLOAT\ '
WHEN 12 THEN \ ' DATE\ '
WHEN 13 THEN \ ' TIME\ '
WHEN 14 THEN \ ' CHAR\ '
WHEN 16 THEN \ ' INT64\ '
WHEN 27 THEN \ ' DOUBLE\ '
WHEN 35 THEN \ ' TIMESTAMP\ '
WHEN 37 THEN \ ' VARCHAR\ '
WHEN 40 THEN \ ' CSTRING\ '
WHEN 261 THEN \ ' BLOB\ '
ELSE NULL
END AS " type " ,
" fields " . " RDB $FIELD_LENGTH " AS " max_length " ,
" rfields " . " RDB $DEFAULT_VALUE " AS " default "
FROM " RDB $RELATION_FIELDS " " rfields "
JOIN " RDB $FIELDS " " fields " ON " rfields " . " RDB $FIELD_SOURCE " = " fields " . " RDB $FIELD_NAME "
WHERE " rfields " . " RDB $RELATION_NAME " = '.$this->escape($table).'
ORDER BY " rfields " . " RDB $FIELD_POSITION " ' ;
return (( $query = $this -> query ( $sql )) !== FALSE )
? $query -> result_object ()
: FALSE ;
}
// --------------------------------------------------------------------
/**
* Error
*
* Returns an array containing code and message of the last
2018-12-29 15:16:49 +00:00
* database error that has occurred .
2018-10-16 16:28:42 +00:00
*
* @ return array
*/
public function error ()
{
return array ( 'code' => ibase_errcode (), 'message' => ibase_errmsg ());
}
// --------------------------------------------------------------------
/**
* Update statement
*
* Generates a platform - specific update string from the supplied data
*
* @ param string $table
* @ param array $values
* @ return string
*/
protected function _update ( $table , $values )
{
$this -> qb_limit = FALSE ;
return parent :: _update ( $table , $values );
}
// --------------------------------------------------------------------
/**
* Truncate statement
*
* Generates a platform - specific truncate string from the supplied data
*
* If the database does not support the TRUNCATE statement ,
* then this method maps to 'DELETE FROM table'
*
* @ param string $table
* @ return string
*/
protected function _truncate ( $table )
{
return 'DELETE FROM ' . $table ;
}
// --------------------------------------------------------------------
/**
* Delete statement
*
* Generates a platform - specific delete string from the supplied data
*
* @ param string $table
* @ return string
*/
protected function _delete ( $table )
{
$this -> qb_limit = FALSE ;
return parent :: _delete ( $table );
}
// --------------------------------------------------------------------
/**
* LIMIT
*
* Generates a platform - specific LIMIT clause
*
* @ param string $sql SQL Query
* @ return string
*/
protected function _limit ( $sql )
{
// Limit clause depends on if Interbase or Firebird
if ( stripos ( $this -> version (), 'firebird' ) !== FALSE )
{
$select = 'FIRST ' . $this -> qb_limit
. ( $this -> qb_offset ? ' SKIP ' . $this -> qb_offset : '' );
}
else
{
$select = 'ROWS '
. ( $this -> qb_offset ? $this -> qb_offset . ' TO ' . ( $this -> qb_limit + $this -> qb_offset ) : $this -> qb_limit );
}
return preg_replace ( '`SELECT`i' , 'SELECT ' . $select , $sql , 1 );
}
// --------------------------------------------------------------------
2018-12-29 15:16:49 +00:00
/**
* Insert batch statement
*
* Generates a platform - specific insert string from the supplied data .
*
* @ param string $table Table name
* @ param array $keys INSERT keys
* @ param array $values INSERT values
* @ return string | bool
*/
protected function _insert_batch ( $table , $keys , $values )
{
return ( $this -> db_debug ) ? $this -> display_error ( 'db_unsupported_feature' ) : FALSE ;
}
// --------------------------------------------------------------------
2018-10-16 16:28:42 +00:00
/**
* Close DB Connection
*
* @ return void
*/
protected function _close ()
{
ibase_close ( $this -> conn_id );
}
}