/**
  * Create a new DB object and connect to the specified database
  *
  * @param $dsn mixed "data source name", see the DB::parseDSN
  * method for a description of the dsn format.  Can also be
  * specified as an array of the format returned by DB::parseDSN.
  *
  * @param $options mixed if boolean (or scalar), tells whether
  * this connection should be persistent (for backends that support
  * this).  This parameter can also be an array of options, see
  * DB_common::setOption for more information on connection
  * options.
  *
  * @return object a newly created DB connection object, or a DB
  * error object on error
  *
  * @see DB::parseDSN
  * @see DB::isError
  */
 function connect($dsn, $options = false)
 {
     if (is_array($dsn)) {
         $dsninfo = $dsn;
     } else {
         $dsninfo = DB::parseDSN($dsn);
     }
     switch ($dsninfo["phptype"]) {
         case 'pgsql':
             $type = 'postgres7';
             break;
         case 'ifx':
             $type = 'informix9';
             break;
         default:
             $type = $dsninfo["phptype"];
             break;
     }
     if (is_array($options) && isset($options["debug"]) && $options["debug"] >= 2) {
         // expose php errors with sufficient debug level
         @(include_once "adodb-{$type}.inc.php");
     } else {
         @(include_once "adodb-{$type}.inc.php");
     }
     @($obj = NewADOConnection($type));
     if (!is_object($obj)) {
         $obj = new PEAR_Error('Unknown Database Driver: ' . $dsninfo['phptype'], -1);
         return $obj;
     }
     if (is_array($options)) {
         foreach ($options as $k => $v) {
             switch (strtolower($k)) {
                 case 'persist':
                 case 'persistent':
                     $persist = $v;
                     break;
                     #ibase
                 #ibase
                 case 'dialect':
                     $obj->dialect = $v;
                     break;
                 case 'charset':
                     $obj->charset = $v;
                     break;
                 case 'buffers':
                     $obj->buffers = $v;
                     break;
                     #ado
                 #ado
                 case 'charpage':
                     $obj->charPage = $v;
                     break;
                     #mysql
                 #mysql
                 case 'clientflags':
                     $obj->clientFlags = $v;
                     break;
             }
         }
     } else {
         $persist = false;
     }
     if (isset($dsninfo['socket'])) {
         $dsninfo['hostspec'] .= ':' . $dsninfo['socket'];
     } else {
         if (isset($dsninfo['port'])) {
             $dsninfo['hostspec'] .= ':' . $dsninfo['port'];
         }
     }
     if ($persist) {
         $ok = $obj->PConnect($dsninfo['hostspec'], $dsninfo['username'], $dsninfo['password'], $dsninfo['database']);
     } else {
         $ok = $obj->Connect($dsninfo['hostspec'], $dsninfo['username'], $dsninfo['password'], $dsninfo['database']);
     }
     if (!$ok) {
         $obj = ADODB_PEAR_Error();
     }
     return $obj;
 }