[ Index ] |
|
Code source de vtiger CRM 5.0.2 |
1 <?php 2 /** 3 * @version V4.90 8 June 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my). All rights reserved. 4 * Released under both BSD license and Lesser GPL library license. 5 * Whenever there is any discrepancy between the two licenses, 6 * the BSD license will take precedence. 7 * 8 * Set tabs to 4 for best viewing. 9 * 10 * PEAR DB Emulation Layer for ADODB. 11 * 12 * The following code is modelled on PEAR DB code by Stig Bakken <ssb@fast.no> | 13 * and Tomas V.V.Cox <cox@idecnet.com>. Portions (c)1997-2002 The PHP Group. 14 */ 15 16 /* 17 We support: 18 19 DB_Common 20 --------- 21 query - returns PEAR_Error on error 22 limitQuery - return PEAR_Error on error 23 prepare - does not return PEAR_Error on error 24 execute - does not return PEAR_Error on error 25 setFetchMode - supports ASSOC and ORDERED 26 errorNative 27 quote 28 nextID 29 disconnect 30 31 getOne 32 getAssoc 33 getRow 34 getCol 35 getAll 36 37 DB_Result 38 --------- 39 numRows - returns -1 if not supported 40 numCols 41 fetchInto - does not support passing of fetchmode 42 fetchRows - does not support passing of fetchmode 43 free 44 */ 45 46 define('ADODB_PEAR',dirname(__FILE__)); 47 include_once "PEAR.php"; 48 include_once ADODB_PEAR."/adodb-errorpear.inc.php"; 49 include_once ADODB_PEAR."/adodb.inc.php"; 50 51 if (!defined('DB_OK')) { 52 define("DB_OK", 1); 53 define("DB_ERROR",-1); 54 55 // autoExecute constants 56 define('DB_AUTOQUERY_INSERT', 1); 57 define('DB_AUTOQUERY_UPDATE', 2); 58 59 /** 60 * This is a special constant that tells DB the user hasn't specified 61 * any particular get mode, so the default should be used. 62 */ 63 64 define('DB_FETCHMODE_DEFAULT', 0); 65 66 /** 67 * Column data indexed by numbers, ordered from 0 and up 68 */ 69 70 define('DB_FETCHMODE_ORDERED', 1); 71 72 /** 73 * Column data indexed by column names 74 */ 75 76 define('DB_FETCHMODE_ASSOC', 2); 77 78 /* for compatibility */ 79 80 define('DB_GETMODE_ORDERED', DB_FETCHMODE_ORDERED); 81 define('DB_GETMODE_ASSOC', DB_FETCHMODE_ASSOC); 82 83 /** 84 * these are constants for the tableInfo-function 85 * they are bitwised or'ed. so if there are more constants to be defined 86 * in the future, adjust DB_TABLEINFO_FULL accordingly 87 */ 88 89 define('DB_TABLEINFO_ORDER', 1); 90 define('DB_TABLEINFO_ORDERTABLE', 2); 91 define('DB_TABLEINFO_FULL', 3); 92 } 93 94 /** 95 * The main "DB" class is simply a container class with some static 96 * methods for creating DB objects as well as some utility functions 97 * common to all parts of DB. 98 * 99 */ 100 101 class DB 102 { 103 /** 104 * Create a new DB object for the specified database type 105 * 106 * @param $type string database type, for example "mysql" 107 * 108 * @return object a newly created DB object, or a DB error code on 109 * error 110 */ 111 112 function &factory($type) 113 { 114 include_once(ADODB_DIR."/drivers/adodb-$type.inc.php"); 115 $obj = &NewADOConnection($type); 116 if (!is_object($obj)) $obj =& new PEAR_Error('Unknown Database Driver: '.$dsninfo['phptype'],-1); 117 return $obj; 118 } 119 120 /** 121 * Create a new DB object and connect to the specified database 122 * 123 * @param $dsn mixed "data source name", see the DB::parseDSN 124 * method for a description of the dsn format. Can also be 125 * specified as an array of the format returned by DB::parseDSN. 126 * 127 * @param $options mixed if boolean (or scalar), tells whether 128 * this connection should be persistent (for backends that support 129 * this). This parameter can also be an array of options, see 130 * DB_common::setOption for more information on connection 131 * options. 132 * 133 * @return object a newly created DB connection object, or a DB 134 * error object on error 135 * 136 * @see DB::parseDSN 137 * @see DB::isError 138 */ 139 function &connect($dsn, $options = false) 140 { 141 if (is_array($dsn)) { 142 $dsninfo = $dsn; 143 } else { 144 $dsninfo = DB::parseDSN($dsn); 145 } 146 switch ($dsninfo["phptype"]) { 147 case 'pgsql': $type = 'postgres7'; break; 148 case 'ifx': $type = 'informix9'; break; 149 default: $type = $dsninfo["phptype"]; break; 150 } 151 152 if (is_array($options) && isset($options["debug"]) && 153 $options["debug"] >= 2) { 154 // expose php errors with sufficient debug level 155 @include_once("adodb-$type.inc.php"); 156 } else { 157 @include_once("adodb-$type.inc.php"); 158 } 159 160 @$obj =& NewADOConnection($type); 161 if (!is_object($obj)) { 162 $obj =& new PEAR_Error('Unknown Database Driver: '.$dsninfo['phptype'],-1); 163 return $obj; 164 } 165 if (is_array($options)) { 166 foreach($options as $k => $v) { 167 switch(strtolower($k)) { 168 case 'persist': 169 case 'persistent': $persist = $v; break; 170 #ibase 171 case 'dialect': $obj->dialect = $v; break; 172 case 'charset': $obj->charset = $v; break; 173 case 'buffers': $obj->buffers = $v; break; 174 #ado 175 case 'charpage': $obj->charPage = $v; break; 176 #mysql 177 case 'clientflags': $obj->clientFlags = $v; break; 178 } 179 } 180 } else { 181 $persist = false; 182 } 183 184 if (isset($dsninfo['socket'])) $dsninfo['hostspec'] .= ':'.$dsninfo['socket']; 185 else if (isset($dsninfo['port'])) $dsninfo['hostspec'] .= ':'.$dsninfo['port']; 186 187 if($persist) $ok = $obj->PConnect($dsninfo['hostspec'], $dsninfo['username'],$dsninfo['password'],$dsninfo['database']); 188 else $ok = $obj->Connect($dsninfo['hostspec'], $dsninfo['username'],$dsninfo['password'],$dsninfo['database']); 189 190 if (!$ok) $obj = ADODB_PEAR_Error(); 191 return $obj; 192 } 193 194 /** 195 * Return the DB API version 196 * 197 * @return int the DB API version number 198 */ 199 function apiVersion() 200 { 201 return 2; 202 } 203 204 /** 205 * Tell whether a result code from a DB method is an error 206 * 207 * @param $value int result code 208 * 209 * @return bool whether $value is an error 210 */ 211 function isError($value) 212 { 213 if (!is_object($value)) return false; 214 $class = get_class($value); 215 return $class == 'pear_error' || is_subclass_of($value, 'pear_error') || 216 $class == 'db_error' || is_subclass_of($value, 'db_error'); 217 } 218 219 220 /** 221 * Tell whether a result code from a DB method is a warning. 222 * Warnings differ from errors in that they are generated by DB, 223 * and are not fatal. 224 * 225 * @param $value mixed result value 226 * 227 * @return bool whether $value is a warning 228 */ 229 function isWarning($value) 230 { 231 return false; 232 /* 233 return is_object($value) && 234 (get_class( $value ) == "db_warning" || 235 is_subclass_of($value, "db_warning"));*/ 236 } 237 238 /** 239 * Parse a data source name 240 * 241 * @param $dsn string Data Source Name to be parsed 242 * 243 * @return array an associative array with the following keys: 244 * 245 * phptype: Database backend used in PHP (mysql, odbc etc.) 246 * dbsyntax: Database used with regards to SQL syntax etc. 247 * protocol: Communication protocol to use (tcp, unix etc.) 248 * hostspec: Host specification (hostname[:port]) 249 * database: Database to use on the DBMS server 250 * username: User name for login 251 * password: Password for login 252 * 253 * The format of the supplied DSN is in its fullest form: 254 * 255 * phptype(dbsyntax)://username:password@protocol+hostspec/database 256 * 257 * Most variations are allowed: 258 * 259 * phptype://username:password@protocol+hostspec:110//usr/db_file.db 260 * phptype://username:password@hostspec/database_name 261 * phptype://username:password@hostspec 262 * phptype://username@hostspec 263 * phptype://hostspec/database 264 * phptype://hostspec 265 * phptype(dbsyntax) 266 * phptype 267 * 268 * @author Tomas V.V.Cox <cox@idecnet.com> 269 */ 270 function parseDSN($dsn) 271 { 272 if (is_array($dsn)) { 273 return $dsn; 274 } 275 276 $parsed = array( 277 'phptype' => false, 278 'dbsyntax' => false, 279 'protocol' => false, 280 'hostspec' => false, 281 'database' => false, 282 'username' => false, 283 'password' => false 284 ); 285 286 // Find phptype and dbsyntax 287 if (($pos = strpos($dsn, '://')) !== false) { 288 $str = substr($dsn, 0, $pos); 289 $dsn = substr($dsn, $pos + 3); 290 } else { 291 $str = $dsn; 292 $dsn = NULL; 293 } 294 295 // Get phptype and dbsyntax 296 // $str => phptype(dbsyntax) 297 if (preg_match('|^(.+?)\((.*?)\)$|', $str, $arr)) { 298 $parsed['phptype'] = $arr[1]; 299 $parsed['dbsyntax'] = (empty($arr[2])) ? $arr[1] : $arr[2]; 300 } else { 301 $parsed['phptype'] = $str; 302 $parsed['dbsyntax'] = $str; 303 } 304 305 if (empty($dsn)) { 306 return $parsed; 307 } 308 309 // Get (if found): username and password 310 // $dsn => username:password@protocol+hostspec/database 311 if (($at = strpos($dsn,'@')) !== false) { 312 $str = substr($dsn, 0, $at); 313 $dsn = substr($dsn, $at + 1); 314 if (($pos = strpos($str, ':')) !== false) { 315 $parsed['username'] = urldecode(substr($str, 0, $pos)); 316 $parsed['password'] = urldecode(substr($str, $pos + 1)); 317 } else { 318 $parsed['username'] = urldecode($str); 319 } 320 } 321 322 // Find protocol and hostspec 323 // $dsn => protocol+hostspec/database 324 if (($pos=strpos($dsn, '/')) !== false) { 325 $str = substr($dsn, 0, $pos); 326 $dsn = substr($dsn, $pos + 1); 327 } else { 328 $str = $dsn; 329 $dsn = NULL; 330 } 331 332 // Get protocol + hostspec 333 // $str => protocol+hostspec 334 if (($pos=strpos($str, '+')) !== false) { 335 $parsed['protocol'] = substr($str, 0, $pos); 336 $parsed['hostspec'] = urldecode(substr($str, $pos + 1)); 337 } else { 338 $parsed['hostspec'] = urldecode($str); 339 } 340 341 // Get dabase if any 342 // $dsn => database 343 if (!empty($dsn)) { 344 $parsed['database'] = $dsn; 345 } 346 347 return $parsed; 348 } 349 350 /** 351 * Load a PHP database extension if it is not loaded already. 352 * 353 * @access public 354 * 355 * @param $name the base name of the extension (without the .so or 356 * .dll suffix) 357 * 358 * @return bool true if the extension was already or successfully 359 * loaded, false if it could not be loaded 360 */ 361 function assertExtension($name) 362 { 363 if (!extension_loaded($name)) { 364 $dlext = (strncmp(PHP_OS,'WIN',3) === 0) ? '.dll' : '.so'; 365 @dl($name . $dlext); 366 } 367 if (!extension_loaded($name)) { 368 return false; 369 } 370 return true; 371 } 372 } 373 374 ?>
titre
Description
Corps
titre
Description
Corps
titre
Description
Corps
titre
Corps
Généré le : Sun Feb 25 10:22:19 2007 | par Balluche grâce à PHPXref 0.7 |