DataObjects/ProjectDirectory.php
[Pman.Core] / UpdateDatabase.php
1 <?php
2
3
4
5 require_once 'Pman.php';
6 class Pman_Core_UpdateDatabase extends Pman
7 {
8     
9     static $cli_desc = "Update SQL - Beta";
10  
11  
12     
13     var $cli = false;
14     function getAuth() {
15         
16         
17         $ff = HTML_FlexyFramework::get();
18         if (!empty($ff->cli)) {
19             $this->cli = true;
20             return true;
21         }
22         
23         parent::getAuth(); // load company!
24         $au = $this->getAuthUser();
25         if (!$au || $au->company()->comptype != 'OWNER') {
26             $this->jerr("Not authenticated", array('authFailure' => true));
27         }
28         $this->authUser = $au;
29         return true;
30     }
31      
32     function get()
33     {
34         $this->importSQL();
35          
36     }
37     function output() {
38         return '';
39     }
40      /**
41      * imports SQL files from all DataObjects directories....
42      * 
43      * except any matching /migrate/
44      */
45     function importSQL()
46     {
47         
48         $ff = HTML_Flexyframework::get();
49         
50         $url = parse_url($ff->DB_DataObject['database']);
51         
52         $this->{'import' . $url['scheme']}($url);
53         
54     }
55     function importmysql($url)
56     {
57         
58         // hide stuff for web..
59         
60         require_once 'System.php';
61         $cat = System::which('cat');
62         $mysql = System::which('mysql');
63         
64         $ar = $this->modulesList();
65         
66            
67         $mysql_cmd = $mysql .
68             ' -h ' . $url['host'] .
69             ' -u' . escapeshellarg($url['user']) .
70             (!empty($url['pass']) ? ' -p' . escapeshellarg($url['pass'])  :  '') .
71             ' ' . basename($url['path']);
72         echo $mysql_cmd . "\n" ;
73         
74         
75         
76         
77         foreach($ar as $m) {
78             
79             $fd = $this->rootDir. "/Pman/$m/DataObjects";
80             
81             foreach(glob($fd.'/*.sql') as $fn) {
82                 
83                  
84                 if (preg_match('/migrate/i', basename($fn))) { // skip migration scripts at present..
85                     continue;
86                 }
87                 // .my.sql but not .pg.sql
88                 if (preg_match('/#.[a-z]{2}\.sql#i', basename($bfn))
89                     && !preg_match('/#\.my\.sql#i', basename($bfn))
90                 ) { // skip migration scripts at present..
91                     continue;
92                 }
93                 $cmd = "$mysql_cmd -f < " . escapeshellarg($fn) ;
94                 
95                 echo $cmd. ($this->cli ? "\n" : "<BR>\n");
96                 
97                 passthru($cmd);
98             
99                 
100             }
101         }
102         
103         
104         
105     }
106     /**
107      * postgresql import..
108      */
109     function importpgsql($url)
110     {
111         
112         // hide stuff for web..
113         
114         require_once 'System.php';
115         $cat = System::which('cat');
116         $psql = System::which('psql');
117         
118         $ar = $this->modulesList();
119         if (!empty($url['pass'])) { 
120             putenv("PGPASSWORD=". $url['pass']);
121         }
122            
123         $psql_cmd = $psql .
124             ' -h ' . $url['host'] .
125             ' -U' . escapeshellarg($url['user']) .
126              ' ' . basename($url['path']);
127         echo $psql_cmd . "\n" ;
128         
129         
130         
131         
132         foreach($ar as $m) {
133             
134             $fd = $this->rootDir. "/Pman/$m/DataObjects";
135             
136             foreach(glob($fd.'/*.sql') as $bfn) {
137                 
138                  
139                 if (preg_match('/migrate/i', basename($bfn))) { // skip migration scripts at present..
140                     continue;
141                 }
142                 if (preg_match('#\.[a-z]{2}\.sql#i', basename($bfn))
143                     && !preg_match('#\.pg\.sql#i', basename($bfn))
144                 ) { // skip migration scripts at present..
145                     continue;
146                 }
147                 // files ending in .pg.sql are native postgres files..
148                 $fn = preg_match('#\.pg\.sql$#', basename($bfn)) ? false : $this->convertToPG($bfn);
149                 
150                 $cmd = "$psql_cmd -f  " . escapeshellarg($fn ? $fn : $bfn) . ' 2>&1' ;
151                 
152                 echo "$bfn:   $cmd ". ($this->cli ? "\n" : "<BR>\n");
153                 
154                 
155                 passthru($cmd);
156                 
157                 if ($fn) {
158                     unlink($fn);
159                 }
160             }
161         }
162         
163     }
164     /**
165      * simple regex based convert mysql to pgsql...
166      */
167     function convertToPG($src)
168     {
169         $fn = $this->tempName('sql');
170         
171         $ret = array( ); // pad it a bit.
172         $extra = array("", "" );
173         
174         $tbl = false;
175         foreach(file($src) as $l) {
176             $l = trim($l);
177             
178             if (!strlen($l) || $l[0] == '#') {
179                 continue;
180             }
181             $m = array();
182             if (preg_match('#create\s+table\s+([a-z0-9_]+)#i',  $l, $m)) {
183                 $tbl = $m[1];
184                // $extra[]  =   "drop table {$tbl};";
185              }
186             // autoinc
187             if ($tbl && preg_match('#auto_increment#i',  $l, $m)) {
188                 $l = preg_replace('#auto_increment#i', "default nextval('{$tbl}_seq')", $l);
189                 $extra[]  =   "create sequence {$tbl}_seq;";
190               
191             }
192             $m = array();
193             if (preg_match('#alter\s+table\s+([a-z0-9_]+)\s+add\s+index\s+([^(]+)(.*)$#i',  $l, $m)) {
194                $l = "CREATE INDEX  {$m[1]}_{$m[2]} ON {$m[1]} {$m[3]}";
195              }
196             // ALTER TABLE core_event_audit ADD     INDEX looku
197             // CREATE INDEX 
198             
199             // basic types..
200             $l = preg_replace('#int\([0-9]+\)#i', 'INT', $l);
201             
202             $l = preg_replace('# datetime #i', ' TIMESTAMP WITHOUT TIME ZONE ', $l);
203             $l = preg_replace('# blob #i', ' TEXT ', $l);
204              $l = preg_replace('# longtext #i', ' TEXT ', $l);
205             //$l = preg_match('#int\([0-9]+\)#i', 'INT', $l);
206                             
207             $ret[] = $l;
208             
209             
210             
211             
212             
213             
214             
215         }
216         $ret = array_merge($extra,$ret);
217         
218         //echo implode("\n", $ret); //exit;
219         file_put_contents($fn, implode("\n", $ret));
220         
221         return $fn;
222     }
223                 
224     
225 }