initdb(); } // ********************************************************************** // public property functions function setdbtype ( $strdbtype ) { $this->mstrdbtype = trim( $strdbtype ); } function getdbtype () { return $this->mstrdbtype; } function setdbhost ( $strdbhost ) { $this->mstrdbhost = trim( $strdbhost ); } function getdbhost () { return $this->mstrdbhost; } function setdbport ( $intdbport ) { $this->mintdbport = intval( $intdbport ); } function getdbport () { return $this->mintdbport; } function setdbname ( $strdbname ) { $this->mstrdbname = trim( $strdbname ); } function getdbname () { return $this->mstrdbname; } function setdbuser ( $strdbuser ) { $this->mstrdbuser = trim( $strdbuser ); } function getdbuser () { return $this->mstrdbuser; } function setdbpass ( $strdbpass ) { $this->mstrdbpass = $strdbpass; } function getdbpass () { return $this->mstrdbpass; } function getdbdefaultschemas () { return $this->mstrdbdefaultschemas; } function getdbrowcount () { return $this->mlngdbrowcount; } function getdblastsql () { return $this->mstrdblastsql; } function getdberror () { return $this->mstrdberror; } // ********************************************************************** function initdb() // initdb = initializes database { $this->mstrdbtype = clsdb::DB_TYPE_NONE; $this->mstrdbhost = 'localhost'; $this->mintdbport = clsdb::DB_PORT_NONE; $this->mstrdbname = ''; $this->mstrdbuser = ''; $this->mstrdbpass = ''; $this->mstrdefaultschemas = ''; $this->mintdbconnid = 0; $this->mintdbresultid = 0; $this->mstrdblastsql = ''; $this->mlngdbrowcount = 0; $this->mstrdberror = ''; } // ********************************************************************** function activatedb () // activates/opens database connection, will be called automatically // updates mintdbconnid and mstrdberror // returns true if database had already been opened or has been opened successfully, // otherwise returns false and sets mstrdberror { $bolretcode = true; $this->mstrdberror = ''; if ( $this->mintdbconnid == 0 ) { // database is dead or closed -> (re)open it switch ( $this->mstrdbtype ) { case clsdb::DB_TYPE_POSTGRESQL: if ( $this->mintdbport == clsdb::DB_PORT_NONE ) { $this->mintdbport = clsdb::DB_PORT_POSTGRESQL; } $this->mintdbconnid = pg_connect ("host=" . $this->mstrdbhost . " port=" . strval( $this->mintdbport ) . " dbname=" . $this->mstrdbname . " user=" . $this->mstrdbuser . " password=" . $this->mstrdbpass ); $this->mstrdberror = pg_last_error( $this->mintdbconnid ); break; case clsdb::DB_TYPE_ODBC: if ( $this->mintdbport == clsdb::DB_PORT_NONE ) { $this->mintdbport = clsdb::DB_PORT_ODBC; } $this->mintdbconnid = odbc_connect ( $this->mstrdbname, $this->mstrdbuser, $this->mstrdbpass, SQL_CUR_USE_ODBC ); $this->mstrdberror = odbc_errormsg( $this->mintdbconnid ); break; case clsdb::DB_TYPE_MYSQL: if ( $this->mintdbport == clsdb::DB_PORT_NONE ) { $this->mintdbport = clsdb::DB_PORT_MYSQL; } $this->mintdbconnid = mysql_connect ( $this->mstrdbhost . ':' . strval( $this->mintdbport ), $this->mstrdbuser, $this->mstrdbpass ); $this->mstrdberror = mysql_error( $this->mintdbconnid ); if ( $this->mintdbconnid != 0 ) { if ( !mysql_select_db ( $this->mstrdbname, $this->mintdbconnid )) { $this->mintdbconnid = 0; } $this->mstrdberror = mysql_error( $this->mintdbconnid ); } break; default: // db type not supported! $this->mintdbconnid = 0; $this->mstrdberror = 'Sorry, database of type "' . $this->mstrdbtype . '" is not supported.'; break; } // set return code on success $bolretcode = ( $this->mintdbconnid != 0 ); if ( $bolretcode and $this->mstrdefaultschemas != '' ) { // reset default schemas of database $bolretcode = changedbdefaultschemas( $this->mstrdefaultschemas ); } } return $bolretcode; } // ********************************************************************** function deactivatedb () // deactivates/closes database connection, will be done automatically at the end of the parent script // updates mintdbconnid and mstrdberror // returns true if database had already been closed or has been closed successfully, // otherwise returns false and sets mstrdberror { $bolretcode = true; $this->mstrdberror = ''; if ( $this->mintdbconnid != 0 ) { // database is still opened -> close it switch ( $this->mstrdbtype ) { case clsdb::DB_TYPE_POSTGRESQL: $bolretcode = pg_close ( $this->mintdbconnid ); $this->mstrdberror = pg_last_error( $this->mintdbconnid ); break; case clsdb::DB_TYPE_ODBC: $bolretcode = odbc_close ( $this->mintdbconnid ); $this->mstrdberror = odbc_errormsg( $this->mintdbconnid ); break; case clsdb::DB_TYPE_MYSQL: $bolretcode = mysql_close ( $this->mintdbconnid ); $this->mstrdberror = mysql_error( $this->mintdbconnid ); break; default: // db type not supported! $bolretcode = false; $this->mstrdberror = 'Sorry, database of type "' . $this->mstrdbtype . '" is not supported.'; break; } } // init/clear database connection on success if ( $bolretcode ) { initdb(); } return $bolretcode; } // ********************************************************************** function changedbdefaultschemas ( $strdbdefaultschemas ) // changes search list of default schemas in database // expects comma separated list of schema names, but ignores empty list // returns true if no schemas were given or default schemas have been updated // and false if some error occured when updating { $bolretcode = true; if ( $strdbdefaultschemas != '' ) { // do not change to empty value $bolretcode = false; if ( $this->activatedb() ) { // database is ok // change default schemas switch ( $this->mstrdbtype ) { case clsdb::DB_TYPE_POSTGRESQL: if ( $this->runsql( "set session search_path to " . $strdbdefaultschemas )) { $bolretcode = true; } else { $this->mstrdberror = pg_last_error( $this->mintdbconnid ); } break; case clsdb::DB_TYPE_ODBC: $this->mstrdberror = 'Sorry, changing the default database schema generically is not supported on ODBC databases.'; break; case clsdb::DB_TYPE_MYSQL: $this->mstrdberror = 'Sorry, database schemas are not supported on MYSQL databases.'; break; default: // db type not supported! $this->mstrdberror = 'Sorry, database of type "' . $this->mstrdbtype . '" is not supported.'; break; } } else { // database is dead or closed -> $this->mstrdberror = 'Sorry, database is currently not available.'; } // remember current database default schemas if ( $bolretcode ) { $this->mstrdbdefaultschemas = $strdbdefaultschemas; } } return $bolretcode; } // ********************************************************************** function runsql ( $strdbsql ) // executes SQL statement on given database connection // updates mlngdbrowcount, mintdbresultid and mstrdberror // returns true and sets mlngdbrowcount and mintdbresultid if SQL statement had been executed successfully, // otherwise returns false and sets mstrdberror { $bolretcode = false; $this->mlngdbrowcount = 0; $this->mintdbresultid = 0; $this->mstrdberror = ''; if ( $this->activatedb() ) { // database is ok switch ( $this->mstrdbtype ) { case clsdb::DB_TYPE_POSTGRESQL: $this->mintdbresultid = pg_query ( $this->mintdbconnid, $strdbsql ); $this->mstrdberror = pg_last_error( $this->mintdbconnid ); if ( $this->mintdbresultid != 0 ) { if ( strtolower(substr( trim( $strdbsql ), 0, 6 ) == 'select' ) ) { $this->mlngdbrowcount = pg_num_rows( $this->mintdbresultid ); } else { $this->mlngdbrowcount = pg_affected_rows( $this->mintdbresultid ); } $bolretcode = true; } break; case clsdb::DB_TYPE_ODBC: $this->mintdbresultid = odbc_exec ( $this->mintdbconnid, $strdbsql ); $this->mstrdberror = odbc_errormsg( $this->mintdbconnid ); if ( $this->mintdbresultid != 0 ) { // Attention: odbc_num_rows may return wrong record count in SELECT-statements! // to retrieve exact number of records in SELECT statements you should walk through the recordset $this->mlngdbrowcount = odbc_num_rows( $this->mintdbresultid ); $bolretcode = true; } break; case clsdb::DB_TYPE_MYSQL: $this->mintdbresultid = mysql_query ( $strdbsql, $this->mintdbconnid ); $this->mstrdberror = mysql_error( $this->mintdbconnid ); if ( $this->mintdbresultid != 0 ) { if ( strtolower(substr( trim( $strdbsql ), 0, 6 ) == 'select' ) ) { $this->mlngdbrowcount = mysql_num_rows( $this->mintdbresultid ); } else { $this->mlngdbrowcount = mysql_affected_rows( $this->mintdbconnid ); } $bolretcode = true; } break; default: // db type not supported! $bolretcode = false; $this->mstrdberror = 'Sorry, database of type "' . $this->mstrdbtype . '" is not supported.'; break; } } return $bolretcode; } // ********************************************************************** function getdbrow ( &$strdbrow, $intdbrow = clsdb::DB_ROW_NEXT ) // fetches row on position intdbrow from mintdbresultid as associative array into strdbrow // position intdbrow may be DB_RESULT_NEXTROW to fetch the next row of mintdbresultid // updates mstrdberror // returns true and sets strdbrow if row has been fetched successfully, // otherwise returns false and sets mstrdberror { $bolretcode = false; $strdbrow = array(); $intindex = 0; $this->mstrdberror = ''; if ( $this->mintdbresultid != 0 ) { // resultset is ok switch ( $this->mstrdbtype ) { case clsdb::DB_TYPE_POSTGRESQL: switch ( $intdbrow ) { case clsdb::DB_ROW_FIRST: $bolretcode = ( $strdbrow = pg_fetch_assoc( $this->mintdbresultid, 0 )); break; case clsdb::DB_ROW_NEXT: $bolretcode = ( $strdbrow = pg_fetch_assoc( $this->mintdbresultid )); break; case clsdb::DB_ROW_LAST: $bolretcode = ( $strdbrow = pg_fetch_assoc( $this->mintdbresultid, pg_num_rows( $this->mintdbresultid ) - 1 )); break; default: // specific $intdbrow given -> use it directly, offer start at position 1 $bolretcode = ( $strdbrow = pg_fetch_assoc( $this->mintdbresultid, $intdbrow - 1 )); break; } $this->mstrdberror = pg_result_error( $this->mintdbresultid ); if ( $bolretcode ) { // cast special field types to common string values $intindex = 0; while ( $intindex < pg_num_fields( $this->mintdbresultid )) { if ( pg_field_type( $this->mintdbresultid, $intindex ) == 'bool' ) { // boolean type of postgresql is "f" or "t" // -> convert to "0" or "1" switch ( $strdbrow[pg_field_name( $this->mintdbresultid, $intindex )] ) { case 'f': $strdbrow[pg_field_name( $this->mintdbresultid, $intindex )] = '0'; break; case 't': $strdbrow[pg_field_name( $this->mintdbresultid, $intindex )] = '1'; break; } } $intindex++; } } break; case clsdb::DB_TYPE_ODBC: switch ( $intdbrow ) { case clsdb::DB_ROW_FIRST: $bolretcode = ( $strdbrow = odbc_fetch_array( $this->mintdbresultid, 0 )); break; case clsdb::DB_ROW_NEXT: $bolretcode = ( $strdbrow = odbc_fetch_array( $this->mintdbresultid )); break; case clsdb::DB_ROW_LAST: // Attention: odbc_num_rows may return wrong record count in SELECT-statements! // to retrieve exact number of records in SELECT statements you should walk through the recordset $bolretcode = ( $strdbrow = odbc_fetch_array( $this->mintdbresultid, odbc_num_rows( $this->mintdbresultid ) - 1 )); break; default: // specific $intdbrow given -> use it directly, offer start at position 1 $bolretcode = ( $strdbrow = odbc_fetch_array( $this->mintdbresultid, $intdbrow - 1)); break; } // ODBC does not support error messages on resultset level if ( !$bolretcode ) { $this->mstrdberror = 'Sorry, could not read result row on position ' . $intdbrow ; } break; case clsdb::DB_TYPE_MYSQL: switch ( $intdbrow ) { case clsdb::DB_ROW_FIRST: $bolretcode = mysql_data_seek( $this->mintdbresultid, 0 ); $this->mstrdberror = mysql_error( $this->mintdbconnid ); break; case clsdb::DB_ROW_NEXT: // just stay where the pointer is $bolretcode = true; break; case clsdb::DB_ROW_LAST: $bolretcode = mysql_data_seek( $this->mintdbresultid, mysql_num_rows( $this->mintdbresultid ) - 1 ); $this->mstrdberror = mysql_error( $this->mintdbconnid ); break; default: // specific $intdbrow given -> use it directly, offer start at position 1 $bolretcode = mysql_data_seek( $this->mintdbresultid, $intdbrow - 1 ); $this->mstrdberror = mysql_error( $this->mintdbconnid ); break; } if ( $bolretcode ) { $bolretcode = ( $strdbrow = mysql_fetch_assoc( $this->mintdbresultid )); $this->mstrdberror = mysql_error( $this->mintdbconnid ); } break; default: // db type not supported! $bolretcode = false; $this->mstrdberror = 'Sorry, database of type "' . $this->mstrdbtype . '" is not supported.'; break; } } else { $bolretcode = false; $this->mstrdberror = 'Sorry, no data available to read.'; } if ( $bolretcode ) { // convert boolean string ('f', 't') manually to ('0', '1') } return $bolretcode; } // ********************************************************************** function getdbfields ( &$strdbfields ) // returns list of field names, field type and field length from mintdbresultid as associative arrays into strdbfields // strdbfields will contain following partial arrays: DB_FIELD_NAME, DB_FIELD_TYPE, DB_FIELD_LEN // use as following: $strdbfields[clsdb::DB_FIELD_*][$intdbfield or $strdbfieldname] // example: $intdbfieldtype[$strdbfieldname] = $strdbfields[DB_FIELD_TYPE][$strdbfieldname] // updates parameter strdbfields, mstrdberror // returns true and sets strdbfields if field names have been retrieved successfully, // otherwise returns false and sets mstrdberror { $bolretcode = false; $intindex = 0; $strfieldname = ''; $strdbfields = array (clsdb::DB_FIELD_NAME => array(), clsdb::DB_FIELD_TYPE => array(), clsdb::DB_FIELD_LEN => array()); $this->mstrdberror = ''; if ( $this->mintdbresultid != 0 ) { // resultset is ok //no errors expected at all $bolretcode = true; switch ( $this->mstrdbtype ) { case clsdb::DB_TYPE_POSTGRESQL: // field numeration in PostgreSQL starts with 0 $intindex = 0; while ( $intindex < pg_num_fields( $this->mintdbresultid )) { array_push ( $strdbfields[clsdb::DB_FIELD_NAME], pg_field_name( $this->mintdbresultid, $intindex )); array_push ( $strdbfields[clsdb::DB_FIELD_TYPE], pg_field_type( $this->mintdbresultid, $intindex )); array_push ( $strdbfields[clsdb::DB_FIELD_LEN], pg_field_prtlen( $this->mintdbresultid, $intindex )); $intindex++; } $this->mstrdberror = pg_result_error( $this->mintdbresultid ); break; case clsdb::DB_TYPE_ODBC: // field numeration in ODBC starts with 1 $intindex = 1; while ( $intindex <= odbc_num_fields( $this->mintdbresultid )) { $strfieldname = odbc_field_name( $this->mintdbresultid, $intindex ); array_push ( $strdbfields[clsdb::DB_FIELD_NAME], $strfieldname ); array_push ( $strdbfields[clsdb::DB_FIELD_TYPE], odbc_field_type( $this->mintdbresultid, $intindex )); array_push ( $strdbfields[clsdb::DB_FIELD_LEN], odbc_field_len( $this->mintdbresultid, $intindex )); $intindex++; } // ODBC does not support error messages on resultset level if ( !$bolretcode ) { $this->mstrdberror = 'Sorry, could not read field names.'; } break; case clsdb::DB_TYPE_MYSQL: // field numeration in MYSQL starts with 0 $intindex = 0; while ( $intindex < mysql_num_fields( $this->mintdbresultid )) { array_push ( $strdbfields[clsdb::DB_FIELD_NAME], mysql_field_name( $this->mintdbresultid, $intindex )); array_push ( $strdbfields[clsdb::DB_FIELD_TYPE], mysql_field_type( $this->mintdbresultid, $intindex )); array_push ( $strdbfields[clsdb::DB_FIELD_LEN], mysql_field_len( $this->mintdbresultid, $intindex )); $intindex++; } $this->mstrdberror = mysql_error( $this->mintdbconnid ); break; default: // db type not supported! $bolretcode = false; $this->mstrdberror = 'Sorry, database of type "' . $this->mstrdbtype . '" is not supported.'; break; } } else { $bolretcode = false; $this->mstrdberror = 'Sorry, no data available to read.'; } return $bolretcode; } // ********************************************************************** function dbtimestamp( $vartimestamp ) // converts given timestamp into database format { $strretcode = ''; $inttimestamp = 0; if ( is_numeric( $vartimestamp ) ) { // UNIX timestamp assumed $inttimestamp = $vartimestamp; } else { // time string assumed $inttimestamp = strtotime( $vartimestamp ); } // inttimestamp now contains UNIX timestamp switch ( $this->mstrdbtype ) { case clsdb::DB_TYPE_POSTGRESQL: $strretcode = "TIMESTAMP '" . date( "Y-m-d H:i:s", $vartimestamp) . "'"; break; case clsdb::DB_TYPE_ODBC: $strretcode = "'" . date( "Y-m-d H:i:s", $vartimestamp) . "'"; break; case clsdb::DB_TYPE_MYSQL: $strretcode = "'" . date( "YmdHis", $vartimestamp ) . "'"; break; default: // db type not supported! // -> return original string $strretcode = $vartimestamp; break; } return $strretcode; } } ?>