source: sourcecode/system/database/DB_utility.php @ 1

Last change on this file since 1 was 1, checked in by dungnv, 11 years ago
File size: 9.6 KB
Line 
1<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
2/**
3 * Code Igniter
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 * Database Utility Class
20 *
21 * @category    Database
22 * @author              ExpressionEngine Dev Team
23 * @link                http://codeigniter.com/user_guide/database/
24 */
25class CI_DB_utility extends CI_DB_forge {
26
27        var $db;
28        var $data_cache         = array();
29
30        /**
31         * Constructor
32         *
33         * Grabs the CI super object instance so we can access it.
34         *
35         */
36        function __construct()
37        {
38                // Assign the main database object to $this->db
39                $CI =& get_instance();
40                $this->db =& $CI->db;
41
42                log_message('debug', "Database Utility Class Initialized");
43        }
44
45        // --------------------------------------------------------------------
46
47        /**
48         * List databases
49         *
50         * @access      public
51         * @return      bool
52         */
53        function list_databases()
54        {
55                // Is there a cached result?
56                if (isset($this->data_cache['db_names']))
57                {
58                        return $this->data_cache['db_names'];
59                }
60
61                $query = $this->db->query($this->_list_databases());
62                $dbs = array();
63                if ($query->num_rows() > 0)
64                {
65                        foreach ($query->result_array() as $row)
66                        {
67                                $dbs[] = current($row);
68                        }
69                }
70
71                $this->data_cache['db_names'] = $dbs;
72                return $this->data_cache['db_names'];
73        }
74
75        // --------------------------------------------------------------------
76
77        /**
78         * Determine if a particular database exists
79         *
80         * @access      public
81         * @param       string
82         * @return      boolean
83         */
84        function database_exists($database_name)
85        {
86                // Some databases won't have access to the list_databases() function, so
87                // this is intended to allow them to override with their own functions as
88                // defined in $driver_utility.php
89                if (method_exists($this, '_database_exists'))
90                {
91                        return $this->_database_exists($database_name);
92                }
93                else
94                {
95                        return ( ! in_array($database_name, $this->list_databases())) ? FALSE : TRUE;
96                }
97        }
98
99
100        // --------------------------------------------------------------------
101
102        /**
103         * Optimize Table
104         *
105         * @access      public
106         * @param       string  the table name
107         * @return      bool
108         */
109        function optimize_table($table_name)
110        {
111                $sql = $this->_optimize_table($table_name);
112
113                if (is_bool($sql))
114                {
115                                show_error('db_must_use_set');
116                }
117
118                $query = $this->db->query($sql);
119                $res = $query->result_array();
120
121                // Note: Due to a bug in current() that affects some versions
122                // of PHP we can not pass function call directly into it
123                return current($res);
124        }
125
126        // --------------------------------------------------------------------
127
128        /**
129         * Optimize Database
130         *
131         * @access      public
132         * @return      array
133         */
134        function optimize_database()
135        {
136                $result = array();
137                foreach ($this->db->list_tables() as $table_name)
138                {
139                        $sql = $this->_optimize_table($table_name);
140
141                        if (is_bool($sql))
142                        {
143                                return $sql;
144                        }
145
146                        $query = $this->db->query($sql);
147
148                        // Build the result array...
149                        // Note: Due to a bug in current() that affects some versions
150                        // of PHP we can not pass function call directly into it
151                        $res = $query->result_array();
152                        $res = current($res);
153                        $key = str_replace($this->db->database.'.', '', current($res));
154                        $keys = array_keys($res);
155                        unset($res[$keys[0]]);
156
157                        $result[$key] = $res;
158                }
159
160                return $result;
161        }
162
163        // --------------------------------------------------------------------
164
165        /**
166         * Repair Table
167         *
168         * @access      public
169         * @param       string  the table name
170         * @return      bool
171         */
172        function repair_table($table_name)
173        {
174                $sql = $this->_repair_table($table_name);
175
176                if (is_bool($sql))
177                {
178                        return $sql;
179                }
180
181                $query = $this->db->query($sql);
182
183                // Note: Due to a bug in current() that affects some versions
184                // of PHP we can not pass function call directly into it
185                $res = $query->result_array();
186                return current($res);
187        }
188
189        // --------------------------------------------------------------------
190
191        /**
192         * Generate CSV from a query result object
193         *
194         * @access      public
195         * @param       object  The query result object
196         * @param       string  The delimiter - comma by default
197         * @param       string  The newline character - \n by default
198         * @param       string  The enclosure - double quote by default
199         * @return      string
200         */
201        function csv_from_result($query, $delim = ",", $newline = "\n", $enclosure = '"')
202        {
203                if ( ! is_object($query) OR ! method_exists($query, 'list_fields'))
204                {
205                        show_error('You must submit a valid result object');
206                }
207
208                $out = '';
209
210                // First generate the headings from the table column names
211                foreach ($query->list_fields() as $name)
212                {
213                        $out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $name).$enclosure.$delim;
214                }
215
216                $out = rtrim($out);
217                $out .= $newline;
218
219                // Next blast through the result array and build out the rows
220                foreach ($query->result_array() as $row)
221                {
222                        foreach ($row as $item)
223                        {
224                                $out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $item).$enclosure.$delim;
225                        }
226                        $out = rtrim($out);
227                        $out .= $newline;
228                }
229
230                return $out;
231        }
232
233        // --------------------------------------------------------------------
234
235        /**
236         * Generate XML data from a query result object
237         *
238         * @access      public
239         * @param       object  The query result object
240         * @param       array   Any preferences
241         * @return      string
242         */
243        function xml_from_result($query, $params = array())
244        {
245                if ( ! is_object($query) OR ! method_exists($query, 'list_fields'))
246                {
247                        show_error('You must submit a valid result object');
248                }
249
250                // Set our default values
251                foreach (array('root' => 'root', 'element' => 'element', 'newline' => "\n", 'tab' => "\t") as $key => $val)
252                {
253                        if ( ! isset($params[$key]))
254                        {
255                                $params[$key] = $val;
256                        }
257                }
258
259                // Create variables for convenience
260                extract($params);
261
262                // Load the xml helper
263                $CI =& get_instance();
264                $CI->load->helper('xml');
265
266                // Generate the result
267                $xml = "<{$root}>".$newline;
268                foreach ($query->result_array() as $row)
269                {
270                        $xml .= $tab."<{$element}>".$newline;
271
272                        foreach ($row as $key => $val)
273                        {
274                                $xml .= $tab.$tab."<{$key}>".xml_convert($val)."</{$key}>".$newline;
275                        }
276                        $xml .= $tab."</{$element}>".$newline;
277                }
278                $xml .= "</$root>".$newline;
279
280                return $xml;
281        }
282
283        // --------------------------------------------------------------------
284
285        /**
286         * Database Backup
287         *
288         * @access      public
289         * @return      void
290         */
291        function backup($params = array())
292        {
293                // If the parameters have not been submitted as an
294                // array then we know that it is simply the table
295                // name, which is a valid short cut.
296                if (is_string($params))
297                {
298                        $params = array('tables' => $params);
299                }
300
301                // ------------------------------------------------------
302
303                // Set up our default preferences
304                $prefs = array(
305                                                        'tables'                => array(),
306                                                        'ignore'                => array(),
307                                                        'filename'              => '',
308                                                        'format'                => 'gzip', // gzip, zip, txt
309                                                        'add_drop'              => TRUE,
310                                                        'add_insert'    => TRUE,
311                                                        'newline'               => "\n"
312                                                );
313
314                // Did the user submit any preferences? If so set them....
315                if (count($params) > 0)
316                {
317                        foreach ($prefs as $key => $val)
318                        {
319                                if (isset($params[$key]))
320                                {
321                                        $prefs[$key] = $params[$key];
322                                }
323                        }
324                }
325
326                // ------------------------------------------------------
327
328                // Are we backing up a complete database or individual tables?
329                // If no table names were submitted we'll fetch the entire table list
330                if (count($prefs['tables']) == 0)
331                {
332                        $prefs['tables'] = $this->db->list_tables();
333                }
334
335                // ------------------------------------------------------
336
337                // Validate the format
338                if ( ! in_array($prefs['format'], array('gzip', 'zip', 'txt'), TRUE))
339                {
340                        $prefs['format'] = 'txt';
341                }
342
343                // ------------------------------------------------------
344
345                // Is the encoder supported?  If not, we'll either issue an
346                // error or use plain text depending on the debug settings
347                if (($prefs['format'] == 'gzip' AND ! @function_exists('gzencode'))
348                OR ($prefs['format'] == 'zip'  AND ! @function_exists('gzcompress')))
349                {
350                        if ($this->db->db_debug)
351                        {
352                                return $this->db->display_error('db_unsuported_compression');
353                        }
354
355                        $prefs['format'] = 'txt';
356                }
357
358                // ------------------------------------------------------
359
360                // Set the filename if not provided - Only needed with Zip files
361                if ($prefs['filename'] == '' AND $prefs['format'] == 'zip')
362                {
363                        $prefs['filename'] = (count($prefs['tables']) == 1) ? $prefs['tables'] : $this->db->database;
364                        $prefs['filename'] .= '_'.date('Y-m-d_H-i', time());
365                }
366
367                // ------------------------------------------------------
368
369                // Was a Gzip file requested?
370                if ($prefs['format'] == 'gzip')
371                {
372                        return gzencode($this->_backup($prefs));
373                }
374
375                // ------------------------------------------------------
376
377                // Was a text file requested?
378                if ($prefs['format'] == 'txt')
379                {
380                        return $this->_backup($prefs);
381                }
382
383                // ------------------------------------------------------
384
385                // Was a Zip file requested?
386                if ($prefs['format'] == 'zip')
387                {
388                        // If they included the .zip file extension we'll remove it
389                        if (preg_match("|.+?\.zip$|", $prefs['filename']))
390                        {
391                                $prefs['filename'] = str_replace('.zip', '', $prefs['filename']);
392                        }
393
394                        // Tack on the ".sql" file extension if needed
395                        if ( ! preg_match("|.+?\.sql$|", $prefs['filename']))
396                        {
397                                $prefs['filename'] .= '.sql';
398                        }
399
400                        // Load the Zip class and output it
401
402                        $CI =& get_instance();
403                        $CI->load->library('zip');
404                        $CI->zip->add_data($prefs['filename'], $this->_backup($prefs));
405                        return $CI->zip->get_zip();
406                }
407
408        }
409
410}
411
412
413/* End of file DB_utility.php */
414/* Location: ./system/database/DB_utility.php */
Note: See TracBrowser for help on using the repository browser.