source: spip-zone/_plugins_/job_queue/base/queue.php @ 39423

Last change on this file since 39423 was 39423, checked in by cedric@…, 10 years ago

optimisation : passer le champ status en int avec un index pour accelerer les traitements et eviter les slow queries

File size: 5.1 KB
Line 
1<?php
2/*
3 * Plugin Job Queue
4 * (c) 2009 Cedric&Fil
5 * Distribue sous licence GPL
6 *
7 */
8
9if (!defined("_ECRIRE_INC_VERSION")) return;
10
11function queue_declarer_tables_interfaces($interface){
12        // 'spip_' dans l'index de $tables_principales
13        $interface['table_des_tables']['jobs']='jobs';
14
15        $interface['tables_jointures']['spip_jobs'][] = 'jobs_liens';
16
17        return $interface;
18}
19
20function queue_declarer_tables_principales($tables_principales){
21
22        $spip_jobs = array(
23                "id_job"        => "bigint(21) NOT NULL",
24                "descriptif"    => "text DEFAULT '' NOT NULL",
25                "fonction"      => "varchar(255) NOT NULL", //nom de la fonction
26                "args"=> "longblob DEFAULT '' NOT NULL", // arguments
27                "md5args"=> "char(32) NOT NULL default ''", // signature des arguments
28                "inclure" => "varchar(255) NOT NULL", // fichier a inclure ou path/ pour charger_fonction
29                "priorite"      => "smallint(6) NOT NULL default 0",
30                "date" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", // date au plus tot
31                "status" => "tinyint NOT NULL default 1",
32                );
33
34        $spip_jobs_key = array(
35                "PRIMARY KEY"   => "id_job",
36                "KEY date" => "date",
37                "KEY status" => "status",
38        );
39
40        $tables_principales['spip_jobs'] = array(
41                'field' => &$spip_jobs,
42                'key' => &$spip_jobs_key);
43
44        return $tables_principales;
45}
46
47
48function queue_declarer_tables_auxiliaires($tables_auxiliaires){
49        $spip_jobs_liens = array(
50                "id_job"        => "bigint(21) DEFAULT '0' NOT NULL",
51                "id_objet"      => "bigint(21) DEFAULT '0' NOT NULL",
52                "objet" => "VARCHAR (25) DEFAULT '' NOT NULL",
53        );
54
55$spip_documents_liens_key = array(
56                "PRIMARY KEY"           => "id_job,id_objet,objet",
57                "KEY id_job"    => "id_job");
58
59        $tables_auxiliaires['spip_jobs_liens'] = array(
60                'field' => &$spip_jobs_liens,
61                'key' => &$spip_documents_liens_key);
62        return $tables_auxiliaires;
63}
64
65function queue_upgrade($nom_meta_base_version,$version_cible){
66        $current_version = 0.0;
67        if (   (!isset($GLOBALS['meta'][$nom_meta_base_version]) )
68                        || (($current_version = $GLOBALS['meta'][$nom_meta_base_version])!=$version_cible)){
69                include_spip('base/abstract_sql');
70                if (version_compare($current_version,"0.2.0",'<')){
71                        include_spip('base/serial');
72                        include_spip('base/auxiliaires');
73                        include_spip('base/create');
74                        creer_base();
75                        ecrire_meta($nom_meta_base_version,$current_version=$version_cible,'non');
76                }
77                if (version_compare($current_version,"0.3.0",'<')){
78                        include_spip('base/serial');
79                        include_spip('base/auxiliaires');
80                        include_spip('base/create');
81                        maj_tables(array('spip_jobs'));
82                        // mettre a jour les md5args
83                        $res = sql_select("id_job,args", "spip_jobs", "md5args=''");
84                        while ($row = sql_fetch($res)){
85                                sql_updateq('spip_jobs', array('md5args'=>md5($row['args'])),"id_job=".intval($row['id_job']));
86                        }
87                        ecrire_meta($nom_meta_base_version,$current_version="0.3.0",'non');
88                }
89                if (version_compare($current_version,"0.3.1",'<')){
90                        sql_alter("table spip_jobs change md5args md5args char(32) NOT NULL default ''");
91                        ecrire_meta($nom_meta_base_version,$current_version="0.3.1",'non');
92                }
93                if (version_compare($current_version,"0.3.2",'<')){
94                        sql_alter("table spip_jobs change args args longblob DEFAULT '' NOT NULL");
95                        sql_alter("table spip_jobs add index status (status)");
96                        ecrire_meta($nom_meta_base_version,$current_version="0.3.2",'non');
97                }
98                if (version_compare($current_version,"0.3.3",'<')){
99                        include_spip('inc/queue'); // define _JQ_PENDING
100                        // virer d'abord l'index existant
101                        sql_alter("table spip_jobs drop index status");
102                        // ne pas refaire un update si la migration a deja eu lieu
103                        if (!sql_countsel('spip_jobs', 'status=1')){
104                                // renommer le champ le temps de la migration
105                                sql_alter("table spip_jobs change status status_old varchar(15) NOT NULL default 'scheduled'");
106                                // ajouter le nouveau status avec un nom provisoire
107                                sql_alter("table spip_jobs add status_new tinyint NOT NULL default 1");
108                                // synchroniser les deux status
109                                sql_update('spip_jobs',array('status_new'=>intval(_JQ_PENDING)),"status_old='pending'");
110                        }
111                        // renommer le status
112                        sql_alter("table spip_jobs change status_new status tinyint NOT NULL default 1");
113                        // placer un index dessus
114                        sql_alter("table spip_jobs add index status (status)");
115                        // virer le vieux status
116                        sql_alter("table spip_jobs drop status_old");
117                        ecrire_meta($nom_meta_base_version,$current_version="0.3.3",'non');
118                }
119
120        }
121        // replanifier les taches cron quand on passe ici
122        include_spip('inc/genie');
123        genie_queue_watch_dist();
124}
125
126function queue_vider_tables($nom_meta_base_version) {
127        effacer_meta('queue_next_job_time');
128        effacer_meta($nom_meta_base_version);
129        sql_drop_table("spip_jobs");
130}
131
132
133function queue_install($action,$prefix,$version_cible){
134        $version_base = $GLOBALS[$prefix."_base_version"];
135        switch ($action){
136                case 'test':
137                        $ok = (isset($GLOBALS['meta'][$prefix."_base_version"])
138                                AND version_compare($GLOBALS['meta'][$prefix."_base_version"],$version_cible,">="));
139                        if ($ok){
140                                // replanifier les taches cron quand on passe ici
141                                include_spip('inc/genie');
142                                genie_queue_watch_dist();
143                        }
144                        return $ok;
145                        break;
146                case 'install':
147                        queue_upgrade($prefix."_base_version",$version_cible);
148                        break;
149                case 'uninstall':
150                        queue_vider_tables($prefix."_base_version");
151                        break;
152        }
153}
154
155?>
Note: See TracBrowser for help on using the repository browser.