OSDN Git Service

git-svn-id: https://svn.sourceforge.jp/svnroot/nucleus-jp/plugin@867 1ca29b6e-896d...
[nucleus-jp/nucleus-plugins.git] / trunk / NP_RetainOptions / NP_RetainOptions.php
1 <?php
2
3 define('NP_RETAIN_OPTIONS_LIFETIME', 86400);
4
5 class NP_RetainOptions extends NucleusPlugin {
6
7  function getNAME() { return 'Retain Options';  }
8  function getAuthor()  { return 'Andy';  }
9  function getURL() {  return ''; }
10  function getVersion() { return '0.6'; }
11  function getDescription() { 
12   return 'Retain plugin options while you update(uninstall and reinstall) plugins. Keep up to one day';
13  }
14  
15         function install() {
16                 $this->createOption("disable", "Disable this plugin", "yesno", "no");
17                 $query =  'CREATE TABLE IF NOT EXISTS '. sql_table('plug_retainoptions_plugin'). ' ('
18                                 . 'id int(11) not null auto_increment, '
19                                 . 'pluginname VARCHAR(40) NOT NULL, '
20                                 . 'storetime DATETIME, '
21                                 . 'PRIMARY KEY (id))';
22                 sql_query($query);
23                 $query =  'CREATE TABLE IF NOT EXISTS '. sql_table('plug_retainoptions_options'). ' ('
24                                 . 'id int(11) not null, '
25                                 . 'optionid int(11) not null auto_increment, '
26                                 . 'optionname VARCHAR(20) NOT NULL, '
27                                 . 'optioncontext VARCHAR(20), '
28                                 . 'PRIMARY KEY (optionid))';
29                 sql_query($query);
30                 $query =  'CREATE TABLE IF NOT EXISTS '. sql_table('plug_retainoptions'). ' ('
31                                 . 'optionid int(11) NOT NULL,'
32                                 . 'contextid int(11),'
33                                 . 'optionvalue VARCHAR(255)'
34                                 . ') ';
35                 sql_query($query);
36         }
37  
38         function unInstall() { 
39                 sql_query('DROP TABLE ' .sql_table('plug_retainoptions_plugin'));
40                 sql_query('DROP TABLE ' .sql_table('plug_retainoptions_options'));
41                 sql_query('DROP TABLE ' .sql_table('plug_retainoptions'));
42         }
43
44         function supportsFeature($what) {
45                 switch($what)
46                 {
47                         case 'SqlTablePrefix':
48                                 return 1;
49                         default:
50                                 return 0;
51                 }
52         }
53         function getTableList() {
54                 return array(sql_table('plug_retainoptions_plugin'), sql_table('plug_retainoptions'));
55         }
56         function getEventList() {
57                 return array('PreDeletePlugin','PostAddPlugin');
58         }
59
60         function event_PreDeletePlugin(&$data) {
61                 if ($this->getOption('disable') == 'yes') return;
62                 $plugid = $data['plugid'];
63                 $result = sql_query('SELECT pfile FROM '.sql_table('plugin'). ' WHERE pid='.intval($plugid));
64                 $plugin = mysql_fetch_array($result);
65                 $pname = strtolower($plugin['pfile']);
66                 mysql_free_result($result);
67                 if ($pname == get_class($this)) return; // don't retain this plugin
68                 $currenttime = mysqldate(time());
69                 sql_query('INSERT INTO '.sql_table('plug_retainoptions_plugin')
70                                 . " (pluginname, storetime) VALUES ('" . mysql_real_escape_string($pname) . "', " . intval($currenttime) . ")");
71                 $id = mysql_insert_id();
72                 $descs = sql_query('SELECT oid, oname, ocontext FROM '.sql_table('plugin_option_desc')
73                                                 . ' WHERE opid='.intval($plugid));
74                 while ($desc = mysql_fetch_array($descs)) {
75                         sql_query('INSERT INTO '.sql_table('plug_retainoptions_options'). ' SET '
76                                         . "id=" . intval($id)
77                                         . ", optionname='".mysql_real_escape_string($desc['oname'])."'"
78                                         . ", optioncontext='".mysql_real_escape_string($desc['ocontext'])."'");
79                         $optionid = mysql_insert_id();
80                         $options = sql_query('SELECT ovalue, ocontextid FROM '.sql_table('plugin_option')
81                                                           . ' WHERE oid='.$desc['oid']);
82                         while ($option = mysql_fetch_array($options)) {
83                                 sql_query('INSERT INTO '.sql_table('plug_retainoptions'). ' SET '
84                                                 . "optionid=". intval($optionid)
85                                                 . ', contextid='.intval($option['ocontextid'])
86                                                 . ", optionvalue='".mysql_real_escape_string($option['ovalue'])."'");
87                         }
88                         mysql_free_result($options);
89                 }
90                 mysql_free_result($descs);
91         }
92
93         function event_PostAddPlugin(&$data) {
94                 if ($this->getOption('disable') == 'yes') return;
95                 $plugin = & $data['plugin'];
96                 $pname = get_class($plugin);
97                 $oldesttimestamp = mysqldate(time() - NP_RETAIN_OPTIONS_LIFETIME);
98                 $result = sql_query('SELECT id FROM '.sql_table('plug_retainoptions_plugin')
99                                                         ." WHERE pluginname='". mysql_real_escape_string($pname) . "' AND STORETIME>=". intval($oldesttimestamp));
100                 $nums = mysql_num_rows($result);
101                 if (!$nums) { $this->cleanup(); return; }
102                 while ($nums--) $row = mysql_fetch_array($result);
103                 mysql_free_result($result);
104                 $id = $row['id'];
105                 $options = sql_query('SELECT optionid, optionname, optioncontext FROM '
106                                                         . sql_table('plug_retainoptions_options')
107                                                         . " WHERE id=".intval($id));
108                 while ($option = mysql_fetch_array($options)) {
109                         $optionname = $option['optionname'];
110                         $contextname = $option['optioncontext'];
111                         $odescs = sql_query('SELECT oid FROM '.sql_table('plugin_option_desc')
112                                                 . ' WHERE opid='.intval($plugin->plugid)
113                                                 . " AND oname='".mysql_real_escape_string($optionname)."'"
114                                                 . " AND ocontext='".mysql_real_escape_string($contextname)."'");
115                         // restore values only when option name and option context are same
116                         if ($odesc = mysql_fetch_array($odescs)) {
117                                 $values = sql_query('SELECT contextid, optionvalue FROM '
118                                                                 . sql_table('plug_retainoptions')
119                                                                 . ' WHERE optionid='.intval($option['optionid']));
120                                 while ($value = mysql_fetch_array($values)) {
121                                         // call plugin function instead of directly store in DB
122                                         // because some items/blogs/categories might not exist
123                                         $plugin->_setOption($contextname,$value['contextid'],
124                                                                                 $optionname, $value['optionvalue']);
125                                 }
126                                 mysql_free_result($values);
127                         }
128                         mysql_free_result($odescs);
129                 }
130                 mysql_free_result($options);
131                 $this->cleanup();
132         }
133
134         function cleanup() {
135                 $oldesttimestamp = time() - NP_RETAIN_OPTIONS_LIFETIME;
136                 $result = sql_query('SELECT id FROM '.sql_table('plug_retainoptions_plugin')
137                                                         ." WHERE STORETIME < " . intval($oldesttimestamp));
138                 while ($row = mysql_fetch_array($result)) {
139                         $options = sql_query('SELECT optionid FROM '
140                                                                 . sql_table('plug_retainoptions_options')
141                                                                 . ' WHERE id='.intval($row['id']));
142                         while ($option = mysql_fetch_array($options)) {
143                                 sql_query('DELETE FROM '.sql_table('plug_retainoptions')
144                                                 . ' WHERE optionid='.intval($option['optionid']));
145                         }
146                         mysql_free_result($options);
147                         sql_query('DELETE FROM '. sql_table('plug_retainoptions_options')
148                                         . ' WHERE id='.intval($row['id']));
149                 }
150                 mysql_free_result($result);
151                 sql_query('DELETE FROM '.sql_table('plug_retainoptions_plugin')
152                                 ." WHERE STORETIME < " . intval($oldesttimestamp));
153         }
154
155 }
156 ?>