[ Index ] |
PHP Cross Reference of Unnamed Project |
[Summary view] [Print] [Text view]
1 <?php 2 /*************************************************************************** 3 * mssql.php 4 * ------------------- 5 * begin : Saturday, Feb 13, 2001 6 * copyright : (C) 2001 The phpBB Group 7 * email : supportphpbb.com 8 * 9 * $Id: mssql.php 5615 2006-03-09 19:57:47Z grahamje $ 10 * 11 ***************************************************************************/ 12 13 /*************************************************************************** 14 * 15 * This program is free software; you can redistribute it and/or modify 16 * it under the terms of the GNU General Public License as published by 17 * the Free Software Foundation; either version 2 of the License, or 18 * (at your option) any later version. 19 * 20 ***************************************************************************/ 21 22 if(!defined("SQL_LAYER")) 23 { 24 25 define("SQL_LAYER","mssql"); 26 27 class sql_db 28 { 29 30 var $db_connect_id; 31 var $result; 32 33 var $next_id; 34 var $in_transaction = 0; 35 36 var $row = array(); 37 var $rowset = array(); 38 var $limit_offset; 39 var $query_limit_success; 40 41 var $num_queries = 0; 42 43 // 44 // Constructor 45 // 46 function sql_db($sqlserver, $sqluser, $sqlpassword, $database, $persistency = true) 47 { 48 $this->persistency = $persistency; 49 $this->user = $sqluser; 50 $this->password = $sqlpassword; 51 $this->server = $sqlserver; 52 $this->dbname = $database; 53 54 $this->db_connect_id = ( $this->persistency ) ? @mssql_pconnect($this->server, $this->user, $this->password) : @mssql_connect($this->server, $this->user, $this->password); 55 56 if( $this->db_connect_id && $this->dbname != "" ) 57 { 58 if( !mssql_select_db($this->dbname, $this->db_connect_id) ) 59 { 60 mssql_close($this->db_connect_id); 61 return false; 62 } 63 } 64 65 return $this->db_connect_id; 66 } 67 68 // 69 // Other base methods 70 // 71 function sql_close() 72 { 73 if($this->db_connect_id) 74 { 75 // 76 // Commit any remaining transactions 77 // 78 if( $this->in_transaction ) 79 { 80 @mssql_query("COMMIT", $this->db_connect_id); 81 } 82 83 return @mssql_close($this->db_connect_id); 84 } 85 else 86 { 87 return false; 88 } 89 } 90 91 92 // 93 // Query method 94 // 95 function sql_query($query = '', $transaction = FALSE) 96 { 97 // 98 // Remove any pre-existing queries 99 // 100 unset($this->result); 101 unset($this->row); 102 103 if ( $query != '' ) 104 { 105 $this->num_queries++; 106 107 if ( $transaction == BEGIN_TRANSACTION && !$this->in_transaction ) 108 { 109 if ( !@mssql_query('BEGIN TRANSACTION', $this->db_connect_id) ) 110 { 111 return false; 112 } 113 $this->in_transaction = TRUE; 114 } 115 116 // 117 // Does query contain any LIMIT code? If so pull out relevant start and num_results 118 // This isn't terribly easy with MSSQL, whatever you do will potentially impact 119 // performance compared to an 'in-built' limit 120 // 121 // Another issue is the 'lack' of a returned true value when a query is valid but has 122 // no result set (as with all the other DB interfaces). It seems though that it's 123 // 'fair' to say that if a query returns a false result (ie. no resource id) then the 124 // SQL was valid but had no result set. If the query returns nothing but the rowcount 125 // returns something then there's a problem. This may well be a false assumption though 126 // ... needs checking under Windows itself. 127 // 128 if( preg_match('#^SELECT(.*?)(LIMIT ([0-9]+)[, ]*([0-9]+)*)?$#s', $query, $limits) ) 129 { 130 $query = $limits[1]; 131 132 if( !empty($limits[2]) ) 133 { 134 $row_offset = ( $limits[4] ) ? $limits[3] : ""; 135 $num_rows = ( $limits[4] ) ? $limits[4] : $limits[3]; 136 137 $query = 'TOP ' . ( $row_offset + $num_rows ) . $query; 138 } 139 140 $this->result = @mssql_query("SELECT $query", $this->db_connect_id); 141 142 if( $this->result ) 143 { 144 $this->limit_offset[$this->result] = ( !empty($row_offset) ) ? $row_offset : 0; 145 146 if( $row_offset > 0 ) 147 { 148 @mssql_data_seek($this->result, $row_offset); 149 } 150 } 151 } 152 else if( preg_match('#^INSERT #i', $query) ) 153 { 154 if( @mssql_query($query, $this->db_connect_id) ) 155 { 156 $this->result = time() + microtime(); 157 158 $result_id = @mssql_query('SELECT @@IDENTITY AS id, @@ROWCOUNT as affected', $this->db_connect_id); 159 if( $result_id ) 160 { 161 if( $row = @mssql_fetch_array($result_id) ) 162 { 163 $this->next_id[$this->db_connect_id] = $row['id']; 164 $this->affected_rows[$this->db_connect_id] = $row['affected']; 165 } 166 } 167 } 168 } 169 else 170 { 171 if( @mssql_query($query, $this->db_connect_id) ) 172 { 173 $this->result = time() + microtime(); 174 175 $result_id = @mssql_query('SELECT @@ROWCOUNT as affected', $this->db_connect_id); 176 if( $result_id ) 177 { 178 if( $row = @mssql_fetch_array($result_id) ) 179 { 180 $this->affected_rows[$this->db_connect_id] = $row['affected']; 181 } 182 } 183 } 184 } 185 186 if( !$this->result ) 187 { 188 if( $this->in_transaction ) 189 { 190 @mssql_query('ROLLBACK', $this->db_connect_id); 191 $this->in_transaction = FALSE; 192 } 193 194 return false; 195 } 196 197 if( $transaction == END_TRANSACTION && $this->in_transaction ) 198 { 199 $this->in_transaction = FALSE; 200 201 if( !@mssql_query('COMMIT', $this->db_connect_id) ) 202 { 203 @mssql_query("ROLLBACK", $this->db_connect_id); 204 return false; 205 } 206 } 207 208 return $this->result; 209 } 210 else 211 { 212 if( $transaction == END_TRANSACTION && $this->in_transaction ) 213 { 214 $this->in_transaction = FALSE; 215 216 if( !@mssql_query('COMMIT', $this->db_connect_id) ) 217 { 218 @mssql_query('ROLLBACK', $this->db_connect_id); 219 return false; 220 } 221 } 222 223 return true; 224 } 225 } 226 227 // 228 // Other query methods 229 // 230 function sql_numrows($query_id = 0) 231 { 232 if( !$query_id ) 233 { 234 $query_id = $this->result; 235 } 236 237 if( $query_id ) 238 { 239 return ( !empty($this->limit_offset[$query_id]) ) ? @mssql_num_rows($query_id) - $this->limit_offset[$query_id] : @mssql_num_rows($query_id); 240 } 241 else 242 { 243 return false; 244 } 245 } 246 247 function sql_numfields($query_id = 0) 248 { 249 if( !$query_id ) 250 { 251 $query_id = $this->result; 252 } 253 254 return ( $query_id ) ? @mssql_num_fields($query_id) : false; 255 } 256 257 function sql_fieldname($offset, $query_id = 0) 258 { 259 if( !$query_id ) 260 { 261 $query_id = $this->result; 262 } 263 264 return ( $query_id ) ? @mssql_field_name($query_id, $offset) : false; 265 } 266 267 function sql_fieldtype($offset, $query_id = 0) 268 { 269 if(!$query_id) 270 { 271 $query_id = $this->result; 272 } 273 274 return ( $query_id ) ? @mssql_field_type($query_id, $offset) : false; 275 } 276 277 function sql_fetchrow($query_id = 0) 278 { 279 if( !$query_id ) 280 { 281 $query_id = $this->result; 282 } 283 284 if( $query_id ) 285 { 286 empty($row); 287 288 $row = @mssql_fetch_array($query_id); 289 290 while( list($key, $value) = @each($row) ) 291 { 292 $row[$key] = ($value === ' ') ? '' : stripslashes($value); 293 } 294 @reset($row); 295 296 return $row; 297 } 298 else 299 { 300 return false; 301 } 302 } 303 304 function sql_fetchrowset($query_id = 0) 305 { 306 if( !$query_id ) 307 { 308 $query_id = $this->result; 309 } 310 311 if( $query_id ) 312 { 313 $i = 0; 314 empty($rowset); 315 316 while( $row = @mssql_fetch_array($query_id)) 317 { 318 while( list($key, $value) = @each($row) ) 319 { 320 $rowset[$i][$key] = ($value === ' ') ? '' : stripslashes($value); 321 } 322 $i++; 323 } 324 @reset($rowset); 325 326 return $rowset; 327 } 328 else 329 { 330 return false; 331 } 332 } 333 334 function sql_fetchfield($field, $row = -1, $query_id) 335 { 336 if( !$query_id ) 337 { 338 $query_id = $this->result; 339 } 340 341 if( $query_id ) 342 { 343 if( $row != -1 ) 344 { 345 if( $this->limit_offset[$query_id] > 0 ) 346 { 347 $result = ( !empty($this->limit_offset[$query_id]) ) ? @mssql_result($this->result, ($this->limit_offset[$query_id] + $row), $field) : false; 348 } 349 else 350 { 351 $result = @mssql_result($this->result, $row, $field); 352 } 353 } 354 else 355 { 356 if( empty($this->row[$query_id]) ) 357 { 358 $this->row[$query_id] = @mssql_fetch_array($query_id); 359 $result = ($this->row[$query_id][$field] === ' ') ? '' : stripslashes($this->row[$query_id][$field]); 360 } 361 } 362 363 return $result; 364 } 365 else 366 { 367 return false; 368 } 369 } 370 371 function sql_rowseek($rownum, $query_id = 0) 372 { 373 if( !$query_id ) 374 { 375 $query_id = $this->result; 376 } 377 378 if( $query_id ) 379 { 380 return ( !empty($this->limit_offset[$query_id]) ) ? @mssql_data_seek($query_id, ($this->limit_offset[$query_id] + $rownum)) : @mssql_data_seek($query_id, $rownum); 381 } 382 else 383 { 384 return false; 385 } 386 } 387 388 function sql_nextid() 389 { 390 return ( $this->next_id[$this->db_connect_id] ) ? $this->next_id[$this->db_connect_id] : false; 391 } 392 393 function sql_affectedrows() 394 { 395 return ( $this->affected_rows[$this->db_connect_id] ) ? $this->affected_rows[$this->db_connect_id] : false; 396 } 397 398 function sql_freeresult($query_id = 0) 399 { 400 if( !$query_id ) 401 { 402 $query_id = $this->result; 403 } 404 405 return ( $query_id ) ? @mssql_free_result($query_id) : false; 406 } 407 408 function sql_error($query_id = 0) 409 { 410 $result['message'] = @mssql_get_last_message(); 411 return $result; 412 } 413 414 } // class sql_db 415 416 } // if ... define 417 418 ?>
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Mon Jan 14 19:21:40 2013 | Cross-referenced by PHPXref 0.7.1 |