Mercurial > hg > rc1
comparison vendor/roundcube/plugin-installer/src/bin/rcubeinitdb.sh @ 0:1e000243b222
vanilla 1.3.3 distro, I hope
author | Charlie Root |
---|---|
date | Thu, 04 Jan 2018 15:50:29 -0500 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:1e000243b222 |
---|---|
1 #!/usr/bin/env php | |
2 <?php | |
3 | |
4 define('INSTALL_PATH', getcwd() . '/' ); | |
5 | |
6 require_once INSTALL_PATH . 'program/include/clisetup.php'; | |
7 | |
8 // get arguments | |
9 $opts = rcube_utils::get_opt(array( | |
10 'd' => 'dir', | |
11 'p' => 'package', | |
12 )); | |
13 | |
14 if (empty($opts['dir'])) { | |
15 rcube::raise_error("Database schema directory not specified (--dir).", false, true); | |
16 } | |
17 if (empty($opts['package'])) { | |
18 rcube::raise_error("Database schema package name not specified (--package).", false, true); | |
19 } | |
20 | |
21 // Check if directory exists | |
22 if (!file_exists($opts['dir'])) { | |
23 rcube::raise_error("Specified database schema directory doesn't exist.", false, true); | |
24 } | |
25 | |
26 $RC = rcube::get_instance(); | |
27 $DB = rcube_db::factory($RC->config->get('db_dsnw')); | |
28 | |
29 // Connect to database | |
30 $DB->db_connect('w'); | |
31 if (!$DB->is_connected()) { | |
32 rcube::raise_error("Error connecting to database: " . $DB->is_error(), false, true); | |
33 } | |
34 | |
35 $opts['dir'] = rtrim($opts['dir'], DIRECTORY_SEPARATOR); | |
36 $file = $opts['dir'] . DIRECTORY_SEPARATOR . $DB->db_provider . '.initial.sql'; | |
37 if (!file_exists($file)) { | |
38 rcube::raise_error("No DDL file found for " . $DB->db_provider . " driver.", false, true); | |
39 } | |
40 | |
41 $package = $opts['package']; | |
42 $error = false; | |
43 | |
44 // read DDL file | |
45 if ($lines = file($file)) { | |
46 $sql = ''; | |
47 foreach ($lines as $line) { | |
48 if (preg_match('/^--/', $line) || trim($line) == '') | |
49 continue; | |
50 | |
51 $sql .= $line . "\n"; | |
52 if (preg_match('/(;|^GO)$/', trim($line))) { | |
53 @$DB->query(fix_table_names($sql)); | |
54 $sql = ''; | |
55 if ($error = $DB->is_error()) { | |
56 break; | |
57 } | |
58 } | |
59 } | |
60 } | |
61 | |
62 if (!$error) { | |
63 $version = date('Ymd00'); | |
64 $system_table = $DB->quote_identifier($DB->table_name('system')); | |
65 $name_col = $DB->quote_identifier('name'); | |
66 $value_col = $DB->quote_identifier('value'); | |
67 $package_version = $package . '-version'; | |
68 | |
69 $DB->query("SELECT * FROM $system_table WHERE $name_col=?", | |
70 $package_version); | |
71 | |
72 if ($DB->fetch_assoc()) { | |
73 $DB->query("UPDATE $system_table SET $value_col=? WHERE $name_col=?", | |
74 $version, $package_version); | |
75 } | |
76 else { | |
77 $DB->query("INSERT INTO $system_table ($name_col, $value_col) VALUES (?, ?)", | |
78 $package_version, $version); | |
79 } | |
80 | |
81 $error = $DB->is_error(); | |
82 } | |
83 | |
84 if ($error) { | |
85 echo "[FAILED]\n"; | |
86 rcube::raise_error("Error in DDL schema $file: $error", false, true); | |
87 } | |
88 echo "[OK]\n"; | |
89 | |
90 | |
91 function fix_table_names($sql) | |
92 { | |
93 global $DB, $RC; | |
94 | |
95 $prefix = $RC->config->get('db_prefix'); | |
96 $engine = $DB->db_provider; | |
97 | |
98 if (empty($prefix)) { | |
99 return $sql; | |
100 } | |
101 | |
102 $tables = array(); | |
103 $sequences = array(); | |
104 | |
105 // find table names | |
106 if (preg_match_all('/CREATE TABLE (\[dbo\]\.|IF NOT EXISTS )?[`"\[\]]*([^`"\[\] \r\n]+)/i', $sql, $matches)) { | |
107 foreach ($matches[2] as $table) { | |
108 $tables[$table] = $prefix . $table; | |
109 } | |
110 } | |
111 // find sequence names | |
112 if ($engine == 'postgres' && preg_match_all('/CREATE SEQUENCE (IF NOT EXISTS )?"?([^" \n\r]+)/i', $sql, $matches)) { | |
113 foreach ($matches[2] as $sequence) { | |
114 $sequences[$sequence] = $prefix . $sequence; | |
115 } | |
116 } | |
117 | |
118 // replace table names | |
119 foreach ($tables as $table => $real_table) { | |
120 $sql = preg_replace("/([^a-zA-Z0-9_])$table([^a-zA-Z0-9_])/", "\\1$real_table\\2", $sql); | |
121 } | |
122 // replace sequence names | |
123 foreach ($sequences as $sequence => $real_sequence) { | |
124 $sql = preg_replace("/([^a-zA-Z0-9_])$sequence([^a-zA-Z0-9_])/", "\\1$real_sequence\\2", $sql); | |
125 } | |
126 | |
127 return $sql; | |
128 } | |
129 | |
130 ?> |