3 define('NP_RETAIN_OPTIONS_LIFETIME', 86400);
5 class NP_RetainOptions extends NucleusPlugin {
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';
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))';
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))';
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)'
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'));
44 function supportsFeature($what) {
47 case 'SqlTablePrefix':
53 function getTableList() {
54 return array(sql_table('plug_retainoptions_plugin'), sql_table('plug_retainoptions'));
56 function getEventList() {
57 return array('PreDeletePlugin','PostAddPlugin');
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 '
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'])."'");
88 mysql_free_result($options);
90 mysql_free_result($descs);
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);
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']);
126 mysql_free_result($values);
128 mysql_free_result($odescs);
130 mysql_free_result($options);
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']));
146 mysql_free_result($options);
147 sql_query('DELETE FROM '. sql_table('plug_retainoptions_options')
148 . ' WHERE id='.intval($row['id']));
150 mysql_free_result($result);
151 sql_query('DELETE FROM '.sql_table('plug_retainoptions_plugin')
152 ." WHERE STORETIME < " . intval($oldesttimestamp));