/lenasys/trunk

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/lenasys/trunk

« back to all changes in this revision

Viewing changes to codeigniter/system/database/drivers/sqlsrv/sqlsrv_driver.php

  • Committer: galaxyAbstractor
  • Date: 2013-04-10 15:49:32 UTC
  • mto: (19.1.5 lenasys)
  • mto: This revision was merged to the branch mainline in revision 23.
  • Revision ID: galaxyabstractor@gmail.com-20130410154932-4vizlzk0ar5gykvi
* Added an simple admin panel to the codeviewer-cmssy stuff
* Redesigned a bit like the mockups - still stuff to come
* Implemented the codeviewer + admin panel again using the Framework CodeIgniter instead 

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
 
2
/**
 
3
 * CodeIgniter
 
4
 *
 
5
 * An open source application development framework for PHP 5.1.6 or newer
 
6
 *
 
7
 * @package             CodeIgniter
 
8
 * @author              ExpressionEngine Dev Team
 
9
 * @copyright   Copyright (c) 2008 - 2011, EllisLab, Inc.
 
10
 * @license             http://codeigniter.com/user_guide/license.html
 
11
 * @link                http://codeigniter.com
 
12
 * @since               Version 1.0
 
13
 * @filesource
 
14
 */
 
15
 
 
16
// ------------------------------------------------------------------------
 
17
 
 
18
/**
 
19
 * SQLSRV Database Adapter Class
 
20
 *
 
21
 * Note: _DB is an extender class that the app controller
 
22
 * creates dynamically based on whether the active record
 
23
 * class is being used or not.
 
24
 *
 
25
 * @package             CodeIgniter
 
26
 * @subpackage  Drivers
 
27
 * @category    Database
 
28
 * @author              ExpressionEngine Dev Team
 
29
 * @link                http://codeigniter.com/user_guide/database/
 
30
 */
 
31
class CI_DB_sqlsrv_driver extends CI_DB {
 
32
 
 
33
        var $dbdriver = 'sqlsrv';
 
34
 
 
35
        // The character used for escaping
 
36
        var $_escape_char = '';
 
37
 
 
38
        // clause and character used for LIKE escape sequences
 
39
        var $_like_escape_str = " ESCAPE '%s' ";
 
40
        var $_like_escape_chr = '!';
 
41
 
 
42
        /**
 
43
         * The syntax to count rows is slightly different across different
 
44
         * database engines, so this string appears in each driver and is
 
45
         * used for the count_all() and count_all_results() functions.
 
46
         */
 
47
        var $_count_string = "SELECT COUNT(*) AS ";
 
48
        var $_random_keyword = ' ASC'; // not currently supported
 
49
 
 
50
        /**
 
51
         * Non-persistent database connection
 
52
         *
 
53
         * @access      private called by the base class
 
54
         * @return      resource
 
55
         */
 
56
        function db_connect($pooling = false)
 
57
        {
 
58
                // Check for a UTF-8 charset being passed as CI's default 'utf8'.
 
59
                $character_set = (0 === strcasecmp('utf8', $this->char_set)) ? 'UTF-8' : $this->char_set;
 
60
 
 
61
                $connection = array(
 
62
                        'UID'                           => empty($this->username) ? '' : $this->username,
 
63
                        'PWD'                           => empty($this->password) ? '' : $this->password,
 
64
                        'Database'                      => $this->database,
 
65
                        'ConnectionPooling' => $pooling ? 1 : 0,
 
66
                        'CharacterSet'          => $character_set,
 
67
                        'ReturnDatesAsStrings' => 1
 
68
                );
 
69
                
 
70
                // If the username and password are both empty, assume this is a 
 
71
                // 'Windows Authentication Mode' connection.
 
72
                if(empty($connection['UID']) && empty($connection['PWD'])) {
 
73
                        unset($connection['UID'], $connection['PWD']);
 
74
                }
 
75
 
 
76
                return sqlsrv_connect($this->hostname, $connection);
 
77
        }
 
78
 
 
79
        // --------------------------------------------------------------------
 
80
 
 
81
        /**
 
82
         * Persistent database connection
 
83
         *
 
84
         * @access      private called by the base class
 
85
         * @return      resource
 
86
         */
 
87
        function db_pconnect()
 
88
        {
 
89
                $this->db_connect(TRUE);
 
90
        }
 
91
 
 
92
        // --------------------------------------------------------------------
 
93
 
 
94
        /**
 
95
         * Reconnect
 
96
         *
 
97
         * Keep / reestablish the db connection if no queries have been
 
98
         * sent for a length of time exceeding the server's idle timeout
 
99
         *
 
100
         * @access      public
 
101
         * @return      void
 
102
         */
 
103
        function reconnect()
 
104
        {
 
105
                // not implemented in MSSQL
 
106
        }
 
107
 
 
108
        // --------------------------------------------------------------------
 
109
 
 
110
        /**
 
111
         * Select the database
 
112
         *
 
113
         * @access      private called by the base class
 
114
         * @return      resource
 
115
         */
 
116
        function db_select()
 
117
        {
 
118
                return $this->_execute('USE ' . $this->database);
 
119
        }
 
120
 
 
121
        // --------------------------------------------------------------------
 
122
 
 
123
        /**
 
124
         * Set client character set
 
125
         *
 
126
         * @access      public
 
127
         * @param       string
 
128
         * @param       string
 
129
         * @return      resource
 
130
         */
 
131
        function db_set_charset($charset, $collation)
 
132
        {
 
133
                // @todo - add support if needed
 
134
                return TRUE;
 
135
        }
 
136
 
 
137
        // --------------------------------------------------------------------
 
138
 
 
139
        /**
 
140
         * Execute the query
 
141
         *
 
142
         * @access      private called by the base class
 
143
         * @param       string  an SQL query
 
144
         * @return      resource
 
145
         */
 
146
        function _execute($sql)
 
147
        {
 
148
                $sql = $this->_prep_query($sql);
 
149
                return sqlsrv_query($this->conn_id, $sql, null, array(
 
150
                        'Scrollable'                            => SQLSRV_CURSOR_STATIC,
 
151
                        'SendStreamParamsAtExec'        => true
 
152
                ));
 
153
        }
 
154
 
 
155
        // --------------------------------------------------------------------
 
156
 
 
157
        /**
 
158
         * Prep the query
 
159
         *
 
160
         * If needed, each database adapter can prep the query string
 
161
         *
 
162
         * @access      private called by execute()
 
163
         * @param       string  an SQL query
 
164
         * @return      string
 
165
         */
 
166
        function _prep_query($sql)
 
167
        {
 
168
                return $sql;
 
169
        }
 
170
 
 
171
        // --------------------------------------------------------------------
 
172
 
 
173
        /**
 
174
         * Begin Transaction
 
175
         *
 
176
         * @access      public
 
177
         * @return      bool
 
178
         */
 
179
        function trans_begin($test_mode = FALSE)
 
180
        {
 
181
                if ( ! $this->trans_enabled)
 
182
                {
 
183
                        return TRUE;
 
184
                }
 
185
 
 
186
                // When transactions are nested we only begin/commit/rollback the outermost ones
 
187
                if ($this->_trans_depth > 0)
 
188
                {
 
189
                        return TRUE;
 
190
                }
 
191
 
 
192
                // Reset the transaction failure flag.
 
193
                // If the $test_mode flag is set to TRUE transactions will be rolled back
 
194
                // even if the queries produce a successful result.
 
195
                $this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE;
 
196
 
 
197
                return sqlsrv_begin_transaction($this->conn_id);
 
198
        }
 
199
 
 
200
        // --------------------------------------------------------------------
 
201
 
 
202
        /**
 
203
         * Commit Transaction
 
204
         *
 
205
         * @access      public
 
206
         * @return      bool
 
207
         */
 
208
        function trans_commit()
 
209
        {
 
210
                if ( ! $this->trans_enabled)
 
211
                {
 
212
                        return TRUE;
 
213
                }
 
214
 
 
215
                // When transactions are nested we only begin/commit/rollback the outermost ones
 
216
                if ($this->_trans_depth > 0)
 
217
                {
 
218
                        return TRUE;
 
219
                }
 
220
 
 
221
                return sqlsrv_commit($this->conn_id);
 
222
        }
 
223
 
 
224
        // --------------------------------------------------------------------
 
225
 
 
226
        /**
 
227
         * Rollback Transaction
 
228
         *
 
229
         * @access      public
 
230
         * @return      bool
 
231
         */
 
232
        function trans_rollback()
 
233
        {
 
234
                if ( ! $this->trans_enabled)
 
235
                {
 
236
                        return TRUE;
 
237
                }
 
238
 
 
239
                // When transactions are nested we only begin/commit/rollback the outermost ones
 
240
                if ($this->_trans_depth > 0)
 
241
                {
 
242
                        return TRUE;
 
243
                }
 
244
 
 
245
                return sqlsrv_rollback($this->conn_id);
 
246
        }
 
247
 
 
248
        // --------------------------------------------------------------------
 
249
 
 
250
        /**
 
251
         * Escape String
 
252
         *
 
253
         * @access      public
 
254
         * @param       string
 
255
         * @param       bool    whether or not the string will be used in a LIKE condition
 
256
         * @return      string
 
257
         */
 
258
        function escape_str($str, $like = FALSE)
 
259
        {
 
260
                // Escape single quotes
 
261
                return str_replace("'", "''", $str);
 
262
        }
 
263
 
 
264
        // --------------------------------------------------------------------
 
265
 
 
266
        /**
 
267
         * Affected Rows
 
268
         *
 
269
         * @access      public
 
270
         * @return      integer
 
271
         */
 
272
        function affected_rows()
 
273
        {
 
274
                return @sqlrv_rows_affected($this->conn_id);
 
275
        }
 
276
 
 
277
        // --------------------------------------------------------------------
 
278
 
 
279
        /**
 
280
        * Insert ID
 
281
        *
 
282
        * Returns the last id created in the Identity column.
 
283
        *
 
284
        * @access public
 
285
        * @return integer
 
286
        */
 
287
        function insert_id()
 
288
        {
 
289
                return $this->query('select @@IDENTITY as insert_id')->row('insert_id');
 
290
        }
 
291
 
 
292
        // --------------------------------------------------------------------
 
293
 
 
294
        /**
 
295
        * Parse major version
 
296
        *
 
297
        * Grabs the major version number from the
 
298
        * database server version string passed in.
 
299
        *
 
300
        * @access private
 
301
        * @param string $version
 
302
        * @return int16 major version number
 
303
        */
 
304
        function _parse_major_version($version)
 
305
        {
 
306
                preg_match('/([0-9]+)\.([0-9]+)\.([0-9]+)/', $version, $ver_info);
 
307
                return $ver_info[1]; // return the major version b/c that's all we're interested in.
 
308
        }
 
309
 
 
310
        // --------------------------------------------------------------------
 
311
 
 
312
        /**
 
313
        * Version number query string
 
314
        *
 
315
        * @access public
 
316
        * @return string
 
317
        */
 
318
        function _version()
 
319
        {
 
320
                $info = sqlsrv_server_info($this->conn_id);
 
321
                return sprintf("select '%s' as ver", $info['SQLServerVersion']);
 
322
        }
 
323
 
 
324
        // --------------------------------------------------------------------
 
325
 
 
326
        /**
 
327
         * "Count All" query
 
328
         *
 
329
         * Generates a platform-specific query string that counts all records in
 
330
         * the specified database
 
331
         *
 
332
         * @access      public
 
333
         * @param       string
 
334
         * @return      string
 
335
         */
 
336
        function count_all($table = '')
 
337
        {
 
338
                if ($table == '')
 
339
                        return '0';
 
340
        
 
341
                $query = $this->query("SELECT COUNT(*) AS numrows FROM " . $this->dbprefix . $table);
 
342
                
 
343
                if ($query->num_rows() == 0)
 
344
                        return '0';
 
345
 
 
346
                $row = $query->row();
 
347
                $this->_reset_select();
 
348
                return $row->numrows;
 
349
        }
 
350
 
 
351
        // --------------------------------------------------------------------
 
352
 
 
353
        /**
 
354
         * List table query
 
355
         *
 
356
         * Generates a platform-specific query string so that the table names can be fetched
 
357
         *
 
358
         * @access      private
 
359
         * @param       boolean
 
360
         * @return      string
 
361
         */
 
362
        function _list_tables($prefix_limit = FALSE)
 
363
        {
 
364
                return "SELECT name FROM sysobjects WHERE type = 'U' ORDER BY name";
 
365
        }
 
366
 
 
367
        // --------------------------------------------------------------------
 
368
 
 
369
        /**
 
370
         * List column query
 
371
         *
 
372
         * Generates a platform-specific query string so that the column names can be fetched
 
373
         *
 
374
         * @access      private
 
375
         * @param       string  the table name
 
376
         * @return      string
 
377
         */
 
378
        function _list_columns($table = '')
 
379
        {
 
380
                return "SELECT * FROM INFORMATION_SCHEMA.Columns WHERE TABLE_NAME = '".$this->_escape_table($table)."'";
 
381
        }
 
382
 
 
383
        // --------------------------------------------------------------------
 
384
 
 
385
        /**
 
386
         * Field data query
 
387
         *
 
388
         * Generates a platform-specific query so that the column data can be retrieved
 
389
         *
 
390
         * @access      public
 
391
         * @param       string  the table name
 
392
         * @return      object
 
393
         */
 
394
        function _field_data($table)
 
395
        {
 
396
                return "SELECT TOP 1 * FROM " . $this->_escape_table($table);   
 
397
        }
 
398
 
 
399
        // --------------------------------------------------------------------
 
400
 
 
401
        /**
 
402
         * The error message string
 
403
         *
 
404
         * @access      private
 
405
         * @return      string
 
406
         */
 
407
        function _error_message()
 
408
        {
 
409
                $error = array_shift(sqlsrv_errors());
 
410
                return !empty($error['message']) ? $error['message'] : null;
 
411
        }
 
412
 
 
413
        // --------------------------------------------------------------------
 
414
 
 
415
        /**
 
416
         * The error message number
 
417
         *
 
418
         * @access      private
 
419
         * @return      integer
 
420
         */
 
421
        function _error_number()
 
422
        {
 
423
                $error = array_shift(sqlsrv_errors());
 
424
                return isset($error['SQLSTATE']) ? $error['SQLSTATE'] : null;
 
425
        }
 
426
 
 
427
        // --------------------------------------------------------------------
 
428
 
 
429
        /**
 
430
         * Escape Table Name
 
431
         *
 
432
         * This function adds backticks if the table name has a period
 
433
         * in it. Some DBs will get cranky unless periods are escaped
 
434
         *
 
435
         * @access      private
 
436
         * @param       string  the table name
 
437
         * @return      string
 
438
         */
 
439
        function _escape_table($table)
 
440
        {
 
441
                return $table;
 
442
        }       
 
443
 
 
444
 
 
445
        /**
 
446
         * Escape the SQL Identifiers
 
447
         *
 
448
         * This function escapes column and table names
 
449
         *
 
450
         * @access      private
 
451
         * @param       string
 
452
         * @return      string
 
453
         */
 
454
        function _escape_identifiers($item)
 
455
        {
 
456
                return $item;
 
457
        }
 
458
 
 
459
        // --------------------------------------------------------------------
 
460
 
 
461
        /**
 
462
         * From Tables
 
463
         *
 
464
         * This function implicitly groups FROM tables so there is no confusion
 
465
         * about operator precedence in harmony with SQL standards
 
466
         *
 
467
         * @access      public
 
468
         * @param       type
 
469
         * @return      type
 
470
         */
 
471
        function _from_tables($tables)
 
472
        {
 
473
                if ( ! is_array($tables))
 
474
                {
 
475
                        $tables = array($tables);
 
476
                }
 
477
 
 
478
                return implode(', ', $tables);
 
479
        }
 
480
 
 
481
        // --------------------------------------------------------------------
 
482
 
 
483
        /**
 
484
         * Insert statement
 
485
         *
 
486
         * Generates a platform-specific insert string from the supplied data
 
487
         *
 
488
         * @access      public
 
489
         * @param       string  the table name
 
490
         * @param       array   the insert keys
 
491
         * @param       array   the insert values
 
492
         * @return      string
 
493
         */
 
494
        function _insert($table, $keys, $values)
 
495
        {       
 
496
                return "INSERT INTO ".$this->_escape_table($table)." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")";
 
497
        }
 
498
 
 
499
        // --------------------------------------------------------------------
 
500
 
 
501
        /**
 
502
         * Update statement
 
503
         *
 
504
         * Generates a platform-specific update string from the supplied data
 
505
         *
 
506
         * @access      public
 
507
         * @param       string  the table name
 
508
         * @param       array   the update data
 
509
         * @param       array   the where clause
 
510
         * @param       array   the orderby clause
 
511
         * @param       array   the limit clause
 
512
         * @return      string
 
513
         */
 
514
        function _update($table, $values, $where)
 
515
        {
 
516
                foreach($values as $key => $val)
 
517
                {
 
518
                        $valstr[] = $key." = ".$val;
 
519
                }
 
520
        
 
521
                return "UPDATE ".$this->_escape_table($table)." SET ".implode(', ', $valstr)." WHERE ".implode(" ", $where);
 
522
        }
 
523
        
 
524
        // --------------------------------------------------------------------
 
525
 
 
526
        /**
 
527
         * Truncate statement
 
528
         *
 
529
         * Generates a platform-specific truncate string from the supplied data
 
530
         * If the database does not support the truncate() command
 
531
         * This function maps to "DELETE FROM table"
 
532
         *
 
533
         * @access      public
 
534
         * @param       string  the table name
 
535
         * @return      string
 
536
         */
 
537
        function _truncate($table)
 
538
        {
 
539
                return "TRUNCATE ".$table;
 
540
        }
 
541
 
 
542
        // --------------------------------------------------------------------
 
543
 
 
544
        /**
 
545
         * Delete statement
 
546
         *
 
547
         * Generates a platform-specific delete string from the supplied data
 
548
         *
 
549
         * @access      public
 
550
         * @param       string  the table name
 
551
         * @param       array   the where clause
 
552
         * @param       string  the limit clause
 
553
         * @return      string
 
554
         */
 
555
        function _delete($table, $where)
 
556
        {
 
557
                return "DELETE FROM ".$this->_escape_table($table)." WHERE ".implode(" ", $where);
 
558
        }
 
559
 
 
560
        // --------------------------------------------------------------------
 
561
 
 
562
        /**
 
563
         * Limit string
 
564
         *
 
565
         * Generates a platform-specific LIMIT clause
 
566
         *
 
567
         * @access      public
 
568
         * @param       string  the sql query string
 
569
         * @param       integer the number of rows to limit the query to
 
570
         * @param       integer the offset value
 
571
         * @return      string
 
572
         */
 
573
        function _limit($sql, $limit, $offset)
 
574
        {
 
575
                $i = $limit + $offset;
 
576
        
 
577
                return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$i.' ', $sql);               
 
578
        }
 
579
 
 
580
        // --------------------------------------------------------------------
 
581
 
 
582
        /**
 
583
         * Close DB Connection
 
584
         *
 
585
         * @access      public
 
586
         * @param       resource
 
587
         * @return      void
 
588
         */
 
589
        function _close($conn_id)
 
590
        {
 
591
                @sqlsrv_close($conn_id);
 
592
        }
 
593
 
 
594
}
 
595
 
 
596
 
 
597
 
 
598
/* End of file mssql_driver.php */
 
599
/* Location: ./system/database/drivers/mssql/mssql_driver.php */
 
 
b'\\ No newline at end of file'