<?

/* =========
 * PHP DbLib
 * =========
 * A smart database indipendent library for PHP3/4
 *
 * @2000 by Antonio Gallo aka agx
 * mailto:agx@linux.it			http://www.badpenguin.org/
 * mailto:agx@geocities.com		http://www.linux.it/~agx/
 *
 * This software is released under the GNU GPL license
 * got to http://www.gnu.org to get a copy of this license
 *
 *
 * === ChangeLog ===
 * 1.0.1 - Sun Nov 19 05:52:55 2000     Added DbPrintGlobals
 * 1.0.2 - 2001-04-20                   StripSlashes applied to DbExtractRow
 * 1.0.3 - 2001-11-07                   added $recno to know when to run mysql_data_seek()
 * 1.0.4 - 2001-11-13                   DbExtractRow bug fixing
 *
 *
 * === Config ===
 *
 * 1. to use the MySQL unix_timstamp() function also under PostgreSQL you can create the following PGSQL function:
 *    create function unix_timestamp(datetime) returns int4 as 'select date_part(''epoch'', $1 )::int4' language 'sql';
 *
 * 2. Uncomment the driver of the database you wanna use :
 *
 */


/* INIT */
$recno = 0;
if ($dblib_driver=="") {
  //$dblib_driver = "pgsql";
  $dblib_driver = "mysql";
}



//
function MySQLTimestamp($t) {
  global $dblib_driver;
  if ( $dblib_driver == 'mysql') {
    // Convert a MySQL string from a datatime field directly into a unix-timestamp
    return mktime( substr($t,11,2), substr($t,14,2), substr($t,17,2), substr($t,5,2), substr($t,8,2), substr($t,0,4) );
  } else {
    // REMEMBER TO SET DATESTYLE TO ISO!!
    return mktime( substr($t,11,2), substr($t,14,2), substr($t,17,2), substr($t,5,2), substr($t,8,2), substr($t,0,4) );
  }    
}



//
function FatalError( $str, $nfun ) {
  echo "<font color=brown size=2>\n\n";
  echo "($nfun) $str\n\n</font>";
  exit;
}


//
function FatalQueryError( $qry, $str ) {
  echo "<font color=brown size=2>\n\n";
  echo "(QueryError) $str\nDetails: $qry\n\n</font>";
  exit;
}


//
function DbConnect( $hostname, $port, $database, $username, $password ) {
  global $dblib_driver;
  switch($dblib_driver) {

    case "pgsql":
     $opt = "dbname=$database host=$hostname user=$username password=$password authtype=password";
     $cnn =  pg_connect( $opt );
     if (!$cnn) FatalError("Error connecting to $hostname", 'DbConnect' );
     $opt = "";
     return $cnn;
     break;

    case "mysql":
      $cnn =  mysql_connect( $hostname, $username, $password );
      if (!$cnn) FatalError("Error connecting to $hostname", 'DbConnect' );
	if ( ! mysql_select_db($database, $cnn) ) {
		FatalError("Error selecting database $dataname", 'DbConnect' );
	}
      return $cnn;
      break;

    default:
      FatalError( 'Driver: '.$dblib_driver.' unknown', 'DbConnect' );
  }
}



//
function DbPConnect( $hostname, $port, $database, $username, $password ) {
  global $dblib_driver;
  switch($dblib_driver) {

    case "pgsql":
     $opt = "dbname=$database host=$hostname user=$username password=$password authtype=password";
     $cnn =  pg_pconnect( $opt );
     if (!$cnn) FatalError("Error connecting to $hostname", 'DbPConnect' );
     $opt = "";
     return $cnn;
     break;

    case "mysql":
      $cnn =  mysql_pconnect( $hostname, $username, $password );
      if (!$cnn) FatalError("Error connecting to $hostname", 'DbPConnect' );
	if ( ! mysql_select_db($database, $cnn) ) {
		FatalError("Error selecting database $dataname", 'DbPConnect' );
	}
      return $cnn;
      break;

    default:
      FatalError( "Driver '$dblib_driver' unknown", 'DbPConnect' );
  }
}




//
function DbQuery( $cnn, $qry ) {
  global $dblib_driver, $recno;
  $recno=0;
  switch($dblib_driver) {
    case "pgsql":
      $qry = eregi_replace( 'NOW\(\)', 'NOW()::datetime', $qry );
      $qry = eregi_replace( 'limit .*', '', $qry );
      $rs = pg_Exec( $cnn, stripslashes($qry) );
      if (!$rs) FatalQueryError( $qry, pg_ErrorMessage($cnn) );
      return  $rs;
      break;

    case "mysql":
      $rs = mysql_query( $qry, $cnn );
      if (!$rs) FatalQueryError( $qry, mysql_error($cnn) );
      return  $rs;
      break;

    default:
      FatalError( "Driver $dblib_driver unknown", 'RunQuery' );
  }
}


function DbQuerySoft( $cnn, $qry ) {
// Like DbQuery but not exit on errors
  global $dblib_driver, $recno;
  $recno=0;
  switch($dblib_driver) {
    case "pgsql":
      $rs = @pg_Exec( $cnn, stripslashes($qry) );
      return  $rs;
      break;

    case "mysql":
      $rs = @mysql_query( $qry, $cnn );
      return  $rs;
      break;

    default:
      FatalError( "Driver $dblib_driver unknown", 'RunQuery' );
  }
}


//
function DbQueryResult( $cnn, $res ) {
  global $dblib_driver;
  switch($dblib_driver) {
    case "pgsql":
      return  pg_cmdTuples( $res );
      break;

    case "mysql":
      return  mysql_affected_rows( $cnn );
      break;

    default:
      FatalError( "Driver $dblib_driver unknown", 'QueryResult' );
  }
}


//
function DbQuerySize( $res ) {
  global $dblib_driver;
  switch($dblib_driver) {
    case "pgsql":
      return  pg_NumRows( $res );
      break;
    case "mysql":
      return  mysql_num_rows( $res );
      break;
    default:
      FatalError( "Driver $dblib_driver unknown", 'QueryResult' );
  }
}



//
function DbGetRow( $res, $nrow ) {
  global $dblib_driver, $recno;
  switch($dblib_driver) {
    case "pgsql": {
      $iret = pg_Fetch_Array( $res, $nrow );
      $recno++;
      return  $iret;
      break;
    }
    case "mysql": {
      if ($nrow!=$recno) mysql_data_seek($res, $nrow);
      $iret = mysql_Fetch_Array( $res );
      $recno++;
      return  $iret;
      break;
    }
    default:
      FatalError( "Driver $dblib_driver unknown", 'QueryRow' );
  }
}



//
function DbExtractRow( $res, $nrow, $prefix ) {
  global $dblib_driver;
  switch($dblib_driver) {
    case "pgsql": {
      $iret = pg_Fetch_Array( $res, $nrow );
      if (!$iret) return false;
      $l = pg_numfields($res);
      $recno++;
      //
      for ($i=0;$i<$l;$i++) {
        $n = $prefix . pg_fieldname($res,$i);
        $v = $iret[$i];
        if (is_string($v)) {
          $GLOBALS[$n] = ''. StripSlashes($v);
        } else {
         $GLOBALS[$n] = $v;
        }
      }
      return true;
      break;
    }
    case "mysql":
      if ($nrow!=$recno) mysql_data_seek($res, $nrow);
      $iret = mysql_Fetch_Array( $res );
      if (!$iret) return false;
      $l = mysql_num_fields($res);
      $recno++;
      //
      for ($i=0;$i<$l;$i++) {
        $n = $prefix . mysql_field_name($res,$i);
        $v = $iret[$i];
        if (is_string($v)) {
          $GLOBALS[$n] = ''. StripSlashes($v);
        } else {
         $GLOBALS[$n] = $v;
        }
      }
      return true;
      break;
    default:
      FatalError( "Driver $dblib_driver unknown", 'QueryRow' );
      return false;
  }
  return false;
}


//
function DbDestroyQuery( $res ) {
  global $dblib_driver;
  switch($dblib_driver) {
    case "pgsql":
      return  pg_FreeResult( $res );
      break;
    case "msql":
      return  mysql_free_result( $res );
      break;
    default:
      FatalError( "Driver $dblib_driver unknown", 'DestroyQuery' );
  }
}


//
function DbClose( $cnn ) {
  global $dblib_driver;
  switch($dblib_driver) {
    case "pgsql":
      return  pg_Close( $cnn );
      break;
    case "mysql":
      return  mysql_Close( $cnn );
      break;
    default:
      FatalError( "Driver $dblib_driver unknown", 'DbClose' );
  }
}


//
function DbQueryFields( $res ) {
  global $dblib_driver;
  switch($dblib_driver) {
    case "pgsql":
      return  pg_numfields($res);
      break;
    case "mysql":
      return  mysql_num_fields($res);
      break;
    default:
      FatalError( "Driver $dblib_driver unknown", 'DbQueryFields' );
  }
}


//
function DbFieldName( $res, $i ) {
  global $dblib_driver;
  switch($dblib_driver) {
    case "pgsql":
      return  pg_fieldname($res,$i);
      break;
    case "mysql":
      return  mysql_field_name($res,$i);
      break;
    default:
      FatalError( "Driver $dblib_driver unknown", 'DbFieldName' );
  }
}


//
function DbFieldType( $res, $i ) {
  global $dblib_driver;
  switch($dblib_driver) {
    case "pgsql":
      return  pg_FieldType($res,$i);
      break;
    case "mysql":
      return  mysql_field_type($res,$i);
      break;
    default:
      FatalError( "Driver $dblib_driver unknown", 'DbFieldType' );
  }
}


//
function DbFieldSize( $res, $i ) {
  global $dblib_driver;
  switch($dblib_driver) {
    case "pgsql":
      return  pg_FieldSize($res,$i);
      break;
    case "mysql":
      return  mysql_field_len($res,$i);
      break;
    default:
      FatalError( "Driver $dblib_driver unknown", 'DbFieldType' );
  }
}


//
function DbPrintGlobals() {
  while ( $e = each($GLOBALS) ) {
    echo $e[0] .'='. $e[1]. "<br>\n";
  }
}


// End of dblib.inc
?>
