00001 <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 class CI_DB_odbc_driver extends CI_DB {
00032
00033
00034
00035
00036
00037
00038 var $_count_string = "SELECT COUNT(*) AS ";
00039 var $_random_keyword;
00040
00041
00042 function CI_DB_odbc_driver()
00043 {
00044 $this->_random_keyword = ' RND('.time().')';
00045 }
00046
00047
00048
00049
00050
00051
00052
00053 function db_connect()
00054 {
00055 return @odbc_connect($this->hostname, $this->username, $this->password);
00056 }
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066 function db_pconnect()
00067 {
00068 return @odbc_pconnect($this->hostname, $this->username, $this->password);
00069 }
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079 function db_select()
00080 {
00081
00082 return TRUE;
00083 }
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095 function db_set_charset($charset, $collation)
00096 {
00097
00098 return TRUE;
00099 }
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109 function _version()
00110 {
00111 return "SELECT version() AS ver";
00112 }
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123 function _execute($sql)
00124 {
00125 $sql = $this->_prep_query($sql);
00126 return @odbc_exec($this->conn_id, $sql);
00127 }
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140 function _prep_query($sql)
00141 {
00142 return $sql;
00143 }
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153 function trans_begin($test_mode = FALSE)
00154 {
00155 if ( ! $this->trans_enabled)
00156 {
00157 return TRUE;
00158 }
00159
00160
00161 if ($this->_trans_depth > 0)
00162 {
00163 return TRUE;
00164 }
00165
00166
00167
00168
00169 $this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE;
00170
00171 return odbc_autocommit($this->conn_id, FALSE);
00172 }
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182 function trans_commit()
00183 {
00184 if ( ! $this->trans_enabled)
00185 {
00186 return TRUE;
00187 }
00188
00189
00190 if ($this->_trans_depth > 0)
00191 {
00192 return TRUE;
00193 }
00194
00195 $ret = odbc_commit($this->conn_id);
00196 odbc_autocommit($this->conn_id, TRUE);
00197 return $ret;
00198 }
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208 function trans_rollback()
00209 {
00210 if ( ! $this->trans_enabled)
00211 {
00212 return TRUE;
00213 }
00214
00215
00216 if ($this->_trans_depth > 0)
00217 {
00218 return TRUE;
00219 }
00220
00221 $ret = odbc_rollback($this->conn_id);
00222 odbc_autocommit($this->conn_id, TRUE);
00223 return $ret;
00224 }
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235 function escape_str($str)
00236 {
00237
00238 return $str;
00239 }
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249 function affected_rows()
00250 {
00251 return @odbc_num_rows($this->conn_id);
00252 }
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262 function insert_id()
00263 {
00264 return @odbc_insert_id($this->conn_id);
00265 }
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279 function count_all($table = '')
00280 {
00281 if ($table == '')
00282 return '0';
00283
00284 $query = $this->query($this->_count_string . $this->_protect_identifiers('numrows'). " FROM " . $this->_protect_identifiers($this->dbprefix.$table));
00285
00286 if ($query->num_rows() == 0)
00287 return '0';
00288
00289 $row = $query->row();
00290 return $row->numrows;
00291 }
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304 function _list_tables($prefix_limit = FALSE)
00305 {
00306 $sql = "SHOW TABLES FROM `".$this->database."`";
00307
00308 if ($prefix_limit !== FALSE AND $this->dbprefix != '')
00309 {
00310
00311 return FALSE;
00312 }
00313
00314 return $sql;
00315 }
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328 function _list_columns($table = '')
00329 {
00330 return "SHOW COLUMNS FROM ".$this->_escape_table($table);
00331 }
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344 function _field_data($table)
00345 {
00346 return "SELECT TOP 1 FROM ".$this->_escape_table($table);
00347 }
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357 function _error_message()
00358 {
00359 return odbc_errormsg($this->conn_id);
00360 }
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370 function _error_number()
00371 {
00372 return odbc_error($this->conn_id);
00373 }
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387 function _escape_table($table)
00388 {
00389
00390 return $table;
00391 }
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405 function _protect_identifiers($item, $first_word_only = FALSE)
00406 {
00407 if (is_array($item))
00408 {
00409 $escaped_array = array();
00410
00411 foreach($item as $k=>$v)
00412 {
00413 $escaped_array[$this->_protect_identifiers($k)] = $this->_protect_identifiers($v, $first_word_only);
00414 }
00415
00416 return $escaped_array;
00417 }
00418
00419
00420
00421 if (ctype_alnum($item) === FALSE)
00422 {
00423 if (strpos($item, '.') !== FALSE)
00424 {
00425 $aliased_tables = implode(".",$this->ar_aliased_tables).'.';
00426 $table_name = substr($item, 0, strpos($item, '.')+1);
00427 $item = (strpos($aliased_tables, $table_name) !== FALSE) ? $item = $item : $this->dbprefix.$item;
00428 }
00429
00430
00431 $lbound = ($first_word_only === TRUE) ? '' : '|\s|\(';
00432
00433 $item = preg_replace('/(^'.$lbound.')([\w\d\-\_]+?)(\s|\)|$)/iS', '$1`$2`$3', $item);
00434 }
00435 else
00436 {
00437 return "{$item}";
00438 }
00439
00440 $exceptions = array('AS', '/', '-', '%', '+', '*', 'OR', 'IS');
00441
00442 foreach ($exceptions as $exception)
00443 {
00444
00445 if (stristr($item, " {$exception} ") !== FALSE)
00446 {
00447 $item = preg_replace('/ ('.preg_quote($exception).') /i', ' $1 ', $item);
00448 }
00449 }
00450 return $item;
00451 }
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465 function _from_tables($tables)
00466 {
00467 if ( ! is_array($tables))
00468 {
00469 $tables = array($tables);
00470 }
00471
00472 return '('.implode(', ', $tables).')';
00473 }
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488 function _insert($table, $keys, $values)
00489 {
00490 return "INSERT INTO ".$this->_escape_table($table)." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";
00491 }
00492
00493
00494
00495
00496
00497
00498
00499
00500
00501
00502
00503
00504
00505
00506
00507
00508 function _update($table, $values, $where, $orderby = array(), $limit = FALSE)
00509 {
00510 foreach($values as $key => $val)
00511 {
00512 $valstr[] = $key." = ".$val;
00513 }
00514
00515 $limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
00516
00517 $orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):'';
00518
00519 $sql = "UPDATE ".$this->_escape_table($table)." SET ".implode(', ', $valstr);
00520 $sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : '';
00521 $sql .= $orderby.$limit;
00522
00523 return $sql;
00524 }
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540 function _truncate($table)
00541 {
00542 return $this->_delete($table);
00543 }
00544
00545
00546
00547
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558 function _delete($table, $where = array(), $like = array(), $limit = FALSE)
00559 {
00560 $conditions = '';
00561
00562 if (count($where) > 0 OR count($like) > 0)
00563 {
00564 $conditions = "\nWHERE ";
00565 $conditions .= implode("\n", $this->ar_where);
00566
00567 if (count($where) > 0 && count($like) > 0)
00568 {
00569 $conditions .= " AND ";
00570 }
00571 $conditions .= implode("\n", $like);
00572 }
00573
00574 $limit = ( ! $limit) ? '' : ' LIMIT '.$limit;
00575
00576 return "DELETE FROM ".$table.$conditions.$limit;
00577 }
00578
00579
00580
00581
00582
00583
00584
00585
00586
00587
00588
00589
00590
00591
00592 function _limit($sql, $limit, $offset)
00593 {
00594
00595 return $sql;
00596 }
00597
00598
00599
00600
00601
00602
00603
00604
00605
00606
00607 function _close($conn_id)
00608 {
00609 @odbc_close($conn_id);
00610 }
00611
00612
00613 }
00614
00615
00616
00617
00618