DataObjects/Core_locking.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                 
88                 $cmd = "$mysql_cmd -f < " . escapeshellarg($fn) ;
89                 
90                 echo $cmd. ($this->cli ? "\n" : "<BR>\n");
91                 
92                 passthru($cmd);
93             
94                 
95             }
96         }
97         
98         
99         
100     }
101     /**
102      * postgresql import..
103      */
104     function importpgsql($url)
105     {
106         
107         // hide stuff for web..
108         
109         require_once 'System.php';
110         $cat = System::which('cat');
111         $psql = System::which('psql');
112         
113         $ar = $this->modulesList();
114         if (!empty($url['pass'])) { 
115             putenv("PGPASSWORD=". $url['pass']);
116         }
117            
118         $psql_cmd = $psql .
119             ' -h ' . $url['host'] .
120             ' -U' . escapeshellarg($url['user']) .
121              ' ' . basename($url['path']);
122         echo $psql_cmd . "\n" ;
123         
124         
125         
126         
127         foreach($ar as $m) {
128             
129             $fd = $this->rootDir. "/Pman/$m/DataObjects";
130             
131             foreach(glob($fd.'/*.sql') as $bfn) {
132                 
133                  
134                 if (preg_match('/migrate/i', basename($bfn))) { // skip migration scripts at present..
135                     continue;
136                 }
137                 $fn = $this->convertToPG($bfn);
138                 
139                 $cmd = "$psql_cmd -f  " . escapeshellarg($fn) . ' 2>&1' ;
140                 
141                 echo "$bfn:   $cmd ". ($this->cli ? "\n" : "<BR>\n");
142                 
143                 
144                 $res = `$cmd`;
145                 
146             
147                 unlink($fn);
148             }
149         }
150         
151     }
152     /**
153      * simple regex based convert mysql to pgsql...
154      */
155     function convertToPG($src)
156     {
157         $fn = $this->tempName('sql');
158         
159         $ret = array( ); // pad it a bit.
160         $extra = array("", "" );
161         
162         $tbl = false;
163         foreach(file($src) as $l) {
164             $l = trim($l);
165             
166             if (!strlen($l) || $l[0] == '#') {
167                 continue;
168             }
169             $m = array();
170             if (preg_match('#create\s+table\s+([a-z0-9_]+)#i',  $l, $m)) {
171                 $tbl = $m[1];
172                // $extra[]  =   "drop table {$tbl};";
173              }
174             // autoinc
175             if ($tbl && preg_match('#auto_increment#i',  $l, $m)) {
176                 $l = preg_replace('#auto_increment#i', "default nextval('{$tbl}_seq')", $l);
177                 $extra[]  =   "create sequence {$tbl}_seq;";
178               
179             }
180             $m = array();
181             if (preg_match('#alter\s+table\s+([a-z0-9_]+)\s+add\s+index\s+([^(]+)(.*)$#i',  $l, $m)) {
182                $l = "CREATE INDEX  {$m[1]}_{$m[2]} ON {$m[1]} {$m[3]}";
183              }
184             // ALTER TABLE core_event_audit ADD     INDEX looku
185             // CREATE INDEX 
186             
187             // basic types..
188             $l = preg_replace('#int\([0-9]+\)#i', 'INT', $l);
189             
190             $l = preg_replace('# datetime #i', ' TIMESTAMP WITHOUT TIME ZONE ', $l);
191             $l = preg_replace('# blob #i', ' TEXT ', $l);
192              $l = preg_replace('# longtext #i', ' TEXT ', $l);
193             //$l = preg_match('#int\([0-9]+\)#i', 'INT', $l);
194                             
195             $ret[] = $l;
196             
197             
198             
199             
200             
201             
202             
203         }
204         $ret = array_merge($extra,$ret);
205         
206         //echo implode("\n", $ret); //exit;
207         file_put_contents($fn, implode("\n", $ret));
208         
209         return $fn;
210     }
211                 
212     
213 }