blob: 65fb87f92bb1157a40d7430a89e95884ca53c80b [file] [log] [blame]
admin7b613c72006-09-24 18:05:17 +00001<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
2/**
3 * Code Igniter
4 *
5 * An open source application development framework for PHP 4.3.2 or newer
6 *
7 * @package CodeIgniter
8 * @author Rick Ellis
9 * @copyright Copyright (c) 2006, pMachine, Inc.
10 * @license http://www.codeignitor.com/user_guide/license.html
11 * @link http://www.codeigniter.com
12 * @since Version 1.0
13 * @filesource
14 */
admine5bb9362006-09-27 00:31:22 +000015
admin7b613c72006-09-24 18:05:17 +000016// ------------------------------------------------------------------------
17
18/**
19 * MySQL Utility Class
20 *
21 * @category Database
22 * @author Rick Ellis
23 * @link http://www.codeigniter.com/user_guide/database/
24 */
admina5e812c2006-09-25 02:17:30 +000025class CI_DB_mysql_utility extends CI_DB_utility {
admin7b613c72006-09-24 18:05:17 +000026
admin6ca6f942006-09-25 02:51:08 +000027 /**
28 * Create database
29 *
admin6cec6a52006-09-25 06:56:49 +000030 * @access private
admin6ca6f942006-09-25 02:51:08 +000031 * @param string the database name
32 * @return bool
33 */
admin6cec6a52006-09-25 06:56:49 +000034 function _create_database($name)
admin6ca6f942006-09-25 02:51:08 +000035 {
admin6cec6a52006-09-25 06:56:49 +000036 return "CREATE DATABASE ".$name;
admin6ca6f942006-09-25 02:51:08 +000037 }
38
39 // --------------------------------------------------------------------
40
41 /**
42 * Drop database
43 *
admin83b05a82006-09-25 21:06:46 +000044 * @access private
admin6ca6f942006-09-25 02:51:08 +000045 * @param string the database name
46 * @return bool
47 */
admin83b05a82006-09-25 21:06:46 +000048 function _drop_database($name)
admin6ca6f942006-09-25 02:51:08 +000049 {
admin83b05a82006-09-25 21:06:46 +000050 return "DROP DATABASE ".$name;
admin6ca6f942006-09-25 02:51:08 +000051 }
52
53 // --------------------------------------------------------------------
admina5e812c2006-09-25 02:17:30 +000054
admin7b613c72006-09-24 18:05:17 +000055 /**
admin72496372006-09-25 03:44:04 +000056 * List databases
57 *
admin83b05a82006-09-25 21:06:46 +000058 * @access private
admin72496372006-09-25 03:44:04 +000059 * @return bool
60 */
admin83b05a82006-09-25 21:06:46 +000061 function _list_databases()
admin72496372006-09-25 03:44:04 +000062 {
admin83b05a82006-09-25 21:06:46 +000063 return "SHOW DATABASES";
admin72496372006-09-25 03:44:04 +000064 }
65
66 // --------------------------------------------------------------------
67
68 /**
admin9cd4e8e2006-09-25 23:26:25 +000069 * Show table query
70 *
71 * Generates a platform-specific query string so that the table names can be fetched
72 *
73 * @access private
74 * @return string
75 */
76 function _list_tables()
77 {
78 return "SHOW TABLES FROM `".$this->db->database."`";
79 }
80
81 // --------------------------------------------------------------------
82
83 /**
admin4ceac2d2006-09-25 06:40:16 +000084 * Drop Table
85 *
admin83b05a82006-09-25 21:06:46 +000086 * @access private
admin4ceac2d2006-09-25 06:40:16 +000087 * @return bool
88 */
admin83b05a82006-09-25 21:06:46 +000089 function _drop_table($table)
admin4ceac2d2006-09-25 06:40:16 +000090 {
admin83b05a82006-09-25 21:06:46 +000091 return "DROP TABLE IF EXISTS ".$this->db->_escape_table($name);
admin4ceac2d2006-09-25 06:40:16 +000092 }
93
94 // --------------------------------------------------------------------
95
96 /**
adminab4f61b2006-09-25 22:12:32 +000097 * Optimize table query
98 *
99 * Generates a platform-specific query so that a table can be optimized
100 *
101 * @access private
102 * @param string the table name
103 * @return object
104 */
105 function _optimize_table($table)
106 {
107 return "OPTIMIZE TABLE ".$this->db->_escape_table($table);
108 }
109
110 // --------------------------------------------------------------------
111
112 /**
113 * Repair table query
114 *
115 * Generates a platform-specific query so that a table can be repaired
116 *
117 * @access private
118 * @param string the table name
119 * @return object
120 */
121 function _repair_table($table)
122 {
123 return "REPAIR TABLE ".$this->db->_escape_table($table);
124 }
125
admin051402b2006-09-29 23:11:40 +0000126 // --------------------------------------------------------------------
adminab4f61b2006-09-25 22:12:32 +0000127
admin051402b2006-09-29 23:11:40 +0000128 /**
129 * MySQL Export
130 *
131 * @access public
132 * @param object The query result object
133 * @param array Any preferences
134 * @return string
135 */
136 function export($params = array())
137 {
138 // Set up our default preferences
139 $prefs = array(
140 'tables' => array(),
141 'ignore' => array(),
142 'format' => 'gzip',
143 'download' => TRUE,
144 'filename' => date('Y-m-d-H:i', time()),
145 'filepath' => '',
146 'add_drop' => TRUE,
147 'add_insert' => TRUE,
148 'newline' => "\n"
149 );
150
151 // Did the user submit any preference overrides? If so set them....
152 if (count($params) > 0)
153 {
154 foreach ($prefs as $key => $val)
155 {
156 if (isset($params[$key]))
157 {
158 $prefs[$key] = $params[$key];
159 }
160 }
161 }
162
163 // Extract the prefs for simplicity
164 extract($prefs);
165
166 // Are we backing up a complete database or individual tables?
167 if (count($tables) == 0)
168 {
169 $tables = $this->list_tables();
170 }
171
172
173
174 // Start buffering the output
175 ob_start();
176
177 // Build the output
178 foreach ($tables as $table)
179 {
180 // Is the table in the "ignore" list?
181 if (in_array($table, $ignore))
182 {
183 continue;
184 }
185
186 // Get the table schema
187 $query = $this->db->query("SHOW CREATE TABLE `".$this->db->database.'`.'.$table);
188
189 // No result means the table name was invalid
190 if ($query === FALSE)
191 {
192 continue;
193 }
194
195 // Write out the table schema
196
197 echo $newline.$newline.'#'.$newline.'# TABLE STRUCTURE FOR: '.$table.$newline.'#'.$newline.$newline;
198
199 if ($add_drop == TRUE)
200 {
201 echo 'DROP TABLE IF EXISTS '.$table.';'.$newline.$newline;
202 }
203
204 $i = 0;
205 $result = $query->result_array();
206 foreach ($result[0] as $val)
207 {
208 if ($i++ % 2)
209 {
210 echo $val.';'.$newline.$newline;
211 }
212 }
213
214 // Build the insert statements
215
216 if ($add_insert == FALSE)
217 {
218 continue;
219 }
220
221 $query = $this->db->query("SELECT * FROM $table");
222
223 if ($query->num_rows() == 0)
224 {
225 continue;
226 }
227
228 // Grab the field names and determine if the field is an
229 // integer type. We use this info to decide whether to
230 // surround the data with quotes or not
231
232 $i = 0;
233 $fields = '';
234 $is_int = array();
235 while ($field = mysql_fetch_field($query->result_id))
236 {
237 $is_int[$i] = (in_array(
238 mysql_field_type($query->result_id, $i),
239 array('tinyint', 'smallint', 'mediumint', 'int', 'bigint', 'timestamp'),
240 TRUE)
241 ) ? TRUE : FALSE;
242
243 // Create a string of field names
244 $fields .= $field->name.', ';
245 $i++;
246 }
247
248 $fields = preg_replace( "/, $/" , "" , $fields);
249
250
251 // Build the inserts
252 foreach ($query->result_array() as $row)
253 {
254 $values = '';
255
256 $i = 0;
257 foreach ($row as $v)
258 {
259 $v = str_replace(array("\x00", "\x0a", "\x0d", "\x1a"), array('\0', '\n', '\r', '\Z'), $v);
260 $v = str_replace(array("\n", "\r", "\t"), array('\n', '\r', '\t'), $v);
261 $v = str_replace('\\', '\\\\', $v);
262 $v = str_replace('\'', '\\\'', $v);
263 $v = str_replace('\\\n', '\n', $v);
264 $v = str_replace('\\\r', '\r', $v);
265 $v = str_replace('\\\t', '\t', $v);
266
267 // Escape the data if it's not an integer type
268 $values .= ($is_int[$i] == FALSE) ? $this->db->escape($v) : $v;
269 $values .= ', ';
270
271 $i++;
272 }
273
274 $values = preg_replace( "/, $/" , "" , $values);
275
276 if ($download == FALSE)
277 {
278 $values = htmlspecialchars($values);
279 }
280
281 // Build the INSERT string
282 echo 'INSERT INTO '.$table.' ('.$fields.') VALUES ('.$values.');'.$newline;
283
284 }
285
286
287
288 $buffer = ob_get_contents();
289 @ob_end_clean();
290
291 echo $buffer;
292
293 }
294
295
296 }
admina5e812c2006-09-25 02:17:30 +0000297
admin6ca6f942006-09-25 02:51:08 +0000298
admin7b613c72006-09-24 18:05:17 +0000299}
300
301?>