<?php defined("_VALID_ACCESS") || die('Direct access forbidden'); $recordsets = Utils_RecordBrowserCommon::list_installed_recordsets(); $checkpoint = Patch::checkpoint('recordset'); $processed = $checkpoint->get('processed', array()); foreach ($recordsets as $tab => $caption) { if (isset($processed[$tab])) { continue; } $processed[$tab] = true; Patch::require_time(5); $tab = $tab . "_field"; PatchUtil::db_add_column($tab, 'export', 'I1 DEFAULT 1'); $checkpoint->set('processed', $processed); }
if (!isset($columns['ID'])) { $tab_ids_checkpoint = Patch::checkpoint('tab_ids'); if (!$tab_ids_checkpoint->is_done()) { Patch::require_time(20); if (DB::is_postgresql()) { DB::Execute('ALTER TABLE recordbrowser_table_properties DROP CONSTRAINT recordbrowser_table_properties_pkey'); DB::Execute('ALTER TABLE recordbrowser_table_properties ADD COLUMN id SERIAL PRIMARY KEY'); } else { DB::Execute('ALTER TABLE recordbrowser_table_properties DROP PRIMARY KEY'); DB::Execute('ALTER TABLE recordbrowser_table_properties ADD id SMALLINT NOT NULL AUTO_INCREMENT PRIMARY KEY'); } DB::CreateIndex('recordbrowser_table_properties_tab', 'recordbrowser_table_properties', 'tab', array('UNIQUE' => 1)); $tab_ids_checkpoint->done(); } } $field_ids_checkpoint = Patch::checkpoint('field_ids'); if (!$field_ids_checkpoint->is_done()) { Patch::require_time(20); $recordsets = Utils_RecordBrowserCommon::list_installed_recordsets(); foreach ($recordsets as $tab => $caption) { $tab_f = $tab . "_field"; $columns = DB::MetaColumnNames($tab_f); if (!isset($columns['ID'])) { if (DB::is_postgresql()) { @DB::Execute('ALTER TABLE ' . $tab_f . ' DROP CONSTRAINT ' . $tab_f . '_pkey'); DB::Execute('ALTER TABLE ' . $tab_f . ' ADD COLUMN id SERIAL PRIMARY KEY'); } else { @DB::Execute('ALTER TABLE ' . $tab_f . ' DROP PRIMARY KEY'); DB::Execute('ALTER TABLE ' . $tab_f . ' ADD id SMALLINT NOT NULL AUTO_INCREMENT PRIMARY KEY'); } DB::CreateIndex($tab_f . '_field', $tab_f, 'field', array('UNIQUE' => 1));
<?php defined("_VALID_ACCESS") || die('Direct access forbidden'); $checkpoint = Patch::checkpoint('mark_to_index'); if (!$checkpoint->is_done()) { $done = $checkpoint->get('recordsets', array()); $recordsets = Utils_RecordBrowserCommon::list_installed_recordsets(); foreach ($recordsets as $tab => $caption) { Patch::require_time(5); if (!isset($done[$tab])) { DB::Execute('UPDATE ' . $tab . '_data_1 SET indexed=0'); $done[$tab] = true; $checkpoint->set('recordsets', $done); } } $checkpoint->done(); }
<?php defined("_VALID_ACCESS") || die('Direct access forbidden'); ModuleManager::install('Utils/FileStorage'); @PatchUtil::db_add_column('utils_attachment_file', 'filestorage_id', 'I8 NOTNULL'); Patch::set_message('Processing files'); $files_checkpoint = Patch::checkpoint('files'); if (!$files_checkpoint->is_done()) { if ($files_checkpoint->has('files')) { $files = $files_checkpoint->get('files'); } else { $files = 0; } if ($files_checkpoint->has('files_qty')) { $files_qty = $files_checkpoint->get('files_qty'); } else { $files_qty = DB::GetOne('SELECT count(*) FROM utils_attachment_file'); $files_checkpoint->set('files_qty', $files_qty); } while ($ret = DB::SelectLimit('SELECT f.id,f.attach_id as aid,f.original FROM utils_attachment_file f ORDER BY f.id', 1, $files++)) { $row = $ret->FetchRow(); if (!$row) { break; } if (file_exists(DATA_DIR . '/Utils_Attachment/' . $row['aid'] . '/' . $row['id'])) { Patch::set_message('Processing file: ' . $files . '/' . $files_qty); $files_checkpoint->require_time(2); $fsid = Utils_FileStorageCommon::write_file($row['original'], DATA_DIR . '/Utils_Attachment/' . $row['aid'] . '/' . $row['id'], 'attachment_file/' . $row['id']); unlink(DATA_DIR . '/Utils_Attachment/' . $row['aid'] . '/' . $row['id']); DB::Execute('UPDATE utils_attachment_file SET filestorage_id=%d WHERE id=%d', array($fsid, $row['id'])); }
JOIN information_schema.constraint_column_usage AS ccu ON ccu.constraint_name = tc.constraint_name WHERE constraint_type = 'FOREIGN KEY' AND tc.table_name='recordbrowser_words_map' AND kcu.column_name='word_id';"); if($a) { DB::Execute('alter table recordbrowser_words_map drop CONSTRAINT "'.$a.'"'); } } DB::CreateIndex('recordbrowser_words_map__idx','recordbrowser_words_map','word_id,tab,record_id,field_name',array('DROP'=>1)); DB::CreateIndex('recordbrowser_words_map__idx2','recordbrowser_words_map','tab,record_id',array('DROP'=>1)); DB::Execute('TRUNCATE TABLE recordbrowser_words_index'); $remove_idx_checkpoint->done(); } $finalize_checkpoint = Patch::checkpoint('finalize'); if(!$finalize_checkpoint->is_done()) { Patch::require_time(20); PatchUtil::db_drop_column('recordbrowser_words_map', 'tab'); PatchUtil::db_drop_column('recordbrowser_words_map', 'field_name'); if(DB::is_postgresql()) { DB::Execute('ALTER TABLE recordbrowser_words_map ADD CONSTRAINT word_id_fk FOREIGN KEY (word_id) REFERENCES recordbrowser_words_index'); } else { DB::Execute('ALTER TABLE recordbrowser_words_map ADD FOREIGN KEY (word_id) REFERENCES recordbrowser_words_index(id)'); } DB::CreateIndex('recordbrowser_words_map__idx','recordbrowser_words_map','word_id,tab_id'); $finalize_checkpoint->done(); }
<?php defined("_VALID_ACCESS") || die('Direct access forbidden'); // Remove words map records on recordset removal $checkpoint = Patch::checkpoint('truncate'); if (!$checkpoint->is_done()) { Patch::require_time(5); DB::Execute('TRUNCATE TABLE recordbrowser_words_map'); $checkpoint->done(); } $alter_checkpoint = Patch::checkpoint('steps'); if (DB::is_postgresql()) { if ($alter_checkpoint->get('word_id', false) == false) { Patch::require_time(5); $a = DB::GetOne("SELECT\n tc.constraint_name, tc.table_name, kcu.column_name,\n ccu.table_name AS foreign_table_name,\n ccu.column_name AS foreign_column_name\n FROM\n information_schema.table_constraints AS tc\n JOIN information_schema.key_column_usage AS kcu\n ON tc.constraint_name = kcu.constraint_name\n JOIN information_schema.constraint_column_usage AS ccu\n ON ccu.constraint_name = tc.constraint_name\n WHERE constraint_type = 'FOREIGN KEY' AND tc.table_name='recordbrowser_words_map' AND kcu.column_name='word_id';"); if ($a) { DB::StartTrans(); DB::Execute('ALTER TABLE recordbrowser_words_map DROP CONSTRAINT "' . $a . '"'); DB::Execute('ALTER TABLE recordbrowser_words_map ADD CONSTRAINT "' . $a . '" FOREIGN KEY (word_id) REFERENCES recordbrowser_words_index(id) ON DELETE CASCADE ON UPDATE CASCADE'); DB::CompleteTrans(); } $alter_checkpoint->set('word_id', true); } if ($alter_checkpoint->get('tab_id', false) == false) { Patch::require_time(5); $b = DB::GetOne("SELECT\n tc.constraint_name, tc.table_name, kcu.column_name,\n ccu.table_name AS foreign_table_name,\n ccu.column_name AS foreign_column_name\n FROM\n information_schema.table_constraints AS tc\n JOIN information_schema.key_column_usage AS kcu\n ON tc.constraint_name = kcu.constraint_name\n JOIN information_schema.constraint_column_usage AS ccu\n ON ccu.constraint_name = tc.constraint_name\n WHERE constraint_type = 'FOREIGN KEY' AND tc.table_name='recordbrowser_words_map' AND kcu.column_name='tab_id';"); if ($b) { DB::StartTrans(); DB::Execute('ALTER TABLE recordbrowser_words_map DROP CONSTRAINT "' . $b . '"'); DB::Execute('ALTER TABLE recordbrowser_words_map ADD CONSTRAINT "' . $b . '" FOREIGN KEY (tab_id) REFERENCES recordbrowser_table_properties(id) ON DELETE CASCADE ON UPDATE CASCADE'); DB::CompleteTrans();
} } $checkpoint->done(); } $indexes = Patch::checkpoint('indexes'); if (!$indexes->is_done()) { $idxs = DB::MetaIndexes('recordbrowser_words_map'); $indexes->set('data', $idxs); $indexes->done(); } $idxs = $indexes->get('data', array()); $checkpoint = Patch::checkpoint('word_index'); if (!$checkpoint->is_done() && !isset($idxs['rb_words_map__word_idx'])) { DB::CreateIndex('rb_words_map__word_idx', 'recordbrowser_words_map', 'word_id'); $checkpoint->done(); } $checkpoint = Patch::checkpoint('tab_index'); if (!$checkpoint->is_done() && !isset($idxs['rb_words_map__tab_idx'])) { DB::CreateIndex('rb_words_map__tab_idx', 'recordbrowser_words_map', 'tab_id'); $checkpoint->done(); } $checkpoint = Patch::checkpoint('record_tab_index'); if (!$checkpoint->is_done() && !isset($idxs['rb_words_map__record_tab_idx'])) { DB::CreateIndex('rb_words_map__record_tab_idx', 'recordbrowser_words_map', 'record_id,tab_id'); $checkpoint->done(); } $checkpoint = Patch::checkpoint('drop_index'); if (!$checkpoint->is_done() && isset($idxs['recordbrowser_words_map__idx'])) { DB::DropIndex('recordbrowser_words_map__idx', 'recordbrowser_words_map'); $checkpoint->done(); }
<?php defined("_VALID_ACCESS") || die('Direct access forbidden'); $checkpoint = Patch::checkpoint('indexes'); if (!$checkpoint->is_done()) { $done = $checkpoint->get('recordsets', array()); $recordsets = Utils_RecordBrowserCommon::list_installed_recordsets(); foreach ($recordsets as $tab => $caption) { Patch::require_time(1); if (!isset($done[$tab])) { @DB::CreateIndex($tab . '_act', $tab . '_data_1', 'active'); @DB::CreateIndex($tab . '_idxed', $tab . '_data_1', 'indexed,active'); $done[$tab] = true; $checkpoint->set('recordsets', $done); } } $checkpoint->done(); }
<?php defined("_VALID_ACCESS") || die('Direct access forbidden'); $checkpoint = Patch::checkpoint('tables'); if (!$checkpoint->is_done()) { DB::CreateTable('recordbrowser_words_index', 'id I AUTO KEY,word C(3)', array('constraints' => ', UNIQUE(word)')); DB::CreateTable('recordbrowser_words_map', 'word_id I, tab C(64), record_id I, field_name C(32), position I', array('constraints' => ', FOREIGN KEY (word_id) REFERENCES recordbrowser_words_index(id)')); DB::CreateIndex('recordbrowser_words_map__idx', 'recordbrowser_words_map', 'word_id,tab,record_id,field_name'); DB::CreateIndex('recordbrowser_words_map__idx2', 'recordbrowser_words_map', 'tab,record_id'); $checkpoint->done(); } $checkpoint2 = Patch::checkpoint('tabs'); if ($checkpoint2->has('tabs')) { $tabs = $checkpoint2->get('tabs'); } else { $tabs = DB::GetCol('SELECT tab FROM recordbrowser_table_properties'); } foreach ($tabs as $i => $tab) { $checkpoint2->require_time(1); @PatchUtil::db_add_column($tab . '_data_1', 'indexed', 'I1 NOT NULL DEFAULT 0'); @DB::CreateIndex($tab . '_idxed', $tab . '_data_1', 'indexed,active'); unset($tabs[$i]); $checkpoint2->set('tabs', $tabs); }
Patch::set_message('Processing file: ' . $files . '/' . $files_qty); $files_checkpoint->require_time(2); $row['aid'] = $map[$row['attach_id']]; @mkdir(DATA_DIR . '/Utils_Attachment/' . $row['aid']); @rename(DATA_DIR . '/Utils_Attachment/' . $row['local'] . '/' . $row['id'], DATA_DIR . '/Utils_Attachment/' . $row['aid'] . '/' . $row['id']); DB::Execute('UPDATE utils_attachment_file SET attach_id=%d WHERE id=%d', array($row['aid'], $row['id'])); $files_checkpoint->set('files', $files); } $files_checkpoint->done(); } Patch::set_message('Updating database'); $new_fk_checkpoint = Patch::checkpoint('create_new_fk'); if (!$new_fk_checkpoint->is_done()) { Patch::require_time(5); if (DB::is_mysql()) { DB::Execute('ALTER TABLE utils_attachment_file ADD FOREIGN KEY (attach_id) REFERENCES utils_attachment_data_1(id)'); } else { DB::Execute('ALTER TABLE utils_attachment_file ADD CONSTRAINT attach_id_fk FOREIGN KEY (attach_id) REFERENCES utils_attachment_data_1'); } $new_fk_checkpoint->done(); } Patch::set_message('Finishing'); $cleanup_checkpoint = Patch::checkpoint('cleanup'); if (!$cleanup_checkpoint->is_done()) { Patch::require_time(3); DB::DropTable('utils_attachment_note'); DB::DropTable('utils_attachment_link'); Utils_RecordBrowserCommon::enable_watchdog('utils_attachment', array('Utils_AttachmentCommon', 'watchdog_label')); $cleanup_checkpoint->done(); } Utils_WatchdogCommon::dont_notify(false);
$old = Utils_RecordBrowserCommon::get_records('premium_roundcube_custom_addon'); ModuleManager::uninstall('Premium/RoundcubeCustomAddons'); } foreach ($old as $i => $r) { if ($r['recordset'] == 'company' || $r['recordset'] == 'contact') { continue; } $old_checkpoint->require_time(2); Utils_RecordBrowserCommon::new_record('rc_related', array('recordset' => $r['recordset'])); unset($old[$i]); $old_checkpoint->set('old', $old); } $old_checkpoint->done(); } Patch::set_message('Processing related'); $related_checkpoint = Patch::checkpoint('related'); if (!$related_checkpoint->is_done()) { while (1) { $related = $related_checkpoint->get('related', array()); if (empty($related)) { $related = Utils_RecordBrowserCommon::get_records('rc_mails_assoc', array(), array(), array(), 10); if (empty($related)) { break; } } foreach ($related as $i => $r) { $related_checkpoint->require_time(5); $mail = Utils_RecordBrowserCommon::get_record('rc_mails', $r['mail']); $mail['related'][] = $r['recordset'] . '/' . $r['record_id']; Utils_RecordBrowserCommon::update_record('rc_mails', $r['mail'], array('related' => $mail['related'])); Utils_RecordBrowserCommon::delete_record('rc_mails_assoc', $r['id']);