DataObjects/Events.php
[Pman.Core] / UpdateDatabase.php
index 07b60ab..11b0cd2 100644 (file)
@@ -61,6 +61,12 @@ class Pman_Core_UpdateDatabase extends Pman
             'min' => 1,
             'max' => 1,
         ),
+        'skip-mysql-checks' => array(
+            'desc' => 'Skip mysql checks',
+            'default' => '',
+            'min' => 1,
+            'max' => 1,
+        ),
         'procedures-only' => array(
             'desc' => 'Only import procedures (not supported by most modules yet) - ignores sql directory',
             'default' => '',
@@ -68,7 +74,6 @@ class Pman_Core_UpdateDatabase extends Pman
             'max' => 1,
         ),
         
-        
         'json-person' => array(
             'desc' => 'Person JSON file',
             'default' => '',
@@ -109,6 +114,9 @@ class Pman_Core_UpdateDatabase extends Pman
     
     
     var $cli = false;
+    
+    var $local_base_url = false;
+    
     function getAuth() {
         
         
@@ -127,14 +135,26 @@ class Pman_Core_UpdateDatabase extends Pman
         return true;
     }
     
-    function get($args, $opts)
+    function get($args, $opts=array())
     {
         PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, array($this, 'onPearError'));
    
         $this->checkSystem();
+        
+        if (class_exists('PDO_DataObjects_Introspection')) {
+            PDO_DataObject_Introspection::$cache = array();
+        }
+        
+        HTML_FlexyFramework::get()->generateDataobjectsCache(true);
    
         $ff = HTML_FlexyFramework::get();
         
+        if(!isset($ff->Pman) || !isset($ff->Pman['local_base_url'])){
+            die("Please setup local_base_url");
+        }
+        
+        $this->local_base_url = $ff->Pman['local_base_url'];
+        
         if(!empty($ff->Core_Notify)){
 //            require_once 'Pman/Core/NotifySmtpCheck.php';
 //            $x = new Pman_Core_NotifySmtpCheck();
@@ -150,7 +170,13 @@ class Pman_Core_UpdateDatabase extends Pman
         
         $this->checkOpts($opts);
         
-        $this->runExtensions(); // do this first, so the innodb change + utf8 fixes column max sizes
+        
+        // do this first, so the innodb change + utf8 fixes column max sizes
+        
+        // this will trigger errors about freetext indexes - we will have to remove them manually.?
+        // otherwise we need to do an sql query to find them, then remove them (not really worth it as it only affects really old code..)
+        
+        $this->runExtensions(); 
 
         
         if (empty($opts['data-only'])) {
@@ -162,15 +188,16 @@ class Pman_Core_UpdateDatabase extends Pman
         
         $this->runUpdateModulesData();
         
-        
         if (!empty($opts['add-company']) && !in_array('Core', $this->disabled)) {
             // make sure we have a good cache...?
            
-            DB_DataObject::factory('companies')->initCompanies($this, $opts);
+            DB_DataObject::factory('core_company')->initCompanies($this, $opts);
         }
         
         $this->runExtensions();
-         
+        
+        $this->generateDataobjectsCache();
+        
          
     }
     function output() {
@@ -189,11 +216,13 @@ class Pman_Core_UpdateDatabase extends Pman
         
         $ff = HTML_Flexyframework::get();
         
-        $dburl = parse_url($ff->DB_DataObject['database']);
+        $dburl = parse_url($ff->database); // used to be DB_DataObject['database'] - but not portable to PDO
         
         //$this->{'import' . $url['scheme']}($url);
         
         $dbtype = $dburl['scheme'];
+        
+        
         $dirmethod = 'import' . $dburl['scheme'] . 'dir';
         
         
@@ -258,9 +287,12 @@ class Pman_Core_UpdateDatabase extends Pman
             $this->{$dirmethod}($dburl, $this->rootDir. "/Pman/$m/sql");
             $this->{$dirmethod}($dburl, $this->rootDir. "/Pman/$m/{$dbtype}");
             
-            
+           
             
             if (!empty($this->opts['init']) && file_exists($this->rootDir. "/Pman/$m/{$dbtype}.initdata")) {
+                if (class_exists('PDO_DataObjects_Introspection')) {
+                    PDO_DataObject_Introspection::$cache = array();
+                }
                 HTML_FlexyFramework::get()->generateDataobjectsCache(true);
                 
                 $this->{$dirmethod}($dburl, $this->rootDir. "/Pman/$m/{$dbtype}.initdata");
@@ -271,6 +303,7 @@ class Pman_Core_UpdateDatabase extends Pman
             
         }
         
+        
     }
     
     
@@ -358,7 +391,9 @@ class Pman_Core_UpdateDatabase extends Pman
      * 
      *
      */
-    
+    function importmysqlidir($dburl, $dir) {
+        return $this->importmysqldir($dburl, $dir);
+    }
     
     function importmysqldir($dburl, $dir)
     {
@@ -609,12 +644,15 @@ class Pman_Core_UpdateDatabase extends Pman
     
     function runUpdateModulesData()
     {
+        if (class_exists('PDO_DataObjects_Introspection')) {
+            PDO_DataObject_Introspection::$cache = array();
+        }
         HTML_FlexyFramework::get()->generateDataobjectsCache(true);
         
         if(!in_array('Core', $this->disabled)){
             echo "Running jsonImportFromArray\n";
             Pman_Core_UpdateDatabase::jsonImportFromArray($this->opts);
-
+            
 
             echo "Running updateData on modules\n";
             // runs core...
@@ -644,7 +682,7 @@ class Pman_Core_UpdateDatabase extends Pman
             echo "$module\n";
             $x->updateData();
         }
-                
+        
     }
     
     
@@ -714,7 +752,7 @@ class Pman_Core_UpdateDatabase extends Pman
     function updateDataGroups()
     {
          
-        $groups = DB_DataObject::factory('groups');
+        $groups = DB_DataObject::factory('core_group');
         $groups->initGroups();
         
         $groups->initDatabase($this,array(
@@ -738,7 +776,7 @@ class Pman_Core_UpdateDatabase extends Pman
     {
          
         // fix comptypes enums..
-        $c = DB_DataObject::Factory('Companies');
+        $c = DB_DataObject::Factory('core_company');
         $c->selectAdd();
         $c->selectAdd('distinct(comptype) as comptype');
         $c->whereAdd("comptype != ''");
@@ -756,11 +794,11 @@ class Pman_Core_UpdateDatabase extends Pman
         $c->initEnums($ctb);
         //DB_DataObject::debugLevel(1);
         // fix comptypeid
-        $c = DB_DataObject::Factory('Companies');
+        $c = DB_DataObject::Factory('core_company');
         $c->query("
-            UPDATE Companies 
+            UPDATE {$c->tableName()} 
                 SET
-                    comptype_id = (SELECT id FROM core_enum where etype='comptype' and name=Companies.comptype LIMIT 1)
+                    comptype_id = (SELECT id FROM core_enum where etype='comptype' and name={$c->tableName()}.comptype LIMIT 1)
                 WHERE
                     comptype_id = 0
                     AND
@@ -787,7 +825,7 @@ class Pman_Core_UpdateDatabase extends Pman
                 if (empty($data['bcc_group'])) {
                     $this->jerr("missing bcc_group for template $name");
                 }
-                $g = DB_DataObject::Factory('Groups')->lookup('name',$data['bcc_group']);
+                $g = DB_DataObject::Factory('core_group')->lookup('name',$data['bcc_group']);
                 
                 if (empty($g->id)) {
                     $this->jerr("bcc_group {$data['bcc_group']} does not exist when importing template $name");
@@ -851,6 +889,9 @@ class Pman_Core_UpdateDatabase extends Pman
     function updateData()
     {
         // fill i18n data..
+        if (class_exists('PDO_DataObjects_Introspection')) {
+            PDO_DataObject_Introspection::$cache = array();
+        }
         HTML_FlexyFramework::get()->generateDataobjectsCache(true);
         $this->updateDataEnums();
         $this->updateDataGroups();
@@ -871,28 +912,41 @@ class Pman_Core_UpdateDatabase extends Pman
         if ($done_check) {
             return;
         }
+        
+        
+        if (!empty($this->opts['skip-mysql-checks'])) {
+            return;
+        }
         // innodb in single files is far more efficient that MYD or one big innodb file.
         // first check if database is using this format.
         $db = DB_DataObject::factory('core_enum');
         $db->query("show variables like 'innodb_file_per_table'");
         $db->fetch();
         if ($db->Value == 'OFF') {
-            die("Error: set innodb_file_per_table = 1 in my.cnf\n\n");
+            die("Error: set innodb_file_per_table = 1 in my.cnf (or run with --skip-mysql-checks\n\n");
         }
         
         $db = DB_DataObject::factory('core_enum');
-        $db->query("show variables like 'sql_mode'");
+        $db->query("select version() as version");
         $db->fetch();
         
-        $modes = explode(",", $db->value);
-        
-        print_r($modes);exit;
-        if(
-                in_array('NO_ZERO_IN_DATE', $modes) ||
-                in_array('NO_ZERO_DATE', $modes) ||
-                !in_array('ALLOW_INVALID_DATES', $modes)
-        ){
-            die("Error: set sql_mode include 'ALLOW_INVALID_DATES', remove 'NO_ZERO_IN_DATE' AND 'NO_ZERO_DATE' in my.cnf\n\n");
+        if (version_compare($db->version, '5.7', '>=' )) {
+                
+            $db = DB_DataObject::factory('core_enum');
+            $db->query("show variables like 'sql_mode'");
+            $db->fetch();
+            
+            $modes = explode(",", $db->Value);
+            
+            // these are 'new' problems with mysql.
+            if(
+                    in_array('NO_ZERO_IN_DATE', $modes) ||
+                    in_array('NO_ZERO_DATE', $modes) ||
+                    in_array('STRICT_TRANS_TABLES', $modes) || 
+                    !in_array('ALLOW_INVALID_DATES', $modes)
+            ){
+                die("Error: set sql_mode include 'ALLOW_INVALID_DATES', remove 'NO_ZERO_IN_DATE' AND 'STRICT_TRANS_TABLES' AND 'NO_ZERO_DATE' in my.cnf\n\n");
+            }
         }
         
         $done_check = true;;
@@ -1006,7 +1060,7 @@ class Pman_Core_UpdateDatabase extends Pman
         
         $ff = HTML_Flexyframework::get();
         
-        $dburl = parse_url($ff->DB_DataObject['database']);
+        $dburl = parse_url($ff->database);
         
         $dbtype = $dburl['scheme'];
        
@@ -1066,7 +1120,7 @@ class Pman_Core_UpdateDatabase extends Pman
             $fail = true;
         }
         if ($res) {
-            $this->jerr("Missing these programs - need installing\n" . implode("\n",$res));
+            die("Missing these programs - need installing\n" . implode("\n",$res). "\n");
         }
         foreach($pref as $r) {
             if (!System::which($r)) {
@@ -1082,5 +1136,49 @@ class Pman_Core_UpdateDatabase extends Pman
         
     }
     
+    function generateDataobjectsCache()
+    {
+        $url = "http://localhost{$this->local_base_url}/Core/RefreshDatabaseCache";
+            
+        $this->curl($url);
+        
+    }
+    
+    function curl($url, $request = array(), $method = 'GET') 
+    {
+        if($method == 'GET'){
+            $request = http_build_query($request);
+            $url = $url . "?" . $request;  
+        }
+        
+        $ch = curl_init($url);
+        
+        if ($method == 'POST') {
+            
+            curl_setopt($ch, CURLOPT_POST, 1);
+            curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
+            
+        } else {
+            
+            curl_setopt($ch, CURLOPT_HTTPHEADER,
+                    array("Content-Type: application/x-www-form-urlencoded", "Content-Length: " . strlen($request)));
+            
+        }
+        
+        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+        
+        curl_setopt($ch, CURLOPT_HEADER, false);
+        curl_setopt($ch, CURLOPT_VERBOSE, 0);
+        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
+        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
+
+        $response = curl_exec($ch);
+        
+        curl_close($ch);
+        
+        return $response;
+    }
+    
+    
     
 }
\ No newline at end of file