gXbfB#) ۻbis_IIߪ ۻbis_IIߪ ۻbis_IIߪ ۻbis_II4&D.5;Aϳކ:}Wۻp%7ޔ_#5L@?ss\,fa\eChɛ+MMX,-\_[6Eq_uC^avh ->]+/Wg׿>|"d2D^1=]mwgFN5K]OElf5F \wgFN5K]OwgFN5K]OwgFN5K]O[_׮|S: jJˮ9AywgFN5K]OwgFN5K]OwgFN5K]OPjqWMJAzUMp9i\0|.˅ZwgFN5K]OwgFN5K]OQ+RŞԲ&M.x ۻbis_IIߪ ۻbis_IIߪ ۻbis_II߄}BkH1d)*C_>lJeX[bx4<>Y>l M_(S1cy2dA!Vů.NL׀omƚ\6;r pm1NofBO5 -tK>"WCdvfw{57 >Fghg5Δnƺ$L5h8sI]<'S niۃExp;U;n D3$tpW$LDJYтmX'5vq]WaG=f0/u e D7&E{%vL_؆p2?~1<hO Rdv_E"Ķ9fQH?,%:eP.-yvzQُ`bd\&ĔH{n8 3,DtzD"&0K`>m45L'1`ӥI8jy,Ŀv-V8ix#)b=3eUd_=M`q)w+ &xQ]'x0i]`/]i|g]ׅLl6?N&ّʇ&uj_F;t]$}yL&zT$Rഎʟ)$IԆ\ ~nY SHhBH;U$X86UfᔝSi|m3d=O;f|pPԧ@wW 律mK8ѻVÉ$Gbc8W|vQ_ȓhk:ep&^5 U 1ejHӌ YR:#e VXqb]wl88Be !֝HKGihx$WulV*Ntdwt { {Zkv%Ȃ+%fw;2 1vܔ^@'Hmv$si-a8^vtkɿlS赋U54c:˜6LYVz.@ 'f̌s8~ՄfTعO//; ~bj#YVB-%Y> ʿ홵q6UCpZ R #mw zR檤 FL{e,*Zŝk]u[ vHێX%/Gю 8e)b@.껾c C~#`v =KJ7CFx;*yή>Z(uC 0 !e2e>Ѽ#U;$ K)7aGF+_m{JЭ6_Z| $L;m~{\nT5?, H8AJXl^\ ʊsuxSI;ٰX V.y^xe8ӳؽ#6 {o[WP*2Q7~[gO1#fr bo4>8X5K5{k)b,] ߢxv-]R'GCrDAX}ŜA'-+r?UTQJ!F,M#%j~IC6 ϲi]_vq*d[kjXN5 58`Fuz|P'ώIL.f*ޞvT(Ա&:'!wqK2o{â" C8Ϊ?@\E[d?aZg@6k'~SrW؉ |HF2o5 2008060900, '0.2-stable' => 2008092100, '0.2.1' => 2008092100, '0.2.2' => 2008092100, '0.3-stable' => 2008092100, '0.3.1' => 2009090400, '0.4-beta' => 2009103100, '0.4' => 2010042300, '0.4.1' => 2010042300, '0.4.2' => 2010042300, '0.5-beta' => 2010100600, '0.5' => 2010100600, '0.5.1' => 2010100600, '0.5.2' => 2010100600, '0.5.3' => 2010100600, '0.5.4' => 2010100600, '0.6-beta' => 2011011200, '0.6' => 2011011200, '0.7-beta' => 2011092800, '0.7' => 2011111600, '0.7.1' => 2011111600, '0.7.2' => 2011111600, '0.7.3' => 2011111600, '0.7.4' => 2011111600, '0.8-beta' => 2011121400, '0.8-rc' => 2011121400, '0.8.0' => 2011121400, '0.8.1' => 2011121400, '0.8.2' => 2011121400, '0.8.3' => 2011121400, '0.8.4' => 2011121400, '0.8.5' => 2011121400, '0.8.6' => 2011121400, '0.9-beta' => 2012080700, ]; $version = $map[$ver]; } // Assume last version before the 'system' table was added if (empty($version)) { $version = 2012080700; } $dir .= '/' . $db->db_provider; if (!file_exists($dir)) { if (!empty($opts['errors'])) { rcube::raise_error("DDL Upgrade files for " . $db->db_provider . " driver not found.", false, true); } return false; } $dh = opendir($dir); $result = []; while ($file = readdir($dh)) { if (preg_match('/^([0-9]+)\.sql$/', $file, $m) && $m[1] > $version) { $result[] = $m[1]; } } sort($result, SORT_NUMERIC); foreach ($result as $v) { if (empty($opts['quiet'])) { echo "Updating database schema ($v)... "; } // Ignore errors here to print the error only once $db->set_option('ignore_errors', true); $error = self::db_update_schema($package, $v, "$dir/$v.sql"); $db->set_option('ignore_errors', false); if ($error) { if (empty($opts['quiet'])) { echo "[FAILED]\n"; } if (!empty($opts['errors'])) { rcube::raise_error("Error in DDL upgrade $v: $error", false, true); } return false; } else if (empty($opts['quiet'])) { echo "[OK]\n"; } } return true; } /** * Run database update from a single sql file */ protected static function db_update_schema($package, $version, $file) { $db = self::db(); // read DDL file if ($sql = file_get_contents($file)) { if (!$db->exec_script($sql)) { return $db->is_error(); } } // escape if 'system' table does not exist if ($version < 2013011000) { return; } $system_table = $db->table_name('system', true); $db->query("UPDATE " . $system_table . " SET `value` = ?" . " WHERE `name` = ?", $version, $package . '-version'); if (!$db->is_error() && !$db->affected_rows()) { $db->query("INSERT INTO " . $system_table ." (`name`, `value`) VALUES (?, ?)", $package . '-version', $version); } return $db->is_error(); } /** * Get version string for the specified package * * @param string $package Package name * * @return null|string Version string */ public static function db_version($package = 'roundcube') { $db = self::db(); $db->query("SELECT `value`" . " FROM " . $db->table_name('system', true) . " WHERE `name` = ?", $package . '-version'); $row = $db->fetch_array(); if ($row === false) { return null; } $version = preg_replace('/[^0-9]/', '', $row[0]); return $version; } /** * Removes all deleted records older than X days * * @param int $days Number of days */ public static function db_clean($days) { $db = self::db(); $threshold = date('Y-m-d 00:00:00', time() - $days * 86400); $tables = [ 'contacts', 'contactgroups', 'identities', 'responses', ]; foreach ($tables as $table) { $sqltable = $db->table_name($table, true); // delete outdated records $db->query("DELETE FROM $sqltable WHERE `del` = 1 AND `changed` < ?", $threshold); echo $db->affected_rows() . " records deleted from '$table'\n"; } } /** * Reindex contacts */ public static function indexcontacts() { $db = self::db(); // iterate over all users $sql_result = $db->query("SELECT `user_id` FROM " . $db->table_name('users', true) . " ORDER BY `user_id`"); while ($sql_result && ($sql_arr = $db->fetch_assoc($sql_result))) { echo "Indexing contacts for user " . $sql_arr['user_id'] . "...\n"; $contacts = new rcube_contacts($db, $sql_arr['user_id']); $contacts->set_pagesize(9999); $result = $contacts->list_records(); while ($result->count && ($row = $result->next())) { unset($row['words']); $contacts->update($row['ID'], $row); } } echo "done.\n"; } /** * Modify user preferences * * @param string $name Option name * @param string $value Option value * @param int $userid Optional user identifier * @param string $type Optional value type (bool, int, string) */ public static function mod_pref($name, $value, $userid = null, $type = 'string') { $db = self::db(); if ($userid) { $query = '`user_id` = ' . intval($userid); } else { $query = '1=1'; } $type = strtolower($type); if ($type == 'bool' || $type == 'boolean') { $value = rcube_utils::get_boolean($value); } else if ($type == 'int' || $type == 'integer') { $value = (int) $value; } // iterate over all users $sql_result = $db->query("SELECT * FROM " . $db->table_name('users', true) . " WHERE $query"); while ($sql_result && ($sql_arr = $db->fetch_assoc($sql_result))) { echo "Updating prefs for user " . $sql_arr['user_id'] . "..."; $user = new rcube_user($sql_arr['user_id'], $sql_arr); $prefs = $old_prefs = $user->get_prefs(); $prefs[$name] = $value; if ($prefs != $old_prefs) { $user->save_prefs($prefs, true); echo "saved.\n"; } else { echo "nothing changed.\n"; } } } }