2003-10-19 21:05:23 +02:00
< ? php
/*
2005-09-26 12:12:10 +02:00
V4 . 65 22 July 2005 ( c ) 2000 - 2005 John Lim ( jlim @ natsoft . com . my ) . All rights reserved .
2003-10-19 21:05:23 +02:00
Released under both BSD license and Lesser GPL library license .
Whenever there is any discrepancy between the two licenses ,
the BSD license will take precedence .
Set tabs to 4 for best viewing .
2004-07-10 09:19:40 +02:00
Latest version is available at http :// adodb . sourceforge . net
2003-10-19 21:05:23 +02:00
SAPDB data driver . Requires ODBC .
*/
2004-07-10 09:19:40 +02:00
// security - hide paths
if ( ! defined ( 'ADODB_DIR' )) die ();
2003-10-19 21:05:23 +02:00
if ( ! defined ( '_ADODB_ODBC_LAYER' )) {
include ( ADODB_DIR . " /drivers/adodb-odbc.inc.php " );
}
if ( ! defined ( 'ADODB_SAPDB' )){
define ( 'ADODB_SAPDB' , 1 );
class ADODB_SAPDB extends ADODB_odbc {
var $databaseType = " sapdb " ;
var $concat_operator = '||' ;
var $sysDate = 'DATE' ;
var $sysTimeStamp = 'TIMESTAMP' ;
2004-10-14 22:35:50 +02:00
var $fmtDate = " 'Y-m-d' " ; /// used by DBDate() as the default date format used by the database
var $fmtTimeStamp = " 'Y-m-d H:i:s' " ; /// used by DBTimeStamp as the default timestamp fmt.
2004-08-04 01:04:29 +02:00
var $hasInsertId = true ;
2004-09-19 12:32:35 +02:00
var $_bindInputArray = true ;
2005-09-26 12:12:10 +02:00
2003-10-19 21:05:23 +02:00
function ADODB_SAPDB ()
{
//if (strncmp(PHP_OS,'WIN',3) === 0) $this->curmode = SQL_CUR_USE_ODBC;
$this -> ADODB_odbc ();
}
2004-08-13 20:59:00 +02:00
function ServerInfo ()
2004-08-04 01:04:29 +02:00
{
2004-08-13 20:59:00 +02:00
$info = ADODB_odbc :: ServerInfo ();
if ( ! $info [ 'version' ] && preg_match ( '/([0-9.]+)/' , $info [ 'description' ], $matches )) {
$info [ 'version' ] = $matches [ 1 ];
2004-08-09 23:20:08 +02:00
}
2004-08-13 20:59:00 +02:00
return $info ;
}
2004-08-15 18:19:46 +02:00
function MetaPrimaryKeys ( $table )
{
$table = $this -> Quote ( strtoupper ( $table ));
return $this -> GetCol ( " SELECT columnname FROM COLUMNS WHERE tablename= $table AND mode='KEY' ORDER BY pos " );
}
2004-08-13 20:59:00 +02:00
function & MetaIndexes ( $table , $primary = FALSE )
{
2004-08-04 01:04:29 +02:00
$table = $this -> Quote ( strtoupper ( $table ));
2004-08-13 20:59:00 +02:00
2004-08-04 01:04:29 +02:00
$sql = " SELECT INDEXNAME,TYPE,COLUMNNAME FROM INDEXCOLUMNS " .
" WHERE TABLENAME= $table " .
" ORDER BY INDEXNAME,COLUMNNO " ;
2004-08-15 20:12:41 +02:00
global $ADODB_FETCH_MODE ;
2004-08-04 01:04:29 +02:00
$save = $ADODB_FETCH_MODE ;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM ;
if ( $this -> fetchMode !== FALSE ) {
2004-08-15 20:12:41 +02:00
$savem = $this -> SetFetchMode ( FALSE );
2004-08-04 01:04:29 +02:00
}
$rs = $this -> Execute ( $sql );
if ( isset ( $savem )) {
2004-08-15 20:12:41 +02:00
$this -> SetFetchMode ( $savem );
2004-08-04 01:04:29 +02:00
}
$ADODB_FETCH_MODE = $save ;
if ( ! is_object ( $rs )) {
return FALSE ;
}
$indexes = array ();
while ( $row = $rs -> FetchRow ()) {
$indexes [ $row [ 0 ]][ 'unique' ] = $row [ 1 ] == 'UNIQUE' ;
$indexes [ $row [ 0 ]][ 'columns' ][] = $row [ 2 ];
}
2004-08-13 20:59:00 +02:00
if ( $primary ) {
$indexes [ 'SYSPRIMARYKEYINDEX' ] = array (
'unique' => True , // by definition
2004-08-15 18:19:46 +02:00
'columns' => $this -> GetCol ( " SELECT columnname FROM COLUMNS WHERE tablename= $table AND mode='KEY' ORDER BY pos " ),
2004-08-13 20:59:00 +02:00
);
}
2004-08-04 01:04:29 +02:00
return $indexes ;
}
2004-08-15 20:12:41 +02:00
function & MetaColumns ( $table )
{
global $ADODB_FETCH_MODE ;
$save = $ADODB_FETCH_MODE ;
$ADODB_FETCH_MODE = ADODB_FETCH_NUM ;
if ( $this -> fetchMode !== FALSE ) {
$savem = $this -> SetFetchMode ( FALSE );
}
$table = $this -> Quote ( strtoupper ( $table ));
$retarr = array ();
foreach ( $this -> GetAll ( " SELECT COLUMNNAME,DATATYPE,LEN,DEC,NULLABLE,MODE, \" DEFAULT \" ,CASE WHEN \" DEFAULT \" IS NULL THEN 0 ELSE 1 END AS HAS_DEFAULT FROM COLUMNS WHERE tablename= $table ORDER BY pos " ) as $column )
{
$fld = new ADOFieldObject ();
$fld -> name = $column [ 0 ];
$fld -> type = $column [ 1 ];
$fld -> max_length = $fld -> type == 'LONG' ? 2147483647 : $column [ 2 ];
$fld -> scale = $column [ 3 ];
$fld -> not_null = $column [ 4 ] == 'NO' ;
$fld -> primary_key = $column [ 5 ] == 'KEY' ;
if ( $fld -> has_default = $column [ 7 ]) {
if ( $fld -> primary_key && $column [ 6 ] == 'DEFAULT SERIAL (1)' ) {
$fld -> auto_increment = true ;
$fld -> has_default = false ;
} else {
$fld -> default_value = $column [ 6 ];
2004-10-14 22:35:50 +02:00
switch ( $fld -> type ) {
case 'VARCHAR' :
case 'CHARACTER' :
case 'LONG' :
$fld -> default_value = $column [ 6 ];
break ;
default :
$fld -> default_value = trim ( $column [ 6 ]);
break ;
}
2004-08-15 20:12:41 +02:00
}
}
$retarr [ $fld -> name ] = $fld ;
}
if ( isset ( $savem )) {
$this -> SetFetchMode ( $savem );
}
$ADODB_FETCH_MODE = $save ;
2004-08-04 01:04:29 +02:00
2004-08-15 20:12:41 +02:00
return $retarr ;
}
function MetaColumnNames ( $table )
{
$table = $this -> Quote ( strtoupper ( $table ));
return $this -> GetCol ( " SELECT columnname FROM COLUMNS WHERE tablename= $table ORDER BY pos " );
}
2004-08-04 01:04:29 +02:00
// unlike it seems, this depends on the db-session and works in a multiuser environment
function _insertid ( $table , $column )
{
return empty ( $table ) ? False : $this -> GetOne ( " SELECT $table .CURRVAL FROM DUAL " );
}
2003-10-19 21:05:23 +02:00
/*
SelectLimit implementation problems :
The following will return random 10 rows as order by performed after " WHERE rowno<10 "
which is not ideal ...
select * from table where rowno < 10 order by 1
This means that we have to use the adoconnection base class SelectLimit when
there is an " order by " .
See http :// listserv . sap . com / pipermail / sapdb . general / 2002 - January / 010405. html
*/
};
class ADORecordSet_sapdb extends ADORecordSet_odbc {
var $databaseType = " sapdb " ;
function ADORecordSet_sapdb ( $id , $mode = false )
{
$this -> ADORecordSet_odbc ( $id , $mode );
}
}
} //define
2005-09-26 12:12:10 +02:00
?>