2010-09-09 03:14:17 +00:00
< ? php
2010-12-10 04:41:42 +00:00
/**
2023-01-01 14:36:24 +00:00
* @ copyright Copyright ( C ) 2010 - 2023 , the Friendica project
2020-02-09 15:34:23 +00:00
*
* @ license GNU AGPL version 3 or any later version
*
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation , either version 3 of the
* License , or ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU Affero General Public License for more details .
*
* You should have received a copy of the GNU Affero General Public License
* along with this program . If not , see < https :// www . gnu . org / licenses />.
*
2022-06-23 14:03:55 +00:00
* Automatic post - database structure change updates
2010-12-10 04:41:42 +00:00
*
2020-01-19 14:24:46 +00:00
* These functions are responsible for doing critical post update changes to the data ( not the structure ) in the database .
2014-06-03 22:44:58 +00:00
*
2019-06-23 17:56:21 +00:00
* Database structure changes are done in static / dbstructure . config . php
2010-12-10 04:41:42 +00:00
*
2020-01-19 14:24:46 +00:00
* For non - critical database migrations , please add a method in the Database\PostUpdate class
*
* If there is a need for a post update to a structure change , update this file
2017-12-22 21:31:32 +00:00
* by adding a new function at the end with the number of the new DB_UPDATE_VERSION .
2010-12-10 04:41:42 +00:00
*
2017-12-22 21:31:32 +00:00
* The numbered script in this file has to be exactly like the DB_UPDATE_VERSION
2010-12-10 04:41:42 +00:00
*
2017-12-22 14:48:29 +00:00
* Example :
* You are currently on version 4711 and you are preparing changes that demand an update script .
2010-12-10 04:41:42 +00:00
*
2017-12-22 21:31:32 +00:00
* 1. Create a function " update_4712() " here in the update . php
2019-06-23 17:56:21 +00:00
* 2. Apply the needed structural changes in static / dbStructure . php
* 3. Set DB_UPDATE_VERSION in static / dbstructure . config . php to 4712.
2018-07-20 19:47:16 +00:00
*
* If you need to run a script before the database update , name the function " pre_update_4712() "
2010-12-10 04:41:42 +00:00
*/
2022-06-23 14:03:55 +00:00
use Friendica\Core\Config\ValueObject\Cache ;
2020-02-09 15:34:23 +00:00
use Friendica\Core\Logger ;
2022-08-13 09:01:48 +00:00
use Friendica\Core\Protocol ;
2021-10-23 10:11:38 +00:00
use Friendica\Core\Storage\Capability\ICanReadFromStorage ;
2022-06-23 14:03:55 +00:00
use Friendica\Core\Storage\Type\Database as DatabaseStorage ;
2020-02-09 15:34:23 +00:00
use Friendica\Core\Update ;
use Friendica\Core\Worker ;
2020-11-19 19:34:48 +00:00
use Friendica\Database\Database ;
2020-02-09 15:34:23 +00:00
use Friendica\Database\DBA ;
2020-06-06 20:43:23 +00:00
use Friendica\Database\DBStructure ;
2020-02-09 15:34:23 +00:00
use Friendica\DI ;
use Friendica\Model\Contact ;
use Friendica\Model\Item ;
2021-05-22 13:37:04 +00:00
use Friendica\Model\ItemURI ;
2021-01-23 09:53:44 +00:00
use Friendica\Model\Notification ;
2020-08-21 18:37:58 +00:00
use Friendica\Model\Photo ;
2021-01-16 04:11:28 +00:00
use Friendica\Model\Post ;
2021-06-15 11:12:44 +00:00
use Friendica\Model\Profile ;
2022-02-09 06:52:16 +00:00
use Friendica\Model\User ;
2023-02-20 06:41:28 +00:00
use Friendica\Protocol\Activity ;
2022-12-30 21:20:28 +00:00
use Friendica\Protocol\Delivery ;
2021-10-21 21:18:08 +00:00
use Friendica\Security\PermissionSet\Repository\PermissionSet ;
2020-02-09 15:34:23 +00:00
2018-12-18 16:53:00 +00:00
// Post-update script of PR 5751
2018-12-24 10:15:32 +00:00
function update_1298 ()
2018-12-20 10:49:58 +00:00
{
2018-12-24 10:15:32 +00:00
$keys = [ 'gender' , 'marital' , 'sexual' ];
foreach ( $keys as $translateKey ) {
$allData = DBA :: select ( 'profile' , [ 'id' , $translateKey ]);
2020-01-18 19:55:41 +00:00
$allLangs = DI :: l10n () -> getAvailableLanguages ();
2018-12-24 10:15:32 +00:00
$success = 0 ;
$fail = 0 ;
foreach ( $allData as $key => $data ) {
$toTranslate = $data [ $translateKey ];
if ( $toTranslate != '' ) {
foreach ( $allLangs as $key => $lang ) {
$a = new \stdClass ();
$a -> strings = [];
2023-03-21 03:13:56 +00:00
// First we get the localizations
2022-07-13 04:50:40 +00:00
if ( file_exists ( 'view/lang/$lang/strings.php' )) {
include 'view/lang/$lang/strings.php' ;
2018-12-24 10:15:32 +00:00
}
2022-07-13 04:50:40 +00:00
if ( file_exists ( 'addon/morechoice/lang/$lang/strings.php' )) {
include 'addon/morechoice/lang/$lang/strings.php' ;
2018-12-24 10:15:32 +00:00
}
$localizedStrings = $a -> strings ;
unset ( $a );
$key = array_search ( $toTranslate , $localizedStrings );
if ( $key !== false ) {
break ;
}
// defaulting to empty string
$key = '' ;
2018-12-20 16:43:07 +00:00
}
2018-12-24 10:15:32 +00:00
if ( $key == '' ) {
$fail ++ ;
} else {
DBA :: update ( 'profile' , [ $translateKey => $key ], [ 'id' => $data [ 'id' ]]);
2018-12-30 20:42:56 +00:00
Logger :: notice ( 'Updated contact' , [ 'action' => 'update' , 'contact' => $data [ 'id' ], " $translateKey " => $key ,
'was' => $data [ $translateKey ]]);
2021-06-15 11:12:44 +00:00
2018-12-24 10:15:32 +00:00
Contact :: updateSelfFromUserID ( $data [ 'id' ]);
2021-06-15 11:12:44 +00:00
Profile :: publishUpdate ( $data [ 'id' ]);
2018-12-24 10:15:32 +00:00
$success ++ ;
2018-12-20 16:43:07 +00:00
}
2018-12-18 16:53:00 +00:00
}
}
2018-12-24 09:53:44 +00:00
2022-07-13 04:50:40 +00:00
Logger :: notice ( $translateKey . ' fix completed' , [ 'action' => 'update' , 'translateKey' => $translateKey , 'Success' => $success , 'Fail' => $fail ]);
2018-12-24 09:53:44 +00:00
}
return Update :: SUCCESS ;
}
2019-04-05 18:04:39 +00:00
function update_1309 ()
{
$queue = DBA :: select ( 'queue' , [ 'id' , 'cid' , 'guid' ]);
while ( $entry = DBA :: fetch ( $queue )) {
$contact = DBA :: selectFirst ( 'contact' , [ 'uid' ], [ 'id' => $entry [ 'cid' ]]);
if ( ! DBA :: isResult ( $contact )) {
continue ;
}
2021-01-16 04:11:28 +00:00
$item = Post :: selectFirst ([ 'id' , 'gravity' ], [ 'uid' => $contact [ 'uid' ], 'guid' => $entry [ 'guid' ]]);
2019-04-05 18:04:39 +00:00
if ( ! DBA :: isResult ( $item )) {
continue ;
}
2022-10-17 05:49:55 +00:00
$deliver_options = [ 'priority' => Worker :: PRIORITY_MEDIUM , 'dont_fork' => true ];
2019-06-10 14:19:24 +00:00
Worker :: add ( $deliver_options , 'Delivery' , Delivery :: POST , $item [ 'id' ], $entry [ 'cid' ]);
2020-02-16 11:32:18 +00:00
Logger :: info ( 'Added delivery worker' , [ 'item' => $item [ 'id' ], 'contact' => $entry [ 'cid' ]]);
2019-04-05 20:24:49 +00:00
DBA :: delete ( 'queue' , [ 'id' => $entry [ 'id' ]]);
2019-04-05 18:04:39 +00:00
}
return Update :: SUCCESS ;
}
2019-06-29 08:30:48 +00:00
function update_1315 ()
{
2020-08-22 05:22:08 +00:00
if ( DBStructure :: existsTable ( 'item-delivery-data' )) {
DBA :: delete ( 'item-delivery-data' , [ 'postopts' => '' , 'inform' => '' , 'queue_count' => 0 , 'queue_done' => 0 ]);
}
2019-07-09 07:23:36 +00:00
return Update :: SUCCESS ;
}
function update_1318 ()
{
2022-07-13 04:50:40 +00:00
DBA :: update ( 'profile' , [ 'marital' => 'In a relation' ], [ 'marital' => 'Unavailable' ]);
DBA :: update ( 'profile' , [ 'marital' => 'Single' ], [ 'marital' => 'Available' ]);
2019-07-09 07:23:36 +00:00
2022-10-17 05:49:55 +00:00
Worker :: add ( Worker :: PRIORITY_LOW , 'ProfileUpdate' );
2019-07-09 07:23:36 +00:00
return Update :: SUCCESS ;
2019-07-07 22:00:48 +00:00
}
2019-09-19 03:54:54 +00:00
function update_1323 ()
{
$users = DBA :: select ( 'user' , [ 'uid' ]);
while ( $user = DBA :: fetch ( $users )) {
2021-06-15 11:12:44 +00:00
if ( Contact :: updateSelfFromUserID ( $user [ 'uid' ])) {
Profile :: publishUpdate ( $user [ 'uid' ]);
}
2019-09-19 03:54:54 +00:00
}
DBA :: close ( $users );
return Update :: SUCCESS ;
}
2019-12-17 07:10:55 +00:00
function update_1327 ()
{
$contacts = DBA :: select ( 'contact' , [ 'uid' , 'id' , 'blocked' , 'readonly' ], [ " `uid` != ? AND (`blocked` OR `readonly`) AND NOT `pending` " , 0 ]);
while ( $contact = DBA :: fetch ( $contacts )) {
2020-08-04 04:47:02 +00:00
Contact\User :: setBlocked ( $contact [ 'id' ], $contact [ 'uid' ], $contact [ 'blocked' ]);
Contact\User :: setIgnored ( $contact [ 'id' ], $contact [ 'uid' ], $contact [ 'readonly' ]);
2019-12-17 07:10:55 +00:00
}
DBA :: close ( $contacts );
return Update :: SUCCESS ;
}
2020-01-06 20:14:01 +00:00
function update_1330 ()
2020-01-05 00:58:49 +00:00
{
2020-01-19 20:21:13 +00:00
$currStorage = DI :: config () -> get ( 'storage' , 'class' , '' );
2020-01-05 00:58:49 +00:00
2020-01-06 21:46:22 +00:00
// set the name of the storage instead of the classpath as config
2020-01-05 00:58:49 +00:00
if ( ! empty ( $currStorage )) {
2021-10-23 10:11:38 +00:00
/** @var ICanReadFromStorage $currStorage */
2020-01-19 20:21:53 +00:00
if ( ! DI :: config () -> set ( 'storage' , 'name' , $currStorage :: getName ())) {
2020-01-06 20:14:01 +00:00
return Update :: FAILED ;
2020-01-06 22:23:44 +00:00
}
// try to delete the class since it isn't needed. This won't work with config files
2020-01-19 20:22:33 +00:00
DI :: config () -> delete ( 'storage' , 'class' );
2020-01-05 00:58:49 +00:00
}
2020-01-06 21:46:22 +00:00
// Update attachments and photos
2021-10-11 14:21:10 +00:00
if ( ! DBA :: e ( " UPDATE `photo` SET `photo`.`backend-class` = SUBSTR(`photo`.`backend-class`, 25) WHERE `photo`.`backend-class` LIKE 'Friendica \\ \ Model \\ \ Storage \\ \ %' ESCAPE '|' " ) ||
! DBA :: e ( " UPDATE `attach` SET `attach`.`backend-class` = SUBSTR(`attach`.`backend-class`, 25) WHERE `attach`.`backend-class` LIKE 'Friendica \\ \ Model \\ \ Storage \\ \ %' ESCAPE '|' " )) {
2020-01-06 20:14:01 +00:00
return Update :: FAILED ;
};
2020-01-05 00:58:49 +00:00
return Update :: SUCCESS ;
}
2020-01-19 14:43:59 +00:00
function update_1332 ()
{
$condition = [ " `is-default` IS NOT NULL " ];
$profiles = DBA :: select ( 'profile' , [], $condition );
while ( $profile = DBA :: fetch ( $profiles )) {
2021-10-17 13:32:50 +00:00
Profile :: migrate ( $profile );
2020-01-19 14:43:59 +00:00
}
DBA :: close ( $profiles );
DBA :: update ( 'contact' , [ 'profile-id' => null ], [ '`profile-id` IS NOT NULL' ]);
return Update :: SUCCESS ;
}
2020-05-09 15:38:40 +00:00
function update_1347 ()
{
foreach ( Item :: ACTIVITIES as $index => $activity ) {
2020-11-19 19:34:48 +00:00
DBA :: insert ( 'verb' , [ 'id' => $index + 1 , 'name' => $activity ], Database :: INSERT_IGNORE );
2020-05-09 15:38:40 +00:00
}
return Update :: SUCCESS ;
}
2020-05-10 14:55:03 +00:00
function pre_update_1348 ()
{
2020-05-10 17:41:16 +00:00
if ( ! DBA :: exists ( 'contact' , [ 'id' => 0 ])) {
DBA :: insert ( 'contact' , [ 'nurl' => '' ]);
$lastid = DBA :: lastInsertId ();
if ( $lastid != 0 ) {
DBA :: update ( 'contact' , [ 'id' => 0 ], [ 'id' => $lastid ]);
}
2020-05-10 17:37:02 +00:00
}
2020-05-10 14:55:03 +00:00
// The tables "permissionset" and "tag" could or could not exist during the update.
// This depends upon the previous version. Depending upon this situation we have to add
// the "0" values before adding the foreign keys - or after would be sufficient.
update_1348 ();
2020-05-10 17:37:02 +00:00
2021-07-20 17:41:04 +00:00
if ( DBStructure :: existsTable ( 'auth_codes' ) && DBStructure :: existsTable ( 'clients' )) {
DBA :: e ( " DELETE FROM `auth_codes` WHERE NOT `client_id` IN (SELECT `client_id` FROM `clients`) " );
}
if ( DBStructure :: existsTable ( 'tokens' ) && DBStructure :: existsTable ( 'clients' )) {
DBA :: e ( " DELETE FROM `tokens` WHERE NOT `client_id` IN (SELECT `client_id` FROM `clients`) " );
}
2020-05-10 17:37:02 +00:00
return Update :: SUCCESS ;
2020-05-10 14:55:03 +00:00
}
function update_1348 ()
{
// Insert a permissionset with id=0
2020-05-10 17:48:34 +00:00
// Inserting it without an ID and then changing the value to 0 tricks the auto increment
2020-05-10 17:41:16 +00:00
if ( ! DBA :: exists ( 'permissionset' , [ 'id' => 0 ])) {
2021-07-11 09:39:34 +00:00
DBA :: insert ( 'permissionset' , [ 'allow_cid' => '' , 'allow_gid' => '' , 'deny_cid' => '' , 'deny_gid' => '' ]);
2020-05-10 17:41:16 +00:00
$lastid = DBA :: lastInsertId ();
if ( $lastid != 0 ) {
DBA :: update ( 'permissionset' , [ 'id' => 0 ], [ 'id' => $lastid ]);
}
2020-05-10 17:37:02 +00:00
}
2020-05-10 17:41:16 +00:00
if ( ! DBA :: exists ( 'tag' , [ 'id' => 0 ])) {
DBA :: insert ( 'tag' , [ 'name' => '' ]);
$lastid = DBA :: lastInsertId ();
if ( $lastid != 0 ) {
DBA :: update ( 'tag' , [ 'id' => 0 ], [ 'id' => $lastid ]);
}
2020-05-10 17:37:02 +00:00
}
2020-05-10 14:55:03 +00:00
return Update :: SUCCESS ;
}
2020-05-19 20:28:27 +00:00
function update_1349 ()
{
2021-01-30 22:03:53 +00:00
if ( ! DBStructure :: existsTable ( 'item-activity' )) {
return Update :: SUCCESS ;
}
2020-05-19 20:28:27 +00:00
$correct = true ;
foreach ( Item :: ACTIVITIES as $index => $activity ) {
if ( ! DBA :: exists ( 'verb' , [ 'id' => $index + 1 , 'name' => $activity ])) {
$correct = false ;
}
}
if ( ! $correct ) {
// The update failed - but it cannot be recovered, since the data doesn't match our expectation
// This means that we can't use this "shortcut" to fill the "vid" field and we have to rely upon
// the postupdate. This is not fatal, but means that it will take some longer time for the system
// to fill all data.
return Update :: SUCCESS ;
}
if ( ! DBA :: e ( " UPDATE `item` INNER JOIN `item-activity` ON `item`.`uri-id` = `item-activity`.`uri-id`
2022-09-12 21:12:11 +00:00
SET `vid` = `item-activity` . `activity` + 1 WHERE `gravity` = ? AND ( `vid` IS NULL OR `vid` = 0 ) " , Item::GRAVITY_ACTIVITY)) {
2020-05-19 20:28:27 +00:00
return Update :: FAILED ;
}
return Update :: SUCCESS ;
2020-05-28 21:44:55 +00:00
}
function update_1351 ()
{
2021-02-04 05:51:25 +00:00
if ( DBStructure :: existsTable ( 'thread' ) && ! DBA :: e ( " UPDATE `thread` INNER JOIN `item` ON `thread`.`iid` = `item`.`id` SET `thread`.`uri-id` = `item`.`uri-id` " )) {
2020-05-28 21:44:55 +00:00
return Update :: FAILED ;
}
return Update :: SUCCESS ;
}
2020-06-06 20:43:23 +00:00
function pre_update_1354 ()
{
2020-06-07 16:41:01 +00:00
if ( DBStructure :: existsColumn ( 'contact' , [ 'ffi_keyword_blacklist' ])
2020-07-16 10:23:56 +00:00
&& ! DBStructure :: existsColumn ( 'contact' , [ 'ffi_keyword_denylist' ])
2020-06-06 20:43:23 +00:00
&& ! DBA :: e ( " ALTER TABLE `contact` CHANGE `ffi_keyword_blacklist` `ffi_keyword_denylist` text null " )) {
return Update :: FAILED ;
}
2020-07-16 18:30:20 +00:00
return Update :: SUCCESS ;
}
function update_1354 ()
{
if ( DBStructure :: existsColumn ( 'contact' , [ 'ffi_keyword_blacklist' ])
&& DBStructure :: existsColumn ( 'contact' , [ 'ffi_keyword_denylist' ])) {
if ( ! DBA :: e ( " UPDATE `contact` SET `ffi_keyword_denylist` = `ffi_keyword_blacklist` " )) {
return Update :: FAILED ;
}
2020-06-06 20:43:23 +00:00
2020-07-16 18:30:20 +00:00
// When the data had been copied then the main task is done.
// Having the old field removed is only beauty but not crucial.
// So we don't care if this was successful or not.
DBA :: e ( " ALTER TABLE `contact` DROP `ffi_keyword_blacklist` " );
}
2020-06-06 20:43:23 +00:00
return Update :: SUCCESS ;
}
2020-07-19 10:03:33 +00:00
function update_1357 ()
{
if ( ! DBA :: e ( " UPDATE `contact` SET `failed` = true WHERE `success_update` < `failure_update` AND `failed` IS NULL " )) {
return Update :: FAILED ;
}
if ( ! DBA :: e ( " UPDATE `contact` SET `failed` = false WHERE `success_update` > `failure_update` AND `failed` IS NULL " )) {
return Update :: FAILED ;
}
if ( ! DBA :: e ( " UPDATE `contact` SET `failed` = false WHERE `updated` > `failure_update` AND `failed` IS NULL " )) {
return Update :: FAILED ;
}
if ( ! DBA :: e ( " UPDATE `contact` SET `failed` = false WHERE `last-item` > `failure_update` AND `failed` IS NULL " )) {
return Update :: FAILED ;
}
if ( ! DBA :: e ( " UPDATE `gserver` SET `failed` = true WHERE `last_contact` < `last_failure` AND `failed` IS NULL " )) {
return Update :: FAILED ;
}
if ( ! DBA :: e ( " UPDATE `gserver` SET `failed` = false WHERE `last_contact` > `last_failure` AND `failed` IS NULL " )) {
return Update :: FAILED ;
}
return Update :: SUCCESS ;
}
2020-08-14 19:21:49 +00:00
function pre_update_1358 ()
{
if ( ! DBA :: e ( " DELETE FROM `contact-relation` WHERE NOT `relation-cid` IN (SELECT `id` FROM `contact`) OR NOT `cid` IN (SELECT `id` FROM `contact`) " )) {
return Update :: FAILED ;
}
return Update :: SUCCESS ;
}
2020-08-21 18:37:58 +00:00
function pre_update_1363 ()
{
Photo :: delete ([ " `contact-id` != ? AND NOT `contact-id` IN (SELECT `id` FROM `contact`) " , 0 ]);
return Update :: SUCCESS ;
2020-08-24 20:06:06 +00:00
}
function pre_update_1364 ()
{
if ( ! DBA :: e ( " DELETE FROM `2fa_recovery_codes` WHERE NOT `uid` IN (SELECT `uid` FROM `user`) " )) {
return Update :: FAILED ;
}
if ( ! DBA :: e ( " DELETE FROM `2fa_app_specific_password` WHERE NOT `uid` IN (SELECT `uid` FROM `user`) " )) {
return Update :: FAILED ;
}
if ( ! DBA :: e ( " DELETE FROM `attach` WHERE NOT `uid` IN (SELECT `uid` FROM `user`) " )) {
return Update :: FAILED ;
}
2021-07-20 17:41:04 +00:00
if ( DBStructure :: existsTable ( 'clients' ) && ! DBA :: e ( " DELETE FROM `clients` WHERE NOT `uid` IN (SELECT `uid` FROM `user`) " )) {
2020-08-24 20:06:06 +00:00
return Update :: FAILED ;
}
if ( ! DBA :: e ( " DELETE FROM `conv` WHERE NOT `uid` IN (SELECT `uid` FROM `user`) " )) {
return Update :: FAILED ;
}
if ( ! DBA :: e ( " DELETE FROM `fsuggest` WHERE NOT `uid` IN (SELECT `uid` FROM `user`) " )) {
return Update :: FAILED ;
}
if ( ! DBA :: e ( " DELETE FROM `group` WHERE NOT `uid` IN (SELECT `uid` FROM `user`) " )) {
return Update :: FAILED ;
}
2020-08-24 21:03:00 +00:00
if ( ! DBA :: e ( " DELETE FROM `intro` WHERE NOT `uid` IN (SELECT `uid` FROM `user`) " )) {
return Update :: FAILED ;
}
2020-08-24 20:06:06 +00:00
if ( ! DBA :: e ( " DELETE FROM `manage` WHERE NOT `uid` IN (SELECT `uid` FROM `user`) " )) {
return Update :: FAILED ;
}
if ( ! DBA :: e ( " DELETE FROM `manage` WHERE NOT `mid` IN (SELECT `uid` FROM `user`) " )) {
return Update :: FAILED ;
}
if ( ! DBA :: e ( " DELETE FROM `mail` WHERE NOT `uid` IN (SELECT `uid` FROM `user`) " )) {
return Update :: FAILED ;
}
if ( ! DBA :: e ( " DELETE FROM `mailacct` WHERE NOT `uid` IN (SELECT `uid` FROM `user`) " )) {
return Update :: FAILED ;
}
if ( ! DBA :: e ( " DELETE FROM `notify` WHERE NOT `uid` IN (SELECT `uid` FROM `user`) " )) {
return Update :: FAILED ;
}
if ( ! DBA :: e ( " DELETE FROM `openwebauth-token` WHERE NOT `uid` IN (SELECT `uid` FROM `user`) " )) {
return Update :: FAILED ;
}
if ( ! DBA :: e ( " DELETE FROM `pconfig` WHERE NOT `uid` IN (SELECT `uid` FROM `user`) " )) {
return Update :: FAILED ;
}
if ( ! DBA :: e ( " DELETE FROM `profile` WHERE NOT `uid` IN (SELECT `uid` FROM `user`) " )) {
return Update :: FAILED ;
}
2021-07-22 07:11:26 +00:00
if ( DBStructure :: existsTable ( 'profile_check' ) && ! DBA :: e ( " DELETE FROM `profile_check` WHERE NOT `uid` IN (SELECT `uid` FROM `user`) " )) {
2020-08-24 20:06:06 +00:00
return Update :: FAILED ;
}
if ( ! DBA :: e ( " DELETE FROM `profile_field` WHERE NOT `uid` IN (SELECT `uid` FROM `user`) " )) {
return Update :: FAILED ;
}
if ( ! DBA :: e ( " DELETE FROM `push_subscriber` WHERE NOT `uid` IN (SELECT `uid` FROM `user`) " )) {
return Update :: FAILED ;
}
if ( ! DBA :: e ( " DELETE FROM `register` WHERE NOT `uid` IN (SELECT `uid` FROM `user`) " )) {
return Update :: FAILED ;
}
if ( ! DBA :: e ( " DELETE FROM `search` WHERE NOT `uid` IN (SELECT `uid` FROM `user`) " )) {
return Update :: FAILED ;
}
2021-07-20 17:41:04 +00:00
if ( DBStructure :: existsTable ( 'tokens' ) && ! DBA :: e ( " DELETE FROM `tokens` WHERE NOT `uid` IN (SELECT `uid` FROM `user`) " )) {
2020-08-24 20:06:06 +00:00
return Update :: FAILED ;
}
if ( ! DBA :: e ( " DELETE FROM `user-contact` WHERE NOT `uid` IN (SELECT `uid` FROM `user`) " )) {
return Update :: FAILED ;
}
2021-01-31 18:32:22 +00:00
if ( DBStructure :: existsTable ( 'user-item' ) && ! DBA :: e ( " DELETE FROM `user-item` WHERE NOT `uid` IN (SELECT `uid` FROM `user`) " )) {
2020-08-24 20:06:06 +00:00
return Update :: FAILED ;
}
if ( ! DBA :: e ( " DELETE FROM `notify-threads` WHERE NOT `receiver-uid` IN (SELECT `uid` FROM `user`) " )) {
return Update :: FAILED ;
}
if ( ! DBA :: e ( " DELETE FROM `event` WHERE NOT `cid` IN (SELECT `id` FROM `contact`) " )) {
return Update :: FAILED ;
}
if ( ! DBA :: e ( " DELETE FROM `fsuggest` WHERE NOT `cid` IN (SELECT `id` FROM `contact`) " )) {
return Update :: FAILED ;
}
if ( ! DBA :: e ( " DELETE FROM `group_member` WHERE NOT `contact-id` IN (SELECT `id` FROM `contact`) " )) {
return Update :: FAILED ;
}
if ( ! DBA :: e ( " DELETE FROM `intro` WHERE NOT `contact-id` IN (SELECT `id` FROM `contact`) " )) {
return Update :: FAILED ;
}
2021-07-22 07:11:26 +00:00
if ( DBStructure :: existsTable ( 'profile_check' ) && ! DBA :: e ( " DELETE FROM `profile_check` WHERE NOT `cid` IN (SELECT `id` FROM `contact`) " )) {
2020-08-24 20:06:06 +00:00
return Update :: FAILED ;
}
if ( ! DBA :: e ( " DELETE FROM `user-contact` WHERE NOT `cid` IN (SELECT `id` FROM `contact`) " )) {
return Update :: FAILED ;
}
if ( ! DBA :: e ( " DELETE FROM `group_member` WHERE NOT `gid` IN (SELECT `id` FROM `group`) " )) {
return Update :: FAILED ;
}
if ( ! DBA :: e ( " DELETE FROM `gserver-tag` WHERE NOT `gserver-id` IN (SELECT `id` FROM `gserver`) " )) {
return Update :: FAILED ;
}
2021-01-31 18:32:22 +00:00
if ( DBStructure :: existsTable ( 'user-item' ) && ! DBA :: e ( " DELETE FROM `user-item` WHERE NOT `iid` IN (SELECT `id` FROM `item`) " )) {
2020-08-24 20:06:06 +00:00
return Update :: FAILED ;
}
return Update :: SUCCESS ;
}
2020-08-26 05:32:47 +00:00
function pre_update_1365 ()
{
if ( ! DBA :: e ( " DELETE FROM `notify-threads` WHERE NOT `notify-id` IN (SELECT `id` FROM `notify`) " )) {
return Update :: FAILED ;
}
2021-02-04 05:51:25 +00:00
if ( DBStructure :: existsTable ( 'thread' ) && ! DBA :: e ( " DELETE FROM `thread` WHERE NOT `iid` IN (SELECT `id` FROM `item`) " )) {
2020-08-26 05:32:47 +00:00
return Update :: FAILED ;
}
2020-11-14 14:50:24 +00:00
return Update :: SUCCESS ;
2020-08-26 07:01:01 +00:00
}
2020-11-13 10:05:52 +00:00
function update_1375 ()
{
if ( ! DBA :: e ( " UPDATE `item` SET `thr-parent` = `parent-uri`, `thr-parent-id` = `parent-uri-id` WHERE `thr-parent` = '' " )) {
return Update :: FAILED ;
}
return Update :: SUCCESS ;
}
2020-11-17 22:33:44 +00:00
function pre_update_1376 ()
{
// Insert a user with uid=0
DBStructure :: checkInitialValues ();
if ( ! DBA :: e ( " DELETE FROM `item` WHERE NOT `uid` IN (SELECT `uid` FROM `user`) " )) {
return Update :: FAILED ;
}
if ( ! DBA :: e ( " DELETE FROM `event` WHERE NOT `uid` IN (SELECT `uid` FROM `user`) " )) {
return Update :: FAILED ;
}
2021-02-04 05:51:25 +00:00
if ( DBStructure :: existsTable ( 'thread' ) && ! DBA :: e ( " DELETE FROM `thread` WHERE NOT `uid` IN (SELECT `uid` FROM `user`) " )) {
2020-11-17 22:33:44 +00:00
return Update :: FAILED ;
}
if ( ! DBA :: e ( " DELETE FROM `permissionset` WHERE NOT `uid` IN (SELECT `uid` FROM `user`) " )) {
return Update :: FAILED ;
}
if ( ! DBA :: e ( " DELETE FROM `openwebauth-token` WHERE NOT `uid` IN (SELECT `uid` FROM `user`) " )) {
return Update :: FAILED ;
}
if ( ! DBA :: e ( " DELETE FROM `post-category` WHERE NOT `uid` IN (SELECT `uid` FROM `user`) " )) {
return Update :: FAILED ;
}
2020-11-19 06:26:30 +00:00
Photo :: delete ([ " NOT `uid` IN (SELECT `uid` FROM `user`) " ]);
2020-11-17 22:33:44 +00:00
if ( ! DBA :: e ( " DELETE FROM `contact` WHERE NOT `uid` IN (SELECT `uid` FROM `user`) " )) {
return Update :: FAILED ;
}
2020-11-19 06:26:30 +00:00
return Update :: SUCCESS ;
}
function pre_update_1377 ()
{
DBStructure :: checkInitialValues ();
if ( ! DBA :: e ( " DELETE FROM `item` WHERE NOT `author-id` IN (SELECT `id` FROM `contact`) " )) {
return Update :: FAILED ;
}
if ( ! DBA :: e ( " DELETE FROM `item` WHERE NOT `owner-id` IN (SELECT `id` FROM `contact`) " )) {
return Update :: FAILED ;
}
if ( ! DBA :: e ( " UPDATE `item` SET `contact-id` = `owner-id` WHERE NOT `contact-id` IN (SELECT `id` FROM `contact`) " )) {
return Update :: FAILED ;
}
2021-02-04 05:51:25 +00:00
if ( DBStructure :: existsTable ( 'thread' ) && ! DBA :: e ( " DELETE FROM `thread` WHERE NOT `author-id` IN (SELECT `id` FROM `contact`) " )) {
2020-11-19 06:26:30 +00:00
return Update :: FAILED ;
}
2021-02-04 05:51:25 +00:00
if ( DBStructure :: existsTable ( 'thread' ) && ! DBA :: e ( " DELETE FROM `thread` WHERE NOT `owner-id` IN (SELECT `id` FROM `contact`) " )) {
2020-11-19 06:26:30 +00:00
return Update :: FAILED ;
}
2021-02-04 05:51:25 +00:00
if ( DBStructure :: existsTable ( 'thread' ) && ! DBA :: e ( " UPDATE `thread` SET `contact-id` = `owner-id` WHERE NOT `contact-id` IN (SELECT `id` FROM `contact`) " )) {
2020-11-19 06:26:30 +00:00
return Update :: FAILED ;
}
if ( ! DBA :: e ( " UPDATE `notify` SET `uri-id` = NULL WHERE `uri-id` = 0 " )) {
return Update :: FAILED ;
}
2021-01-07 18:13:40 +00:00
if ( DBStructure :: existsTable ( 'diaspora-interaction' ) && ! DBA :: e ( " DELETE FROM `diaspora-interaction` WHERE `uri-id` NOT IN (SELECT `id` FROM `item-uri`) " )) {
2021-01-07 17:34:23 +00:00
return Update :: FAILED ;
}
2021-01-07 18:24:26 +00:00
if ( DBStructure :: existsTable ( 'item-activity' ) && ! DBA :: e ( " DELETE FROM `item-activity` WHERE `uri-id` NOT IN (SELECT `id` FROM `item-uri`) " )) {
return Update :: FAILED ;
}
if ( DBStructure :: existsTable ( 'item-content' ) && ! DBA :: e ( " DELETE FROM `item-content` WHERE `uri-id` NOT IN (SELECT `id` FROM `item-uri`) " )) {
return Update :: FAILED ;
}
2020-11-19 06:26:30 +00:00
if ( ! DBA :: e ( " DELETE FROM `notify` WHERE `uri-id` NOT IN (SELECT `id` FROM `item-uri`) " )) {
return Update :: FAILED ;
}
if ( ! DBA :: e ( " UPDATE `notify` SET `parent-uri-id` = NULL WHERE `parent-uri-id` = 0 " )) {
return Update :: FAILED ;
}
if ( ! DBA :: e ( " DELETE FROM `notify` WHERE `parent-uri-id` NOT IN (SELECT `id` FROM `item-uri`) " )) {
return Update :: FAILED ;
}
if ( ! DBA :: e ( " UPDATE `notify-threads` SET `master-parent-uri-id` = NULL WHERE `master-parent-uri-id` = 0 " )) {
return Update :: FAILED ;
}
if ( ! DBA :: e ( " DELETE FROM `notify-threads` WHERE `master-parent-uri-id` NOT IN (SELECT `id` FROM `item-uri`) " )) {
return Update :: FAILED ;
}
if ( ! DBA :: e ( " DELETE FROM `notify-threads` WHERE `master-parent-item` NOT IN (SELECT `id` FROM `item`) " )) {
return Update :: FAILED ;
}
2020-11-17 22:33:44 +00:00
return Update :: SUCCESS ;
}
2020-11-25 19:56:39 +00:00
function update_1380 ()
{
if ( ! DBA :: e ( " UPDATE `notify` INNER JOIN `item` ON `item`.`id` = `notify`.`iid` SET `notify`.`uri-id` = `item`.`uri-id` WHERE `notify`.`uri-id` IS NULL AND `notify`.`otype` IN (?, ?) " ,
2021-01-23 09:53:44 +00:00
Notification\ObjectType :: ITEM , Notification\ObjectType :: PERSON )) {
2020-11-25 19:56:39 +00:00
return Update :: FAILED ;
}
if ( ! DBA :: e ( " UPDATE `notify` INNER JOIN `item` ON `item`.`id` = `notify`.`parent` SET `notify`.`parent-uri-id` = `item`.`uri-id` WHERE `notify`.`parent-uri-id` IS NULL AND `notify`.`otype` IN (?, ?) " ,
2021-01-23 09:53:44 +00:00
Notification\ObjectType :: ITEM , Notification\ObjectType :: PERSON )) {
2020-11-25 19:56:39 +00:00
return Update :: FAILED ;
}
return Update :: SUCCESS ;
}
2021-01-28 22:45:54 +00:00
function pre_update_1395 ()
{
2021-04-28 20:43:51 +00:00
if ( DBStructure :: existsTable ( 'post-user' ) && ! DBStructure :: existsColumn ( 'post-user' , [ 'id' ]) && ! DBA :: e ( " DROP TABLE `post-user` " )) {
2021-01-28 22:45:54 +00:00
return Update :: FAILED ;
}
return Update :: SUCCESS ;
}
function update_1395 ()
{
if ( ! DBA :: e ( " INSERT INTO `post-user`(`id`, `uri-id`, `uid`, `contact-id`, `unseen`, `origin`, `psid`)
SELECT `id` , `uri-id` , `uid` , `contact-id` , `unseen` , `origin` , `psid` FROM `item`
ON DUPLICATE KEY UPDATE `contact-id` = `item` . `contact-id` , `unseen` = `item` . `unseen` , `origin` = `item` . `origin` , `psid` = `item` . `psid` " )) {
return Update :: FAILED ;
}
2021-01-31 18:32:22 +00:00
if ( DBStructure :: existsTable ( 'user-item' ) && ! DBA :: e ( " INSERT INTO `post-user`(`uri-id`, `uid`, `hidden`, `notification-type`)
2021-01-28 22:45:54 +00:00
SELECT `uri-id` , `user-item` . `uid` , `hidden` , `notification-type` FROM `user-item`
INNER JOIN `item` ON `item` . `id` = `user-item` . `iid`
ON DUPLICATE KEY UPDATE `hidden` = `user-item` . `hidden` , `notification-type` = `user-item` . `notification-type` " )) {
return Update :: FAILED ;
}
return Update :: SUCCESS ;
}
2021-01-30 22:03:53 +00:00
function update_1396 ()
{
if ( ! DBStructure :: existsTable ( 'item-content' )) {
return Update :: SUCCESS ;
}
2021-07-20 06:11:12 +00:00
if ( DBStructure :: existsColumn ( 'item-content' , [ 'raw-body' ])) {
if ( ! DBA :: e ( " INSERT IGNORE INTO `post-content`(`uri-id`, `title`, `content-warning`, `body`, `raw-body`,
`location` , `coord` , `language` , `app` , `rendered-hash` , `rendered-html` ,
`object-type` , `object` , `target-type` , `target` , `resource-id` , `plink` )
SELECT `item-content` . `uri-id` , `item-content` . `title` , `item-content` . `content-warning` ,
`item-content` . `body` , `item-content` . `raw-body` , `item-content` . `location` , `item-content` . `coord` ,
`item-content` . `language` , `item-content` . `app` , `item-content` . `rendered-hash` ,
`item-content` . `rendered-html` , `item-content` . `object-type` , `item-content` . `object` ,
`item-content` . `target-type` , `item-content` . `target` , `item` . `resource-id` , `item-content` . `plink`
FROM `item-content` INNER JOIN `item` ON `item` . `uri-id` = `item-content` . `uri-id` " )) {
return Update :: FAILED ;
}
} else {
if ( ! DBA :: e ( " INSERT IGNORE INTO `post-content`(`uri-id`, `title`, `content-warning`, `body`,
`location` , `coord` , `language` , `app` , `rendered-hash` , `rendered-html` ,
`object-type` , `object` , `target-type` , `target` , `resource-id` , `plink` )
SELECT `item-content` . `uri-id` , `item-content` . `title` , `item-content` . `content-warning` ,
`item-content` . `body` , `item-content` . `location` , `item-content` . `coord` ,
`item-content` . `language` , `item-content` . `app` , `item-content` . `rendered-hash` ,
`item-content` . `rendered-html` , `item-content` . `object-type` , `item-content` . `object` ,
`item-content` . `target-type` , `item-content` . `target` , `item` . `resource-id` , `item-content` . `plink`
FROM `item-content` INNER JOIN `item` ON `item` . `uri-id` = `item-content` . `uri-id` " )) {
return Update :: FAILED ;
}
2021-01-30 22:03:53 +00:00
}
return Update :: SUCCESS ;
2021-01-31 18:32:22 +00:00
}
2021-01-31 23:37:34 +00:00
function update_1397 ()
2021-01-31 18:32:22 +00:00
{
2021-02-02 06:05:50 +00:00
if ( ! DBA :: e ( " INSERT INTO `post-user-notification`(`uri-id`, `uid`, `notification-type`)
SELECT `uri-id` , `uid` , `notification-type` FROM `post-user` WHERE `notification-type` != 0
ON DUPLICATE KEY UPDATE `uri-id` = `post-user` . `uri-id` , `uid` = `post-user` . `uid` , `notification-type` = `post-user` . `notification-type` " )) {
return Update :: FAILED ;
2021-01-31 18:32:22 +00:00
}
2021-02-02 06:05:50 +00:00
if ( ! DBStructure :: existsTable ( 'user-item' )) {
return Update :: SUCCESS ;
2021-01-31 18:32:22 +00:00
}
2021-02-01 20:11:25 +00:00
if ( ! DBA :: e ( " INSERT INTO `post-user-notification`(`uri-id`, `uid`, `notification-type`)
SELECT `uri-id` , `user-item` . `uid` , `notification-type` FROM `user-item`
INNER JOIN `item` ON `item` . `id` = `user-item` . `iid` WHERE `notification-type` != 0
ON DUPLICATE KEY UPDATE `notification-type` = `user-item` . `notification-type` " )) {
return Update :: FAILED ;
}
2021-02-02 06:05:50 +00:00
if ( ! DBStructure :: existsTable ( 'thread' )) {
return Update :: SUCCESS ;
}
if ( ! DBA :: e ( " INSERT IGNORE INTO `post-thread-user`(`uri-id`, `uid`, `pinned`, `starred`, `ignored`, `wall`, `pubmail`, `forum_mode`)
SELECT `thread` . `uri-id` , `thread` . `uid` , `user-item` . `pinned` , `thread` . `starred` ,
`thread` . `ignored` , `thread` . `wall` , `thread` . `pubmail` , `thread` . `forum_mode`
FROM `thread` LEFT JOIN `user-item` ON `user-item` . `iid` = `thread` . `iid` " )) {
2021-02-01 20:11:25 +00:00
return Update :: FAILED ;
}
2021-01-31 18:32:22 +00:00
return Update :: SUCCESS ;
}
2021-02-04 05:51:25 +00:00
function update_1398 ()
{
if ( ! DBStructure :: existsTable ( 'thread' )) {
return Update :: SUCCESS ;
}
if ( ! DBA :: e ( " INSERT IGNORE INTO `post-thread` (`uri-id`, `owner-id`, `author-id`, `network`, `created`, `received`, `changed`, `commented`)
SELECT `uri-id` , `owner-id` , `author-id` , `network` , `created` , `received` , `changed` , `commented` FROM `thread` " )) {
return Update :: FAILED ;
}
if ( ! DBStructure :: existsTable ( 'thread' )) {
return Update :: SUCCESS ;
}
if ( ! DBA :: e ( " UPDATE `post-thread-user` INNER JOIN `thread` ON `thread`.`uid` = `post-thread-user`.`uid` AND `thread`.`uri-id` = `post-thread-user`.`uri-id`
SET `post-thread-user` . `mention` = `thread` . `mention` " )) {
return Update :: FAILED ;
}
return Update :: SUCCESS ;
2021-02-09 16:35:01 +00:00
}
function update_1399 ()
{
if ( ! DBA :: e ( " UPDATE `post-thread-user` INNER JOIN `post-user` ON `post-user`.`uid` = `post-thread-user`.`uid` AND `post-user`.`uri-id` = `post-thread-user`.`uri-id`
2021-07-11 09:39:34 +00:00
SET `post-thread-user` . `contact-id` = `post-user` . `contact-id` , `post-thread-user` . `unseen` = `post-user` . `unseen` ,
`post-thread-user` . `hidden` = `post-user` . `hidden` , `post-thread-user` . `origin` = `post-user` . `origin` ,
2021-02-09 16:35:01 +00:00
`post-thread-user` . `psid` = `post-user` . `psid` , `post-thread-user` . `post-user-id` = `post-user` . `id` " )) {
return Update :: FAILED ;
}
2021-02-04 05:51:25 +00:00
2021-02-13 19:56:03 +00:00
return Update :: SUCCESS ;
}
function update_1400 ()
{
if ( ! DBA :: e ( " INSERT IGNORE INTO `post` (`uri-id`, `parent-uri-id`, `thr-parent-id`, `owner-id`, `author-id`, `network`,
2021-02-14 20:27:31 +00:00
`created` , `received` , `edited` , `gravity` , `causer-id` , `post-type` , `vid` , `private` , `visible` , `deleted` , `global` )
2021-07-11 09:39:34 +00:00
SELECT `uri-id` , `parent-uri-id` , `thr-parent-id` , `owner-id` , `author-id` , `network` , `created` , `received` , `edited` ,
2021-02-14 20:27:31 +00:00
`gravity` , `causer-id` , `post-type` , `vid` , `private` , `visible` , `deleted` , `global` FROM `item` " )) {
2021-02-13 19:56:03 +00:00
return Update :: FAILED ;
}
if ( ! DBA :: e ( " UPDATE `post-user` INNER JOIN `item` ON `item`.`uri-id` = `post-user`.`uri-id` AND `item`.`uid` = `post-user`.`uid`
INNER JOIN `event` ON `item` . `event-id` = `event` . `id` AND `event` . `id` != 0
SET `post-user` . `event-id` = `item` . `event-id` " )) {
return Update :: FAILED ;
}
if ( ! DBA :: e ( " UPDATE `post-user` INNER JOIN `item` ON `item`.`uri-id` = `post-user`.`uri-id` AND `item`.`uid` = `post-user`.`uid`
SET `post-user` . `wall` = `item` . `wall` , `post-user` . `parent-uri-id` = `item` . `parent-uri-id` ,
`post-user` . `thr-parent-id` = `item` . `thr-parent-id` ,
`post-user` . `created` = `item` . `created` , `post-user` . `edited` = `item` . `edited` ,
`post-user` . `received` = `item` . `received` , `post-user` . `gravity` = `item` . `gravity` ,
`post-user` . `network` = `item` . `network` , `post-user` . `owner-id` = `item` . `owner-id` ,
`post-user` . `author-id` = `item` . `author-id` , `post-user` . `causer-id` = `item` . `causer-id` ,
`post-user` . `post-type` = `item` . `post-type` , `post-user` . `vid` = `item` . `vid` ,
`post-user` . `private` = `item` . `private` , `post-user` . `global` = `item` . `global` ,
`post-user` . `visible` = `item` . `visible` , `post-user` . `deleted` = `item` . `deleted` " )) {
return Update :: FAILED ;
}
2021-02-15 15:12:49 +00:00
if ( ! DBA :: e ( " INSERT IGNORE INTO `post-thread-user` (`uri-id`, `owner-id`, `author-id`, `causer-id`, `network`,
`created` , `received` , `changed` , `commented` , `uid` , `wall` , `contact-id` , `unseen` , `hidden` , `origin` , `psid` , `post-user-id` )
SELECT `uri-id` , `owner-id` , `author-id` , `causer-id` , `network` , `created` , `received` , `received` , `received` ,
`uid` , `wall` , `contact-id` , `unseen` , `hidden` , `origin` , `psid` , `id`
FROM `post-user` WHERE `gravity` = 0 AND NOT EXISTS ( SELECT `uri-id` FROM `post-thread-user` WHERE `post-user-id` = `post-user` . id ) " )) {
return Update :: FAILED ;
}
2021-02-13 19:56:03 +00:00
if ( ! DBA :: e ( " UPDATE `post-thread-user` INNER JOIN `post-thread` ON `post-thread-user`.`uri-id` = `post-thread`.`uri-id`
SET `post-thread-user` . `owner-id` = `post-thread` . `owner-id` , `post-thread-user` . `author-id` = `post-thread` . `author-id` ,
`post-thread-user` . `causer-id` = `post-thread` . `causer-id` , `post-thread-user` . `network` = `post-thread` . `network` ,
`post-thread-user` . `created` = `post-thread` . `created` , `post-thread-user` . `received` = `post-thread` . `received` ,
`post-thread-user` . `changed` = `post-thread` . `changed` , `post-thread-user` . `commented` = `post-thread` . `commented` " )) {
return Update :: FAILED ;
}
2021-02-09 16:35:01 +00:00
return Update :: SUCCESS ;
2021-02-05 13:40:15 +00:00
}
2021-02-19 06:30:38 +00:00
2021-02-16 15:10:53 +00:00
function pre_update_1403 ()
{
// Necessary before a primary key change
2021-07-20 06:11:12 +00:00
if ( DBStructure :: existsTable ( 'parsed_url' ) && ! DBA :: e ( " DROP TABLE `parsed_url` " )) {
2021-02-16 15:10:53 +00:00
return Update :: FAILED ;
}
return Update :: SUCCESS ;
}
2021-02-19 06:59:45 +00:00
function update_1404 ()
2021-02-19 06:30:38 +00:00
{
$tasks = DBA :: select ( 'workerqueue' , [ 'id' , 'command' , 'parameter' ], [ 'command' => [ 'notifier' , 'delivery' , 'apdelivery' , 'done' => false ]]);
while ( $task = DBA :: fetch ( $tasks )) {
$parameters = json_decode ( $task [ 'parameter' ], true );
2021-07-11 09:39:34 +00:00
2021-05-31 05:12:50 +00:00
if ( is_array ( $parameters ) && count ( $parameters ) && in_array ( $parameters [ 0 ], [ Delivery :: MAIL , Delivery :: SUGGESTION , Delivery :: REMOVAL , Delivery :: RELOCATION ])) {
2021-02-19 06:30:38 +00:00
continue ;
}
2021-07-11 09:39:34 +00:00
2021-02-19 06:30:38 +00:00
switch ( strtolower ( $task [ 'command' ])) {
case 'notifier' :
if ( count ( $parameters ) == 3 ) {
continue 2 ;
}
$item = DBA :: selectFirst ( 'item' , [ 'uid' , 'uri-id' ], [ 'id' => $parameters [ 1 ]]);
if ( ! DBA :: isResult ( $item )) {
continue 2 ;
}
2021-07-11 09:39:34 +00:00
2021-02-19 06:30:38 +00:00
$parameters [ 1 ] = $item [ 'uri-id' ];
$parameters [ 2 ] = $item [ 'uid' ];
break ;
case 'delivery' :
if ( count ( $parameters ) == 4 ) {
continue 2 ;
}
$item = DBA :: selectFirst ( 'item' , [ 'uid' , 'uri-id' ], [ 'id' => $parameters [ 1 ]]);
if ( ! DBA :: isResult ( $item )) {
continue 2 ;
}
2021-07-11 09:39:34 +00:00
2021-02-19 06:30:38 +00:00
$parameters [ 1 ] = $item [ 'uri-id' ];
$parameters [ 3 ] = $item [ 'uid' ];
break ;
case 'apdelivery' :
if ( count ( $parameters ) == 6 ) {
continue 2 ;
}
2021-07-11 09:39:34 +00:00
2021-02-19 06:30:38 +00:00
if ( empty ( $parameters [ 4 ])) {
$parameters [ 4 ] = [];
}
2021-07-11 09:39:34 +00:00
2021-02-19 06:30:38 +00:00
$item = DBA :: selectFirst ( 'item' , [ 'uri-id' ], [ 'id' => $parameters [ 1 ]]);
if ( ! DBA :: isResult ( $item )) {
continue 2 ;
}
2021-07-11 09:39:34 +00:00
2021-02-19 06:30:38 +00:00
$parameters [ 5 ] = $item [ 'uri-id' ];
break ;
default :
continue 2 ;
}
DBA :: update ( 'workerqueue' , [ 'parameter' => json_encode ( $parameters )], [ 'id' => $task [ 'id' ]]);
2021-04-07 06:02:06 +00:00
return Update :: SUCCESS ;
2021-02-19 06:30:38 +00:00
}
}
2021-03-01 22:19:47 +00:00
function update_1407 ()
{
if ( ! DBA :: e ( " UPDATE `post` SET `causer-id` = NULL WHERE `causer-id` = 0 " )) {
return Update :: FAILED ;
}
if ( ! DBA :: e ( " UPDATE `post-user` SET `causer-id` = NULL WHERE `causer-id` = 0 " )) {
return Update :: FAILED ;
}
if ( ! DBA :: e ( " UPDATE `post-thread` SET `causer-id` = NULL WHERE `causer-id` = 0 " )) {
return Update :: FAILED ;
}
if ( ! DBA :: e ( " UPDATE `post-thread-user` SET `causer-id` = NULL WHERE `causer-id` = 0 " )) {
return Update :: FAILED ;
}
2021-04-07 06:02:06 +00:00
return Update :: SUCCESS ;
}
function update_1413 ()
{
if ( ! DBA :: e ( " UPDATE `post-user` SET `post-reason` = `post-type` WHERE `post-type` >= 64 and `post-type` <= 75 " )) {
return Update :: FAILED ;
}
2021-03-01 22:19:47 +00:00
}
2021-05-22 13:37:04 +00:00
function update_1419 ()
{
$mails = DBA :: select ( 'mail' , [ 'id' , 'from-url' , 'uri' , 'parent-uri' , 'guid' ], [], [ 'order' => [ 'id' ]]);
while ( $mail = DBA :: fetch ( $mails )) {
$fields = [];
$fields [ 'author-id' ] = Contact :: getIdForURL ( $mail [ 'from-url' ], 0 , false );
if ( empty ( $fields [ 'author-id' ])) {
continue ;
}
$fields [ 'uri-id' ] = ItemURI :: insert ([ 'uri' => $mail [ 'uri' ], 'guid' => $mail [ 'guid' ]]);
$fields [ 'parent-uri-id' ] = ItemURI :: getIdByURI ( $mail [ 'parent-uri' ]);
$reply = DBA :: selectFirst ( 'mail' , [ 'uri' , 'uri-id' , 'guid' ], [ 'parent-uri' => $mail [ 'parent-uri' ], 'reply' => false ]);
if ( ! empty ( $reply )) {
$fields [ 'thr-parent' ] = $reply [ 'uri' ];
if ( ! empty ( $reply [ 'uri-id' ])) {
$fields [ 'thr-parent-id' ] = $reply [ 'uri-id' ];
} else {
$fields [ 'thr-parent-id' ] = ItemURI :: insert ([ 'uri' => $reply [ 'uri' ], 'guid' => $reply [ 'guid' ]]);
}
}
DBA :: update ( 'mail' , $fields , [ 'id' => $mail [ 'id' ]]);
}
return Update :: SUCCESS ;
}
2021-07-11 09:39:34 +00:00
function update_1429 ()
{
if ( ! DBA :: e ( " UPDATE `contact` SET `uri-id` = null WHERE NOT `uri-id` IS NULL " )) {
return Update :: FAILED ;
}
2022-11-11 01:42:47 +00:00
if ( DBStructure :: existsTable ( 'fcontact' ) && ! DBA :: e ( " UPDATE `fcontact` SET `uri-id` = null WHERE NOT `uri-id` IS NULL " )) {
2021-07-11 09:39:34 +00:00
return Update :: FAILED ;
}
if ( ! DBA :: e ( " UPDATE `apcontact` SET `uri-id` = null WHERE NOT `uri-id` IS NULL " )) {
return Update :: FAILED ;
}
2022-12-29 19:18:13 +00:00
DI :: keyValue () -> set ( 'post_update_version' , 1423 );
2021-07-11 09:39:34 +00:00
return Update :: SUCCESS ;
2021-07-11 09:51:04 +00:00
}
2021-08-10 20:53:20 +00:00
2021-08-15 17:54:22 +00:00
function update_1434 ()
2021-08-10 20:53:20 +00:00
{
$name = DI :: config () -> get ( 'storage' , 'name' );
2022-06-23 14:03:55 +00:00
// In case of an empty config, set "Database" as default storage backend
2021-08-10 20:53:20 +00:00
if ( empty ( $name )) {
2022-06-23 14:03:55 +00:00
DI :: config () -> set ( 'storage' , 'name' , DatabaseStorage :: getName ());
2021-08-10 20:53:20 +00:00
}
// In case of a Using deprecated storage class value, set the right name for it
if ( stristr ( $name , 'Friendica\Model\Storage\\' )) {
DI :: config () -> set ( 'storage' , 'name' , substr ( $name , 24 ));
}
return Update :: SUCCESS ;
}
2021-09-11 07:59:46 +00:00
2021-10-11 14:21:10 +00:00
function update_1438 ()
{
DBA :: update ( 'photo' , [ 'photo-type' => Photo :: USER_AVATAR ], [ 'profile' => true ]);
DBA :: update ( 'photo' , [ 'photo-type' => Photo :: CONTACT_AVATAR ], [ " NOT `profile` AND NOT `contact-id` IS NULL AND `contact-id` != ? " , 0 ]);
DBA :: update ( 'photo' , [ 'photo-type' => Photo :: DEFAULT ], [ " NOT `profile` AND (`contact-id` IS NULL OR `contact-id` = ?) AND `photo-type` IS NULL AND `album` != ? " , 0 , Photo :: CONTACT_PHOTOS ]);
}
2021-10-17 20:19:02 +00:00
function update_1439 ()
{
2022-11-11 01:42:47 +00:00
if ( ! DBStructure :: existsTable ( 'fcontact' )) {
return Update :: SUCCESS ;
}
2021-10-17 20:19:02 +00:00
$intros = DBA :: select ( 'intro' , [ 'id' , 'fid' ], [ " NOT `fid` IS NULL AND `fid` != ? " , 0 ]);
while ( $intro = DBA :: fetch ( $intros )) {
$fcontact = DBA :: selectFirst ( 'fcontact' , [ 'url' ], [ 'id' => $intro [ 'fid' ]]);
if ( ! empty ( $fcontact [ 'url' ])) {
$id = Contact :: getIdForURL ( $fcontact [ 'url' ]);
if ( ! empty ( $id )) {
DBA :: update ( 'intro' ,[ 'suggest-cid' => $id ], [ 'id' => $intro [ 'id' ]]);
}
}
}
DBA :: close ( $intros );
2022-11-11 01:42:47 +00:00
return Update :: SUCCESS ;
2021-10-17 20:19:02 +00:00
}
2021-10-18 21:31:33 +00:00
function update_1440 ()
{
// Fix wrong public permissionset
DBA :: p ( " UPDATE `profile_field` SET `psid` = ? WHERE psid IN (SELECT `id` FROM `permissionset` WHERE `id` != ? AND `allow_cid` = '' AND `allow_gid` = '' AND `deny_cid` = '' AND `deny_gid` = '') " , PermissionSet :: PUBLIC , PermissionSet :: PUBLIC );
DBA :: delete ( 'permissionset' , [ " `id` != ? AND `allow_cid` = '' AND `allow_gid` = '' AND `deny_cid` = '' AND `deny_gid` = '' " , PermissionSet :: PUBLIC ]);
return Update :: SUCCESS ;
}
2021-10-19 19:15:28 +00:00
2021-10-19 19:30:09 +00:00
function update_1441 ()
2021-10-19 19:15:28 +00:00
{
$languages = DI :: l10n () -> getAvailableLanguages ();
$albums = [ Photo :: PROFILE_PHOTOS ];
foreach ( $languages as $language ) {
$albums [] = DI :: l10n () -> withLang ( $language ) -> t ( Photo :: PROFILE_PHOTOS );
}
$albums = array_unique ( $albums );
Photo :: update ([ 'photo-type' => Photo :: USER_AVATAR ], [ 'album' => $albums ]);
return Update :: SUCCESS ;
}
2021-10-19 19:30:09 +00:00
function update_1442 ()
{
// transform blocked intros into ignored intros
DBA :: update ( 'intro' , [ 'ignore' => 1 , 'blocked' => 0 ], [ 'blocked' => 1 ]);
return Update :: SUCCESS ;
}
2021-11-10 12:30:02 +00:00
/**
* A bug in Contact\User :: updateByContactUpdate prevented any update to the user - contact table since the rows have been
* created in version 1435. This version fixes this bug but the user - contact rows are outdated , we need to regenerate
* them .
*/
function update_1444 ()
{
DBA :: e ( 'TRUNCATE TABLE `user-contact`' );
$contacts = DBA :: select ( 'contact' , [], [ " `uid` != ? " , 0 ]);
while ( $contact = DBA :: fetch ( $contacts )) {
Contact\User :: insertForContactArray ( $contact );
}
return Update :: SUCCESS ;
}
2021-12-14 09:14:24 +00:00
function update_1446 ()
{
$distributed_cache_driver_source = DI :: config () -> getCache () -> getSource ( 'system' , 'distributed_cache_driver' );
$cache_driver_source = DI :: config () -> getCache () -> getSource ( 'system' , 'cache_driver' );
// In case the distributed cache driver is the default value, but the current cache driver isn't default,
// we assume that the distributed cache driver should be the same as the current cache driver
2022-06-23 14:03:55 +00:00
if ( $distributed_cache_driver_source === Cache :: SOURCE_STATIC && $cache_driver_source > Cache :: SOURCE_STATIC ) {
2021-12-14 11:36:44 +00:00
DI :: config () -> set ( 'system' , 'distributed_cache_driver' , DI :: config () -> get ( 'system' , 'cache_driver' ));
2021-12-14 09:14:24 +00:00
}
return Update :: SUCCESS ;
2021-12-14 09:17:38 +00:00
}
2022-02-09 06:52:16 +00:00
function update_1451 ()
{
DBA :: update ( 'user' , [ 'account-type' => User :: ACCOUNT_TYPE_COMMUNITY ], [ 'page-flags' => [ User :: PAGE_FLAGS_COMMUNITY , User :: PAGE_FLAGS_PRVGROUP ]]);
DBA :: update ( 'contact' , [ 'contact-type' => Contact :: TYPE_COMMUNITY ], [ " `forum` OR `prv` " ]);
2022-02-09 07:02:06 +00:00
DBA :: update ( 'contact' , [ 'manually-approve' => true ], [ 'prv' => true ]);
2022-02-09 06:52:16 +00:00
return Update :: SUCCESS ;
}
2022-04-07 21:52:25 +00:00
function update_1457 ()
{
2022-08-15 13:23:01 +00:00
$pinned = DBA :: select ( 'post-thread-user' , [ 'uri-id' , 'author-id' ], [ 'pinned' => true ]);
2022-04-07 21:52:25 +00:00
while ( $post = DBA :: fetch ( $pinned )) {
2022-08-15 13:23:01 +00:00
Post\Collection :: add ( $post [ 'uri-id' ], Post\Collection :: FEATURED , $post [ 'author-id' ]);
2022-04-07 21:52:25 +00:00
}
DBA :: close ( $pinned );
return Update :: SUCCESS ;
}
2022-08-13 09:01:48 +00:00
function update_1480 ()
{
DBA :: update ( 'contact' , [ 'next-update' => DBA :: NULL_DATETIME ], [ 'network' => Protocol :: FEDERATED ]);
2022-08-13 12:24:25 +00:00
DBA :: update ( 'post' , [ 'deleted' => false ], [ " `uri-id` IN (SELECT `uri-id` FROM `post-user` WHERE NOT `deleted`) " ]);
2022-08-13 10:14:16 +00:00
return Update :: SUCCESS ;
2022-08-13 09:01:48 +00:00
}
2022-08-15 13:23:01 +00:00
function update_1481 ()
{
DBA :: e ( " UPDATE `post-collection` INNER JOIN `post` ON `post`.`uri-id` = `post-collection`.`uri-id` SET `post-collection`.`author-id` = `post`.`author-id` WHERE `post-collection`.`author-id` IS null " );
return Update :: SUCCESS ;
}
2022-11-23 21:47:47 +00:00
function update_1491 ()
{
DBA :: update ( 'contact' , [ 'remote_self' => Contact :: MIRROR_OWN_POST ], [ 'remote_self' => Contact :: MIRROR_FORWARDED ]);
return Update :: SUCCESS ;
2022-12-04 07:17:26 +00:00
}
function update_1497 ()
{
DBA :: e ( " UPDATE `user` SET `last-activity` = DATE(`login_date`) WHERE `last-activity` IS NULL " );
return Update :: SUCCESS ;
2022-12-17 07:07:46 +00:00
}
function update_1502 ()
{
DBA :: e ( " UPDATE `pconfig` SET `cat` = 'calendar' WHERE `k` = 'first_day_of_week' " );
return Update :: SUCCESS ;
}
2022-12-29 19:18:13 +00:00
function update_1505 ()
{
2023-01-01 21:09:40 +00:00
if ( ! DBStructure :: existsTable ( 'config' )) {
return Update :: SUCCESS ;
}
2022-12-29 19:30:19 +00:00
$conditions = [
2022-12-29 19:51:04 +00:00
" ((`cat` = ?) AND ((`k` LIKE ?) OR (`k` = ?) OR (`k` LIKE ?) OR (`k` = ?))) OR " .
2022-12-29 20:43:52 +00:00
" ((`cat` != ?) AND (`k` LIKE ?)) OR " .
" ((`cat` = ?) AND (`k` LIKE ?)) " ,
2022-12-29 19:34:19 +00:00
" system " ,
2022-12-29 19:30:19 +00:00
" post_update_% " ,
" worker_last_cleaned " ,
2022-12-29 19:34:19 +00:00
" last% " ,
" worker_daemon_mode " ,
2022-12-29 19:51:04 +00:00
" system " ,
" last_% " ,
2022-12-29 20:43:52 +00:00
" database " ,
" update_% " ,
2022-12-29 19:30:19 +00:00
];
2022-12-29 19:51:04 +00:00
$postUpdateEntries = DBA :: selectToArray ( 'config' , [ 'cat' , 'k' , 'v' ], $conditions );
2022-12-29 19:18:13 +00:00
foreach ( $postUpdateEntries as $postUpdateEntry ) {
2022-12-29 19:51:04 +00:00
if ( $postUpdateEntry [ 'cat' ] === 'system' ) {
DI :: keyValue () -> set ( $postUpdateEntry [ 'k' ], $postUpdateEntry [ 'v' ]);
} else {
DI :: keyValue () -> set ( sprintf ( '%s_%s' , $postUpdateEntry [ 'cat' ], $postUpdateEntry [ 'k' ]), $postUpdateEntry [ 'v' ]);
}
2022-12-29 19:18:13 +00:00
}
2022-12-29 19:30:19 +00:00
return DBA :: delete ( 'config' , $conditions ) ? Update :: SUCCESS : Update :: FAILED ;
2022-12-29 19:18:13 +00:00
}
2023-01-01 20:10:37 +00:00
function update_1508 ()
{
$config = DBA :: selectToArray ( 'config' );
2023-01-03 16:24:05 +00:00
$newConfig = DI :: config () -> beginTransaction ();
2023-01-03 13:18:53 +00:00
2023-01-01 20:10:37 +00:00
foreach ( $config as $entry ) {
2023-01-03 13:18:53 +00:00
$newConfig -> set ( $entry [ 'cat' ], $entry [ 'k' ], $entry [ 'v' ]);
2023-01-01 20:10:37 +00:00
}
2023-01-03 16:24:05 +00:00
$newConfig -> commit ();
2023-01-01 20:10:37 +00:00
2023-01-05 01:40:38 +00:00
return Update :: SUCCESS ;
2023-01-03 18:54:05 +00:00
}
function update_1509 ()
{
$addons = DBA :: selectToArray ( 'addon' );
$newConfig = DI :: config () -> beginTransaction ();
foreach ( $addons as $addon ) {
$newConfig -> set ( 'addons' , $addon [ 'name' ], [
'last_update' => $addon [ 'timestamp' ],
'admin' => ( bool ) $addon [ 'plugin_admin' ],
]);
}
$newConfig -> commit ();
2023-01-05 01:40:38 +00:00
return Update :: SUCCESS ;
2023-01-01 20:10:37 +00:00
}
2023-01-08 18:59:07 +00:00
function update_1510 ()
{
$blocks = DBA :: select ( 'pconfig' , [ 'uid' , 'v' ], [ 'cat' => 'blockem' , 'k' => 'words' ]);
while ( $block = DBA :: fetch ( $blocks )) {
foreach ( explode ( ',' , $block [ 'v' ]) as $account ) {
$id = Contact :: getIdForURL ( trim ( $account ), 0 , false );
if ( empty ( $id )) {
continue ;
}
Contact\User :: setCollapsed ( $id , $block [ 'uid' ], true );
}
}
return Update :: SUCCESS ;
}
2023-01-18 05:04:37 +00:00
function update_1512 ()
{
DI :: keyValue () -> set ( 'nodeinfo_total_users' , DI :: config () -> get ( 'nodeinfo' , 'total_users' ));
DI :: keyValue () -> set ( 'nodeinfo_active_users_halfyear' , DI :: config () -> get ( 'nodeinfo' , 'active_users_halfyear' ));
DI :: keyValue () -> set ( 'nodeinfo_active_users_monthly' , DI :: config () -> get ( 'nodeinfo' , 'active_users_monthly' ));
DI :: keyValue () -> set ( 'nodeinfo_active_users_weekly' , DI :: config () -> get ( 'nodeinfo' , 'active_users_weekly' ));
DI :: keyValue () -> set ( 'nodeinfo_local_posts' , DI :: config () -> get ( 'nodeinfo' , 'local_posts' ));
DI :: keyValue () -> set ( 'nodeinfo_local_comments' , DI :: config () -> get ( 'nodeinfo' , 'local_comments' ));
DI :: config () -> delete ( 'nodeinfo' , 'total_users' );
DI :: config () -> delete ( 'nodeinfo' , 'active_users_halfyear' );
DI :: config () -> delete ( 'nodeinfo' , 'active_users_monthly' );
DI :: config () -> delete ( 'nodeinfo' , 'active_users_weekly' );
DI :: config () -> delete ( 'nodeinfo' , 'local_posts' );
DI :: config () -> delete ( 'nodeinfo' , 'local_comments' );
}
2023-01-22 13:40:08 +00:00
function update_1513 ()
{
DI :: keyValue () -> set ( 'git_friendica_version' , DI :: config () -> get ( 'system' , 'git_friendica_version' ));
DI :: keyValue () -> set ( 'twitter_application_name' , DI :: config () -> get ( 'twitter' , 'application_name' ));
DI :: config () -> delete ( 'system' , 'git_friendica_version' );
DI :: config () -> delete ( 'twitter' , 'application_name' );
}
2023-02-04 23:15:01 +00:00
function update_1514 ()
{
if ( file_exists ( dirname ( __FILE__ ) . '/config/node.config.php' )) {
$transactionalConfig = DI :: config () -> beginTransaction ();
$oldConfig = include dirname ( __FILE__ ) . '/config/node.config.php' ;
if ( is_array ( $oldConfig )) {
$categories = array_keys ( $oldConfig );
foreach ( $categories as $category ) {
if ( is_array ( $oldConfig [ $category ])) {
$keys = array_keys ( $oldConfig [ $category ]);
foreach ( $keys as $key ) {
$transactionalConfig -> set ( $category , $key , $oldConfig [ $category ][ $key ]);
}
}
}
}
$transactionalConfig -> commit ();
// Rename the node.config.php so it won't get used, but it isn't deleted.
2023-02-12 12:38:02 +00:00
if ( rename ( dirname ( __FILE__ ) . '/config/node.config.php' , dirname ( __FILE__ ) . '/config/node.config.php.bak' )) {
return Update :: SUCCESS ;
} else {
return Update :: FAILED ;
}
2023-02-04 23:15:01 +00:00
}
return Update :: SUCCESS ;
}
2023-02-20 06:41:28 +00:00
function update_1515 ()
{
2023-02-20 08:54:27 +00:00
DBA :: update ( 'verb' , [ 'name' => Activity :: READ ], [ 'name' => 'https://www.w3.org/ns/activitystreams#read' ]);
2023-02-20 06:41:28 +00:00
DBA :: update ( 'verb' , [ 'name' => Activity :: VIEW ], [ 'name' => 'https://joinpeertube.org/view' ]);
return Update :: SUCCESS ;
}
2023-02-19 11:57:39 +00:00
function update_1516 ()
{
// Fixes https://github.com/friendica/friendica/issues/12803
// de-serialize multiple serialized values
$configTrans = DI :: config () -> beginTransaction ();
$configArray = DI :: config () -> getCache () -> getDataBySource ( Cache :: SOURCE_DATA );
foreach ( $configArray as $category => $keyValues ) {
if ( is_array ( $keyValues )) {
foreach ( $keyValues as $key => $value ) {
$configTrans -> set ( $category , $key , $value );
}
}
}
$configTrans -> commit ();
return Update :: SUCCESS ;
}
2023-03-28 06:34:09 +00:00
function update_1518 ()
{
$users = DBA :: select ( 'user' , [ 'uid' ]);
while ( $user = DBA :: fetch ( $users )) {
Contact :: updateSelfFromUserID ( $user [ 'uid' ]);
}
DBA :: close ( $users );
return Update :: SUCCESS ;
}
2023-05-27 22:19:41 +00:00
function update_1520 () : int
{
DBA :: update ( 'user' , [ 'parent-uid' => null ], [ 'parent-uid' => 0 ]);
return Update :: SUCCESS ;
}
2023-07-26 05:27:55 +00:00
/**
* user - contact . remote_self was wrongly declared as boolean , possibly truncating integer values from contact . remote_self
*
* @ return int
* @ throws Exception
*/
function update_1524 () : int
{
$contacts = DBA :: select ( 'contact' , [ 'uid' , 'uri-id' , 'remote_self' ], [ " `uid` != ? " , 0 ]);
while ( $contact = DBA :: fetch ( $contacts )) {
Contact\User :: insertForContactArray ( $contact );
}
return Update :: SUCCESS ;
}