Mercurial > hg > Members > shoshi > webvirt
comparison cake/console/libs/tasks/db_config.php @ 0:261e66bd5a0c
hg init
author | Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 24 Jul 2011 21:08:31 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:261e66bd5a0c |
---|---|
1 <?php | |
2 /** | |
3 * The DbConfig Task handles creating and updating the database.php | |
4 * | |
5 * PHP versions 4 and 5 | |
6 * | |
7 * CakePHP(tm) : Rapid Development Framework (http://cakephp.org) | |
8 * Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org) | |
9 * | |
10 * Licensed under The MIT License | |
11 * Redistributions of files must retain the above copyright notice. | |
12 * | |
13 * @copyright Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org) | |
14 * @link http://cakephp.org CakePHP(tm) Project | |
15 * @package cake | |
16 * @subpackage cake.cake.console.libs.tasks | |
17 * @since CakePHP(tm) v 1.2 | |
18 * @license MIT License (http://www.opensource.org/licenses/mit-license.php) | |
19 */ | |
20 | |
21 /** | |
22 * Task class for creating and updating the database configuration file. | |
23 * | |
24 * @package cake | |
25 * @subpackage cake.cake.console.libs.tasks | |
26 */ | |
27 class DbConfigTask extends Shell { | |
28 | |
29 /** | |
30 * path to CONFIG directory | |
31 * | |
32 * @var string | |
33 * @access public | |
34 */ | |
35 var $path = null; | |
36 | |
37 /** | |
38 * Default configuration settings to use | |
39 * | |
40 * @var array | |
41 * @access private | |
42 */ | |
43 var $__defaultConfig = array( | |
44 'name' => 'default', 'driver'=> 'mysql', 'persistent'=> 'false', 'host'=> 'localhost', | |
45 'login'=> 'root', 'password'=> 'password', 'database'=> 'project_name', | |
46 'schema'=> null, 'prefix'=> null, 'encoding' => null, 'port' => null | |
47 ); | |
48 | |
49 /** | |
50 * String name of the database config class name. | |
51 * Used for testing. | |
52 * | |
53 * @var string | |
54 */ | |
55 var $databaseClassName = 'DATABASE_CONFIG'; | |
56 | |
57 /** | |
58 * initialization callback | |
59 * | |
60 * @var string | |
61 * @access public | |
62 */ | |
63 function initialize() { | |
64 $this->path = $this->params['working'] . DS . 'config' . DS; | |
65 } | |
66 | |
67 /** | |
68 * Execution method always used for tasks | |
69 * | |
70 * @access public | |
71 */ | |
72 function execute() { | |
73 if (empty($this->args)) { | |
74 $this->__interactive(); | |
75 $this->_stop(); | |
76 } | |
77 } | |
78 | |
79 /** | |
80 * Interactive interface | |
81 * | |
82 * @access private | |
83 */ | |
84 function __interactive() { | |
85 $this->hr(); | |
86 $this->out('Database Configuration:'); | |
87 $this->hr(); | |
88 $done = false; | |
89 $dbConfigs = array(); | |
90 | |
91 while ($done == false) { | |
92 $name = ''; | |
93 | |
94 while ($name == '') { | |
95 $name = $this->in("Name:", null, 'default'); | |
96 if (preg_match('/[^a-z0-9_]/i', $name)) { | |
97 $name = ''; | |
98 $this->out('The name may only contain unaccented latin characters, numbers or underscores'); | |
99 } else if (preg_match('/^[^a-z_]/i', $name)) { | |
100 $name = ''; | |
101 $this->out('The name must start with an unaccented latin character or an underscore'); | |
102 } | |
103 } | |
104 | |
105 $driver = $this->in('Driver:', array('db2', 'firebird', 'mssql', 'mysql', 'mysqli', 'odbc', 'oracle', 'postgres', 'sqlite', 'sybase'), 'mysql'); | |
106 | |
107 $persistent = $this->in('Persistent Connection?', array('y', 'n'), 'n'); | |
108 if (strtolower($persistent) == 'n') { | |
109 $persistent = 'false'; | |
110 } else { | |
111 $persistent = 'true'; | |
112 } | |
113 | |
114 $host = ''; | |
115 while ($host == '') { | |
116 $host = $this->in('Database Host:', null, 'localhost'); | |
117 } | |
118 | |
119 $port = ''; | |
120 while ($port == '') { | |
121 $port = $this->in('Port?', null, 'n'); | |
122 } | |
123 | |
124 if (strtolower($port) == 'n') { | |
125 $port = null; | |
126 } | |
127 | |
128 $login = ''; | |
129 while ($login == '') { | |
130 $login = $this->in('User:', null, 'root'); | |
131 } | |
132 $password = ''; | |
133 $blankPassword = false; | |
134 | |
135 while ($password == '' && $blankPassword == false) { | |
136 $password = $this->in('Password:'); | |
137 | |
138 if ($password == '') { | |
139 $blank = $this->in('The password you supplied was empty. Use an empty password?', array('y', 'n'), 'n'); | |
140 if ($blank == 'y') { | |
141 $blankPassword = true; | |
142 } | |
143 } | |
144 } | |
145 | |
146 $database = ''; | |
147 while ($database == '') { | |
148 $database = $this->in('Database Name:', null, 'cake'); | |
149 } | |
150 | |
151 $prefix = ''; | |
152 while ($prefix == '') { | |
153 $prefix = $this->in('Table Prefix?', null, 'n'); | |
154 } | |
155 if (strtolower($prefix) == 'n') { | |
156 $prefix = null; | |
157 } | |
158 | |
159 $encoding = ''; | |
160 while ($encoding == '') { | |
161 $encoding = $this->in('Table encoding?', null, 'n'); | |
162 } | |
163 if (strtolower($encoding) == 'n') { | |
164 $encoding = null; | |
165 } | |
166 | |
167 $schema = ''; | |
168 if ($driver == 'postgres') { | |
169 while ($schema == '') { | |
170 $schema = $this->in('Table schema?', null, 'n'); | |
171 } | |
172 } | |
173 if (strtolower($schema) == 'n') { | |
174 $schema = null; | |
175 } | |
176 | |
177 $config = compact('name', 'driver', 'persistent', 'host', 'login', 'password', 'database', 'prefix', 'encoding', 'port', 'schema'); | |
178 | |
179 while ($this->__verify($config) == false) { | |
180 $this->__interactive(); | |
181 } | |
182 $dbConfigs[] = $config; | |
183 $doneYet = $this->in('Do you wish to add another database configuration?', null, 'n'); | |
184 | |
185 if (strtolower($doneYet == 'n')) { | |
186 $done = true; | |
187 } | |
188 } | |
189 | |
190 $this->bake($dbConfigs); | |
191 config('database'); | |
192 return true; | |
193 } | |
194 | |
195 /** | |
196 * Output verification message and bake if it looks good | |
197 * | |
198 * @return boolean True if user says it looks good, false otherwise | |
199 * @access private | |
200 */ | |
201 function __verify($config) { | |
202 $config = array_merge($this->__defaultConfig, $config); | |
203 extract($config); | |
204 $this->out(); | |
205 $this->hr(); | |
206 $this->out('The following database configuration will be created:'); | |
207 $this->hr(); | |
208 $this->out("Name: $name"); | |
209 $this->out("Driver: $driver"); | |
210 $this->out("Persistent: $persistent"); | |
211 $this->out("Host: $host"); | |
212 | |
213 if ($port) { | |
214 $this->out("Port: $port"); | |
215 } | |
216 | |
217 $this->out("User: $login"); | |
218 $this->out("Pass: " . str_repeat('*', strlen($password))); | |
219 $this->out("Database: $database"); | |
220 | |
221 if ($prefix) { | |
222 $this->out("Table prefix: $prefix"); | |
223 } | |
224 | |
225 if ($schema) { | |
226 $this->out("Schema: $schema"); | |
227 } | |
228 | |
229 if ($encoding) { | |
230 $this->out("Encoding: $encoding"); | |
231 } | |
232 | |
233 $this->hr(); | |
234 $looksGood = $this->in('Look okay?', array('y', 'n'), 'y'); | |
235 | |
236 if (strtolower($looksGood) == 'y') { | |
237 return $config; | |
238 } | |
239 return false; | |
240 } | |
241 | |
242 /** | |
243 * Assembles and writes database.php | |
244 * | |
245 * @param array $configs Configuration settings to use | |
246 * @return boolean Success | |
247 * @access public | |
248 */ | |
249 function bake($configs) { | |
250 if (!is_dir($this->path)) { | |
251 $this->err($this->path . ' not found'); | |
252 return false; | |
253 } | |
254 | |
255 $filename = $this->path . 'database.php'; | |
256 $oldConfigs = array(); | |
257 | |
258 if (file_exists($filename)) { | |
259 config('database'); | |
260 $db = new $this->databaseClassName; | |
261 $temp = get_class_vars(get_class($db)); | |
262 | |
263 foreach ($temp as $configName => $info) { | |
264 $info = array_merge($this->__defaultConfig, $info); | |
265 | |
266 if (!isset($info['schema'])) { | |
267 $info['schema'] = null; | |
268 } | |
269 if (!isset($info['encoding'])) { | |
270 $info['encoding'] = null; | |
271 } | |
272 if (!isset($info['port'])) { | |
273 $info['port'] = null; | |
274 } | |
275 | |
276 if ($info['persistent'] === false) { | |
277 $info['persistent'] = 'false'; | |
278 } else { | |
279 $info['persistent'] = ($info['persistent'] == true) ? 'true' : 'false'; | |
280 } | |
281 | |
282 $oldConfigs[] = array( | |
283 'name' => $configName, | |
284 'driver' => $info['driver'], | |
285 'persistent' => $info['persistent'], | |
286 'host' => $info['host'], | |
287 'port' => $info['port'], | |
288 'login' => $info['login'], | |
289 'password' => $info['password'], | |
290 'database' => $info['database'], | |
291 'prefix' => $info['prefix'], | |
292 'schema' => $info['schema'], | |
293 'encoding' => $info['encoding'] | |
294 ); | |
295 } | |
296 } | |
297 | |
298 foreach ($oldConfigs as $key => $oldConfig) { | |
299 foreach ($configs as $key1 => $config) { | |
300 if ($oldConfig['name'] == $config['name']) { | |
301 unset($oldConfigs[$key]); | |
302 } | |
303 } | |
304 } | |
305 | |
306 $configs = array_merge($oldConfigs, $configs); | |
307 $out = "<?php\n"; | |
308 $out .= "class DATABASE_CONFIG {\n\n"; | |
309 | |
310 foreach ($configs as $config) { | |
311 $config = array_merge($this->__defaultConfig, $config); | |
312 extract($config); | |
313 | |
314 $out .= "\tvar \${$name} = array(\n"; | |
315 $out .= "\t\t'driver' => '{$driver}',\n"; | |
316 $out .= "\t\t'persistent' => {$persistent},\n"; | |
317 $out .= "\t\t'host' => '{$host}',\n"; | |
318 | |
319 if ($port) { | |
320 $out .= "\t\t'port' => {$port},\n"; | |
321 } | |
322 | |
323 $out .= "\t\t'login' => '{$login}',\n"; | |
324 $out .= "\t\t'password' => '{$password}',\n"; | |
325 $out .= "\t\t'database' => '{$database}',\n"; | |
326 | |
327 if ($schema) { | |
328 $out .= "\t\t'schema' => '{$schema}',\n"; | |
329 } | |
330 | |
331 if ($prefix) { | |
332 $out .= "\t\t'prefix' => '{$prefix}',\n"; | |
333 } | |
334 | |
335 if ($encoding) { | |
336 $out .= "\t\t'encoding' => '{$encoding}'\n"; | |
337 } | |
338 | |
339 $out .= "\t);\n"; | |
340 } | |
341 | |
342 $out .= "}\n"; | |
343 $out .= "?>"; | |
344 $filename = $this->path . 'database.php'; | |
345 return $this->createFile($filename, $out); | |
346 } | |
347 | |
348 /** | |
349 * Get a user specified Connection name | |
350 * | |
351 * @return void | |
352 */ | |
353 function getConfig() { | |
354 App::import('Model', 'ConnectionManager', false); | |
355 | |
356 $useDbConfig = 'default'; | |
357 $configs = get_class_vars($this->databaseClassName); | |
358 if (!is_array($configs)) { | |
359 return $this->execute(); | |
360 } | |
361 | |
362 $connections = array_keys($configs); | |
363 if (count($connections) > 1) { | |
364 $useDbConfig = $this->in(__('Use Database Config', true) .':', $connections, 'default'); | |
365 } | |
366 return $useDbConfig; | |
367 } | |
368 } |