upgrade 1.1.2 pour XML, MySql et SQLite
[mw_sourceml] / app / data / upgrades / xml / mw_sourceml_xml_version_1_1_2.php
diff --git a/app/data/upgrades/xml/mw_sourceml_xml_version_1_1_2.php b/app/data/upgrades/xml/mw_sourceml_xml_version_1_1_2.php
new file mode 100644 (file)
index 0000000..196adde
--- /dev/null
@@ -0,0 +1,469 @@
+<?php
+
+  class mw_sourceml_xml_version_1_1_2 extends mw_data_version{
+
+    function version(){
+      return "1.1.2";
+    }
+
+    function do_upgrade(){
+
+      $env = $this->env();
+      $data = $env->data();
+      $sgbd = $data->sgbd();
+
+      if($sgbd->data_exists("sources")){
+
+        /* ----------------------------------------------------------------------
+                                                     nouvelle table groupe_status
+        */
+  
+        if(!$sgbd->data_exists("groupe_status")){
+          if(!$sgbd->create_data("groupe_status")) return "impossible de creer la table groupe_status";
+          if
+          (    !$sgbd->add_data("groupe_status", array("nom" => "admin"))
+            || !$sgbd->add_data("groupe_status", array("nom" => "editeur"))
+            || !$sgbd->add_data("groupe_status", array("nom" => "contributeur"))
+          ){
+            return "impossible de renseigner la table groupe_status";
+          }
+        }
+  
+        /* ----------------------------------------------------------------------
+                                                    nouvelle table source_groupes
+                               sources.id_groupe devient source_groupes.id_groupe
+                                                   maj sources.image avec id user
+        */
+  
+        if(!$sgbd->data_exists("source_groupes")){
+          if(!$sgbd->create_data("source_groupes")) return "impossible de creer la table source_groupes";
+          if(!($rst = $sgbd->open_data("sources"))){
+            return "impossible de lire la liste des sources";
+          }
+          $erreur = "";
+          while($v_rst = $sgbd->fetch_data($rst)){
+            if(isset($v_rst)){
+              if(isset($v_rst["id"]) && isset($v_rst["id_groupe"])){
+                $id_source = $v_rst["id"];
+                unset($v_rst["id"]);
+                $id_groupe = $v_rst["id_groupe"];
+                unset($v_rst["id_groupe"]);
+                if(isset($v_rst["image"]) && $v_rst["image"] && !preg_match("/^[0-9]+\/.*$/", $v_rst["image"])){
+                  if($groupe = $sgbd->get_data("groupes", $id_groupe)){
+                    $v_rst["image"] = $groupe["id_user"]."/".$v_rst["image"];
+                  }
+                }
+                if(
+                  !$sgbd->set_data(
+                    "sources",
+                    $id_source,
+                    $v_rst
+                  )
+                ){
+                  $erreur = "impossible de mettre a jour les informations des sources (champ id_groupe)";
+                  break;
+                }
+                if(
+                  !$sgbd->add_data(
+                    "source_groupes",
+                    array(
+                      "id_source" => $id_source,
+                      "id_groupe" => $id_groupe,
+                      "id_groupe_status" => 1
+                    )
+                  )
+                ){
+                  $erreur = "impossible de mettre a jour les informations des sources (source_groupes)";
+                  break;
+                }
+              }
+            }
+            else{
+              $erreur = "erreur lors de lecture des sources pour mettre a jour les derivations";
+              break;
+            }
+          }
+          $sgbd->close_data($rst);
+          if($erreur) return $erreur;
+        }
+  
+        /* ----------------------------------------------------------------------
+                                                nouvelle table source_derivations
+                         sources.derivation devient source_derivations.derivation
+        */
+  
+        if(!$sgbd->data_exists("source_derivations")){
+          if(!$sgbd->create_data("source_derivations")){
+            return "impossible de créer la table source_derivations";
+          }
+          if(!($rst = $sgbd->open_data("sources"))){
+            return "impossible de lire la liste des sources";
+          }
+          $erreur = "";
+          while($v_rst = $sgbd->fetch_data($rst)){
+            if(isset($v_rst)){
+              if(isset($v_rst["id"]) && isset($v_rst["derivation"])){
+                $id_source = $v_rst["id"];
+                unset($v_rst["id"]);
+                $derivation = $v_rst["derivation"];
+                unset($v_rst["derivation"]);
+                if(
+                  !$sgbd->set_data(
+                    "sources",
+                    $id_source,
+                    $v_rst
+                  )
+                ){
+                  $erreur = "impossible de mettre a jour les informations des sources (champ derivation)";
+                  break;
+                }
+                if(
+                  !$sgbd->add_data(
+                    "source_derivations",
+                    array(
+                      "id_source" => $id_source,
+                      "derivation" => $derivation
+                    )
+                  )
+                ){
+                  $erreur = "impossible de mettre a jour les derivations";
+                  break;
+                }
+              }
+            }
+            else{
+              $erreur = "erreur lors de lecture des sources pour mettre a jour les derivations";
+              break;
+            }
+          }
+          $sgbd->close_data($rst);
+          if($erreur) return $erreur;
+        }
+  
+        /* ----------------------------------------------------------------------
+                                                                          groupes
+                                                           maj image avec id user
+        */
+  
+        if($sgbd->data_exists("groupes")){
+          if(!($rst = $sgbd->open_data("groupes"))){
+            return "impossible de lire la liste des groupes pour mettre a jour les chemins des images";
+          }
+          $res = true;
+          while($v_rst = $sgbd->fetch_data($rst)){
+            if(isset($v_rst)){
+              if(isset($v_rst["id"]) && isset($v_rst["id_user"]) && isset($v_rst["image"]) && $v_rst["image"]){
+                if(!preg_match("/^[0-9]+\/.*$/", $v_rst["image"])){
+                  $id_groupe = $v_rst["id"];
+                  unset($v_rst["id"]);
+                  $v_rst["image"] = $v_rst["id_user"]."/".$v_rst["image"];
+                  if(
+                    !$sgbd->set_data(
+                      "groupes",
+                      $id_groupe,
+                      $v_rst
+                    )
+                  ){
+                    $res = "impossible de mettre a jour les images des groupes";
+                    break;
+                  }
+                }
+              }
+            }
+            else{
+              $res = "erreur lors de lecture des groupes pour mettre a jour les images";
+              break;
+            }
+          }
+          $sgbd->close_data($rst);
+          if($res !== true) return $res;
+        }
+  
+        /* ----------------------------------------------------------------------
+                                                                          sources
+                                                sources.nom devient sources.titre
+        */
+  
+        if(!($rst = $sgbd->open_data("sources"))){
+          return "impossible de lire la liste des sources";
+        }
+        $erreur = "";
+        while($v_rst = $sgbd->fetch_data($rst)){
+          if(isset($v_rst)){
+            if(isset($v_rst["id"])){
+              $id_source = $v_rst["id"];
+              unset($v_rst["id"]);
+              $NEED_UPDATE = false;
+              if(!isset($v_rst["titre"])){
+                $v_rst["titre"] = isset($v_rst["nom"]) ? $v_rst["nom"] : "";
+                $NEED_UPDATE = true;
+              }
+              if(isset($v_rst["nom"])){
+                unset($v_rst["nom"]);
+                $NEED_UPDATE = true;
+              }
+              if($NEED_UPDATE){
+                if(
+                  !$sgbd->set_data(
+                    "sources",
+                    $id_source,
+                    $v_rst
+                  )
+                ){
+                  $erreur = "impossible de mettre a jour les informations des sources";
+                  break;
+                }
+              }
+            }
+          }
+          else{
+            $erreur = "erreur lors de lecture des sources pour mettre a jour leurs informations";
+            break;
+          }
+        }
+        $sgbd->close_data($rst);
+        if($erreur) return $erreur;
+  
+        /* ----------------------------------------------------------------------
+                                suppression de la table source_status_composition
+        */
+  
+        if($sgbd->data_exists("source_status_composition")){
+          if(!$sgbd->remove_data("source_status_composition")){
+            return "impossible de supprimer la table source_status_composition";
+          }
+        }
+
+      } // if($sgbd->data_exists("sources"))
+
+
+      /* ###################################################################### */
+      /* ###################################################################### */
+      /* ----------------------------------------------------------------------
+                   migration vers les tables en sml_(...) du plugin mw_sourceml
+      */
+
+      $base_dir = $env->path("content")."data/xml/".$env->bdd("base");
+      $base_dir .= substr($base_dir, -1) != "/" ? "/" : "";
+
+      if(!is_dir($base_dir)){
+        return "impossible de trouver le dossier de la base";
+      }
+
+      /* ----------------------------------------------------------------------
+                                                    sources devient sml_sources
+                                                    elt status devient id_class
+      */
+
+      if($sgbd->data_exists("sources")){
+        if(!@rename($base_dir."sources", $base_dir."sml_sources")){
+          return "impossible de renommer sources en sml_sources";
+        }
+        if(!($rst = $sgbd->open_data("sml_sources"))){
+          return "impossible de lire sml_sources";
+        }
+        $erreur = "";
+        while($v_rst = $sgbd->fetch_data($rst)){
+          if(isset($v_rst)){
+            if(isset($v_rst["id"])){
+              $NEED_UPDATE = false;
+              if(isset($v_rst["status"])){
+                $id_class = $v_rst["status"];
+                unset($v_rst["status"]);
+                $v_rst["id_class"] = $id_class;
+                $NEED_UPDATE = true;
+              }
+              if(!$NEED_UPDATE) continue;
+              if(
+                !$sgbd->set_data(
+                  "sml_sources",
+                  $v_rst["id"],
+                  $v_rst
+                )
+              ){
+                $erreur = "impossible de mettre a jour les informations de sml_sources";
+                break;
+              }
+            }
+          }
+          else{
+            $erreur = "erreur lors de lecture de sml_sources";
+            break;
+          }
+        }
+        $sgbd->close_data($rst);
+        if($erreur) return $erreur;
+      }
+
+      /* ----------------------------------------------------------------------
+                                     source_groupes devient sml_sources_authors
+                                                elt id_groupe devient id_author
+                                 elt id_groupe_status devient id_sources_access
+      */
+
+      if($sgbd->data_exists("source_groupes")){
+        if(!@rename($base_dir."source_groupes", $base_dir."sml_sources_authors")){
+          return "impossible de renommer source_groupes en sml_sources_authors";
+        }
+        if(!($rst = $sgbd->open_data("sml_sources_authors"))){
+          return "impossible de lire sml_sources_authors";
+        }
+        $erreur = "";
+        while($v_rst = $sgbd->fetch_data($rst)){
+          if(isset($v_rst)){
+            if(isset($v_rst["id"])){
+              $NEED_UPDATE = false;
+              if(isset($v_rst["id_groupe"])){
+                $id_author = $v_rst["id_groupe"];
+                unset($v_rst["id_groupe"]);
+                $v_rst["id_author"] = $id_author;
+                $NEED_UPDATE = true;
+              }
+              if(isset($v_rst["id_groupe_status"])){
+                $id_sources_access = $v_rst["id_groupe_status"];
+                unset($v_rst["id_groupe_status"]);
+                $v_rst["id_sources_access"] = $id_sources_access;
+                $NEED_UPDATE = true;
+              }
+              if(!$NEED_UPDATE) continue;
+              if(
+                !$sgbd->set_data(
+                  "sml_sources_authors",
+                  $v_rst["id"],
+                  $v_rst
+                )
+              ){
+                $erreur = "impossible de mettre a jour les informations de sml_sources_authors";
+                break;
+              }
+            }
+          }
+          else{
+            $erreur = "erreur lors de lecture de sml_sources_authors";
+            break;
+          }
+        }
+        $sgbd->close_data($rst);
+        if($erreur) return $erreur;
+      }
+
+      /* ----------------------------------------------------------------------
+                                       groupe_status devient sml_sources_access
+                                                            nouvel elt intitule
+      */
+
+      if($sgbd->data_exists("groupe_status")){
+        if(!@rename($base_dir."groupe_status", $base_dir."sml_sources_access")){
+          return "impossible de renommer groupe_status en sml_sources_access";
+        }
+        if(!($rst = $sgbd->open_data("sml_sources_access"))){
+          return "impossible de lire sml_sources_access";
+        }
+        $erreur = "";
+        while($v_rst = $sgbd->fetch_data($rst)){
+          if(isset($v_rst)){
+            if(isset($v_rst["id"]) && isset($v_rst["nom"]) && !isset($v_rst["intitule"])){
+              $intitule = "";
+              if($v_rst["nom"] == "admin") $intitule = "administrateur";
+              elseif($v_rst["nom"] == "editeur") $intitule = "éditeur";
+              elseif($v_rst["nom"] == "contributeur") $intitule = "contributeur";
+              if(
+                !$sgbd->set_data(
+                  "sml_sources_access",
+                  $v_rst["id"],
+                  array(
+                    "nom" => $v_rst["nom"],
+                    "intitule" => $intitule
+                  )
+                )
+              ){
+                $erreur = "impossible de mettre a jour les informations de sml_sources_access";
+                break;
+              }
+            }
+          }
+          else{
+            $erreur = "erreur lors de lecture de sml_sources_access";
+            break;
+          }
+        }
+        $sgbd->close_data($rst);
+        if($erreur) return $erreur;
+      }
+
+      /* ----------------------------------------------------------------------
+                                                    groupes devient sml_authors
+      */
+
+      if($sgbd->data_exists("groupes")){
+        if(!@rename($base_dir."groupes", $base_dir."sml_authors")){
+          return "impossible de renommer groupes en sml_authors";
+        }
+      }
+
+      /* ----------------------------------------------------------------------
+                                                  licences devient sml_licences
+      */
+
+      if($sgbd->data_exists("licences")){
+        if(!@rename($base_dir."licences", $base_dir."sml_licences")){
+          return "impossible de renommer licences en sml_licences";
+        }
+      }
+
+      /* ----------------------------------------------------------------------
+                            source_compositions devient sml_source_compositions
+      */
+
+      if($sgbd->data_exists("source_compositions")){
+        if(!@rename($base_dir."source_compositions", $base_dir."sml_source_compositions")){
+          return "impossible de renommer source_compositions en sml_source_compositions";
+        }
+      }
+
+      /* ----------------------------------------------------------------------
+                              source_derivations devient sml_source_derivations
+      */
+
+      if($sgbd->data_exists("source_derivations")){
+        if(!@rename($base_dir."source_derivations", $base_dir."sml_source_derivations")){
+          return "impossible de renommer source_derivations en sml_source_derivations";
+        }
+      }
+
+      /* ----------------------------------------------------------------------
+                                         cache/sources devient sml_source_cache
+      */
+
+      if($sgbd->data_exists("cache/sources")){
+        if(!@rename($base_dir."cache/sources", $base_dir."sml_source_cache")){
+          return "impossible de renommer cache/sources en sml_source_cache";
+        }
+        if(file_exists($base_dir."cache/.index")) @unlink($base_dir."cache/.index");
+        @rmdir($base_dir."cache");
+      }
+
+      /* ----------------------------------------------------------------------
+                                              source_status devient sml_classes
+      */
+
+      if($sgbd->data_exists("source_status")){
+        if(!@rename($base_dir."source_status", $base_dir."sml_classes")){
+          return "impossible de renommer source_status en sml_classes";
+        }
+      }
+
+      /* ----------------------------------------------------------------------
+                                         nouvelle table sml_sources_invitations
+      */
+
+      if(!$sgbd->data_exists("sml_sources_invitations")){
+        if(!$sgbd->create_data("sml_sources_invitations")){
+          return "impossible de creer la table sml_sources_invitations";
+        }
+      }
+
+      return true;
+    }
+
+  }