Overview
Comment:La mise à jour doit se faire dans un try catch, permettant de nettoyer et revenir en arrière en cas de souci
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | dev
Files: files | file ages | folders
SHA1: 24aa10392ce9082ef29ac91de7c7b90f08808db4
User & Date: bohwaz on 2019-01-09 11:04:58
Other Links: branch diff | manifest | tags
Context
2019-01-09
21:14
Undo log des requêtes SQL check-in: 4f901f656b user: bohwaz tags: dev
11:04
La mise à jour doit se faire dans un try catch, permettant de nettoyer et revenir en arrière en cas de souci check-in: 24aa10392c user: bohwaz tags: dev
2019-01-08
14:59
Merge trunk check-in: ae518b948a user: bohwaz tags: dev
Changes

Modified src/www/admin/upgrade.php from [fe3b618e90] to [8ddde4bfb3].

41
42
43
44
45
46
47
48

49
50
51
52
53
54
55
41
42
43
44
45
46
47

48
49
50
51
52
53
54
55







-
+








Static_Cache::store('upgrade', 'Mise à jour en cours.');

$db = DB::getInstance();
$redirect = true;

// Créer une sauvegarde automatique
(new Sauvegarde)->create('pre-upgrade-' . garradin_version());
$backup_name = (new Sauvegarde)->create('pre-upgrade-' . garradin_version());

echo '<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0, target-densitydpi=device-dpi" />
    <link rel="stylesheet" type="text/css" href="static/admin.css" media="all" />
65
66
67
68
69
70
71
72
73
74
75




76
77
78


79
80
81
82



83
84
85
86
87
88





89
90
91
92



93
94
95
96
97
98
99
100
101
102









103
104
105


106
107
108
109



110
111
112


113
114
115


116
117
118
119
120




121
122
123
124



125
126
127


128
129
130


131
132

133
134

135
136

137
138

139
140
141
142



143
144
145
146



147
148
149
150
151
152
153






154
155
156


157
158
159
160
161




162
163
164
165
166




167
168

169
170

171
172
173


174
175
176
177



178
179

180
181
182


183
184
185
186
187




188
189

190
191
192
193
194
195
196






197
198
199
200
201




202
203
204
205
206
207
208






209
210
211
212
213
214





215
216
217


218
219

220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238


















239
240
241
242



243
244

245
246
247
248



249
250
251
252
253
254





255
256

257
258

259
260

261
262
263
264
265






266
267

268
269

270
271
272


273
274
275
276
277
278
279
280
281








282
283

284
285
286
287
288




289
290










291
292
293
294
295
296
297
65
66
67
68
69
70
71




72
73
74
75
76


77
78
79



80
81
82
83





84
85
86
87
88
89



90
91
92
93









94
95
96
97
98
99
100
101
102
103


104
105
106



107
108
109
110


111
112
113


114
115
116




117
118
119
120
121



122
123
124
125


126
127
128


129
130
131

132
133

134
135

136
137

138
139



140
141
142
143



144
145
146
147






148
149
150
151
152
153
154


155
156
157




158
159
160
161
162




163
164
165
166
167

168
169

170
171


172
173
174



175
176
177
178

179
180


181
182
183




184
185
186
187
188

189
190






191
192
193
194
195
196
197




198
199
200
201
202






203
204
205
206
207
208
209





210
211
212
213
214
215


216
217
218

219
220


















221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239



240
241
242
243

244
245



246
247
248
249





250
251
252
253
254
255

256
257

258
259

260
261




262
263
264
265
266
267
268

269
270

271
272


273
274
275








276
277
278
279
280
281
282
283
284

285
286




287
288
289
290
291

292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308







-
-
-
-
+
+
+
+

-
-
+
+

-
-
-
+
+
+

-
-
-
-
-
+
+
+
+
+

-
-
-
+
+
+

-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+

-
-
+
+

-
-
-
+
+
+

-
-
+
+

-
-
+
+

-
-
-
-
+
+
+
+

-
-
-
+
+
+

-
-
+
+

-
-
+
+

-
+

-
+

-
+

-
+

-
-
-
+
+
+

-
-
-
+
+
+

-
-
-
-
-
-
+
+
+
+
+
+

-
-
+
+

-
-
-
-
+
+
+
+

-
-
-
-
+
+
+
+

-
+

-
+

-
-
+
+

-
-
-
+
+
+

-
+

-
-
+
+

-
-
-
-
+
+
+
+

-
+

-
-
-
-
-
-
+
+
+
+
+
+

-
-
-
-
+
+
+
+

-
-
-
-
-
-
+
+
+
+
+
+

-
-
-
-
-
+
+
+
+
+

-
-
+
+

-
+

-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

-
-
-
+
+
+

-
+

-
-
-
+
+
+

-
-
-
-
-
+
+
+
+
+

-
+

-
+

-
+

-
-
-
-
+
+
+
+
+
+

-
+

-
+

-
-
+
+

-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+

-
+

-
-
-
-
+
+
+
+

-
+
+
+
+
+
+
+
+
+
+







<div id="loader" class="loader" style="margin: 2em 0; height: 50px;"></div>
<script>
animatedLoader(document.getElementById("loader"), 5);
</script>';

flush();


if (version_compare($v, '0.7.0', '<'))
{
    $db->exec('PRAGMA foreign_keys = OFF; BEGIN;');
try {
    if (version_compare($v, '0.7.0', '<'))
    {
        $db->exec('PRAGMA foreign_keys = OFF; BEGIN;');

    // Mise à jour base de données
    $db->exec(file_get_contents(ROOT . '/include/data/0.7.0.sql'));
        // Mise à jour base de données
        $db->exec(file_get_contents(ROOT . '/include/data/0.7.0.sql'));

    // Changement de syntaxe du Wiki vers SkrivML
    $wiki = new Wiki;
    $res = $db->get('SELECT id_page, contenu, revision, chiffrement FROM wiki_revisions GROUP BY id_page ORDER BY revision DESC;');
        // Changement de syntaxe du Wiki vers SkrivML
        $wiki = new Wiki;
        $res = $db->get('SELECT id_page, contenu, revision, chiffrement FROM wiki_revisions GROUP BY id_page ORDER BY revision DESC;');

    foreach ($res as $row)
    {
        // Ne pas convertir le contenu chiffré, de toute évidence
        if ($row->chiffrement)
            continue;
        foreach ($res as $row)
        {
            // Ne pas convertir le contenu chiffré, de toute évidence
            if ($row->chiffrement)
                continue;

        $content = $row->contenu;
        $content = Utils::HTMLToSkriv($content);
        $content = Utils::SpipToSkriv($content);
            $content = $row->contenu;
            $content = Utils::HTMLToSkriv($content);
            $content = Utils::SpipToSkriv($content);

        if ($content != $row->contenu)
        {
            $wiki->editRevision($row->id_page, $row->revision, [
                'id_auteur'     =>  null,
                'contenu'       =>  $content,
                'modification'  =>  'Mise à jour 0.7.0 (transformation SPIP vers SkrivML)',
            ]);
        }
    }
            if ($content != $row->contenu)
            {
                $wiki->editRevision($row->id_page, $row->revision, [
                    'id_auteur'     =>  null,
                    'contenu'       =>  $content,
                    'modification'  =>  'Mise à jour 0.7.0 (transformation SPIP vers SkrivML)',
                ]);
            }
        }

    $db->exec('END;');
}
        $db->exec('END;');
    }

if (version_compare($v, '0.7.2', '<'))
{
    $db->exec('PRAGMA foreign_keys = OFF; BEGIN;');
    if (version_compare($v, '0.7.2', '<'))
    {
        $db->exec('PRAGMA foreign_keys = OFF; BEGIN;');

    // Mise à jour base de données
    $db->exec(file_get_contents(ROOT . '/include/data/0.7.2.sql'));
        // Mise à jour base de données
        $db->exec(file_get_contents(ROOT . '/include/data/0.7.2.sql'));

    $db->exec('END;');
}
        $db->exec('END;');
    }

if (version_compare($v, '0.8.0-beta4', '<'))
{
    // Inscription de l'appid
    $db->exec('PRAGMA application_id = ' . DB::APPID . ';');
    if (version_compare($v, '0.8.0-beta4', '<'))
    {
        // Inscription de l'appid
        $db->exec('PRAGMA application_id = ' . DB::APPID . ';');

    // Changement de la taille de pagesize
    // Cecit devrait améliorer les performances de la DB
    $db->exec('PRAGMA page_size = 4096;');
        // Changement de la taille de pagesize
        // Cecit devrait améliorer les performances de la DB
        $db->exec('PRAGMA page_size = 4096;');

    // Application du changement de taille de page
    $db->exec('VACUUM;');
        // Application du changement de taille de page
        $db->exec('VACUUM;');

    // Désactivation des foreign keys AVANT le début de la transaction
    $db->exec('PRAGMA foreign_keys = OFF;');
        // Désactivation des foreign keys AVANT le début de la transaction
        $db->exec('PRAGMA foreign_keys = OFF;');

    $db->begin();
        $db->begin();

    $db->import(ROOT . '/include/data/0.8.0.sql');
        $db->import(ROOT . '/include/data/0.8.0.sql');

    $db->commit();
        $db->commit();

    $config = Config::getInstance();
        $config = Config::getInstance();

    // Ajout champ numéro de membre
    $champs = (array) $config->get('champs_membres')->getAll();
    $presets = Membres\Champs::importPresets();
        // Ajout champ numéro de membre
        $champs = (array) $config->get('champs_membres')->getAll();
        $presets = Membres\Champs::importPresets();

    // Ajout du numéro au début
    $champs = array_merge(['numero' => $presets['numero']], $champs);
    (new Membres\Champs($champs))->save();
        // Ajout du numéro au début
        $champs = array_merge(['numero' => $presets['numero']], $champs);
        (new Membres\Champs($champs))->save();

    // Si l'ID était l'identificant, utilisons le numéro de membre à la place
    if ($config->get('champ_identifiant') == 'id')
    {
        $config->set('champ_identifiant', 'numero');
        $config->save();
    }
        // Si l'ID était l'identificant, utilisons le numéro de membre à la place
        if ($config->get('champ_identifiant') == 'id')
        {
            $config->set('champ_identifiant', 'numero');
            $config->save();
        }

    // Nettoyage de la base de données
    $db->exec('VACUUM;');
        // Nettoyage de la base de données
        $db->exec('VACUUM;');

    // Mise à jour plan comptable: ajout comptes encaissement
    $comptes = new Compta\Comptes;
    $comptes->importPlan();
}
        // Mise à jour plan comptable: ajout comptes encaissement
        $comptes = new Compta\Comptes;
        $comptes->importPlan();
    }

if (version_compare($v, '0.8.3', '<'))
{
    // Désactivation des foreign keys AVANT le début de la transaction
    $db->exec('PRAGMA foreign_keys = OFF;');
    if (version_compare($v, '0.8.3', '<'))
    {
        // Désactivation des foreign keys AVANT le début de la transaction
        $db->exec('PRAGMA foreign_keys = OFF;');

    $db->begin();
        $db->begin();

    $db->import(ROOT . '/include/data/0.8.3.sql');
        $db->import(ROOT . '/include/data/0.8.3.sql');

    $db->commit();
}
        $db->commit();
    }

if (version_compare($v, '0.8.4', '<'))
{
    $db->begin();
    if (version_compare($v, '0.8.4', '<'))
    {
        $db->begin();

    $db->import(ROOT . '/include/data/0.8.4.sql');
        $db->import(ROOT . '/include/data/0.8.4.sql');

    $db->commit();
}
        $db->commit();
    }

if (version_compare($v, '0.9.0-rc1', '<'))
{
    $db->exec('PRAGMA foreign_keys = OFF;');
    $db->begin();
    if (version_compare($v, '0.9.0-rc1', '<'))
    {
        $db->exec('PRAGMA foreign_keys = OFF;');
        $db->begin();

    $db->import(ROOT . '/include/data/0.9.0.sql');
        $db->import(ROOT . '/include/data/0.9.0.sql');

    // Correction des ID parents des comptes qui ont été mal renseignés
    // exemple : compte 512A avec "5" comme parent (c'était permis,
    // par erreur, par le formulaire d'ajout de compte dans le plan)
    // Serait probablement possible en 3-4 lignes de SQL avec
    // WITH RECURSIVE mais c'est au delà de mes compétences
    $comptes = $db->iterate('SELECT id FROM compta_comptes WHERE parent != length(id) - 1;');
        // Correction des ID parents des comptes qui ont été mal renseignés
        // exemple : compte 512A avec "5" comme parent (c'était permis,
        // par erreur, par le formulaire d'ajout de compte dans le plan)
        // Serait probablement possible en 3-4 lignes de SQL avec
        // WITH RECURSIVE mais c'est au delà de mes compétences
        $comptes = $db->iterate('SELECT id FROM compta_comptes WHERE parent != length(id) - 1;');

    foreach ($comptes as $compte)
    {
        $parent = false;
        $id = $compte->id;
        foreach ($comptes as $compte)
        {
            $parent = false;
            $id = $compte->id;

        while (!$parent && strlen($id))
        {
            // On enlève un caractère à la fin jusqu'à trouver un compte parent correspondant
            $id = substr($id, 0, -1);
            $parent = $db->firstColumn('SELECT id FROM compta_comptes WHERE id = ?;', $id);
        }
            while (!$parent && strlen($id))
            {
                // On enlève un caractère à la fin jusqu'à trouver un compte parent correspondant
                $id = substr($id, 0, -1);
                $parent = $db->firstColumn('SELECT id FROM compta_comptes WHERE id = ?;', $id);
            }

        if (!$parent)
        {
            // Situation normalement impossible !
            throw new \LogicException(sprintf('Le compte %s est invalide et n\'a pas de compte parent possible !', $compte->id));
        }
            if (!$parent)
            {
                // Situation normalement impossible !
                throw new \LogicException(sprintf('Le compte %s est invalide et n\'a pas de compte parent possible !', $compte->id));
            }

        $db->update('compta_comptes', ['parent' => $parent], 'id = :id', ['id' => $compte->id]);
    }
            $db->update('compta_comptes', ['parent' => $parent], 'id = :id', ['id' => $compte->id]);
        }

    $champs = $config->get('champs_membres');
        $champs = $config->get('champs_membres');

    if ($champs->get('lettre_infos'))
    {
        // Ajout d'une recherche avancée en exemple
        $query = [
            'query' => [[
                'operator' => 'AND',
                'conditions' => [
                    [
                        'column'   => 'lettre_infos',
                        'operator' => '= 1',
                        'values'   => [],
                    ],
                ],
            ]],
            'order' => 'numero',
            'desc' => true,
            'limit' => '10000',
        ];
        if ($champs->get('lettre_infos'))
        {
            // Ajout d'une recherche avancée en exemple
            $query = [
                'query' => [[
                    'operator' => 'AND',
                    'conditions' => [
                        [
                            'column'   => 'lettre_infos',
                            'operator' => '= 1',
                            'values'   => [],
                        ],
                    ],
                ]],
                'order' => 'numero',
                'desc' => true,
                'limit' => '10000',
            ];

        $recherche = new Recherche;
        $recherche->add('Membres inscrits à la lettre d\'information', null, $recherche::TYPE_JSON, 'membres', $query);
    }
            $recherche = new Recherche;
            $recherche->add('Membres inscrits à la lettre d\'information', null, $recherche::TYPE_JSON, 'membres', $query);
        }

    $db->commit();
        $db->commit();

    $config->set('desactiver_site', false);
    $config->save();
}
        $config->set('desactiver_site', false);
        $config->save();
    }

if (version_compare($v, '0.9.1', '<'))
{
    // Mise à jour plan comptable: ajout compte licences fédérales
    $comptes = new Compta\Comptes;
    $comptes->importPlan();
    if (version_compare($v, '0.9.1', '<'))
    {
        // Mise à jour plan comptable: ajout compte licences fédérales
        $comptes = new Compta\Comptes;
        $comptes->importPlan();

    $db->begin();
        $db->begin();

    $db->exec('INSERT INTO "compta_categories" VALUES(NULL,-1,\'Licences fédérales\',\'Licences payées pour les adhérents (par exemple fédération sportive etc.)\',\'652\');');
        $db->exec('INSERT INTO "compta_categories" VALUES(NULL,-1,\'Licences fédérales\',\'Licences payées pour les adhérents (par exemple fédération sportive etc.)\',\'652\');');

    $db->import(ROOT . '/include/data/0.9.1.sql');
        $db->import(ROOT . '/include/data/0.9.1.sql');

    $db->commit();
}

Utils::clearCaches();
        $db->commit();

        $db->createUndoTriggers();
    }

    Utils::clearCaches();

$config->setVersion(garradin_version());
    $config->setVersion(garradin_version());

Static_Cache::remove('upgrade');
    Static_Cache::remove('upgrade');

// Réinstaller les plugins système si nécessaire
Plugin::checkAndInstallSystemPlugins();
    // Réinstaller les plugins système si nécessaire
    Plugin::checkAndInstallSystemPlugins();

// Mettre à jour les plugins si nécessaire
foreach (Plugin::listInstalled() as $id=>$infos)
{
    // Ne pas tenir compte des plugins dont le code n'est pas dispo
    if ($infos->disabled)
    {
        continue;
    }
    // Mettre à jour les plugins si nécessaire
    foreach (Plugin::listInstalled() as $id=>$infos)
    {
        // Ne pas tenir compte des plugins dont le code n'est pas dispo
        if ($infos->disabled)
        {
            continue;
        }

    $plugin = new Plugin($id);
        $plugin = new Plugin($id);

    if ($plugin->needUpgrade())
    {
        $plugin->upgrade();
    }
        if ($plugin->needUpgrade())
        {
            $plugin->upgrade();
        }

    unset($plugin);
        unset($plugin);
    }
}
catch (\Exception $e)
{
    $s = new Sauvegarde;
    $s->restoreFromLocal($backup_name);
    $s->remove($backup_name);
    Static_Cache::remove('upgrade');
    throw $e;
}

// Forcer à rafraîchir les données de la session si elle existe
if ($user_is_logged)
{
    $session->refresh();
}