2010-09-08 23:14:17 -04:00
< ? php
2010-12-09 23:41:42 -05:00
/**
2020-02-09 10:34:23 -05:00
* @ copyright Copyright ( C ) 2020 , Friendica
*
* @ 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 />.
*
* Automatic post - databse structure change updates
2010-12-09 23:41:42 -05:00
*
2020-01-19 09:24:46 -05:00
* These functions are responsible for doing critical post update changes to the data ( not the structure ) in the database .
2014-06-03 18:44:58 -04:00
*
2019-06-23 13:56:21 -04:00
* Database structure changes are done in static / dbstructure . config . php
2010-12-09 23:41:42 -05:00
*
2020-01-19 09:24:46 -05: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 16:31:32 -05:00
* by adding a new function at the end with the number of the new DB_UPDATE_VERSION .
2010-12-09 23:41:42 -05:00
*
2017-12-22 16:31:32 -05:00
* The numbered script in this file has to be exactly like the DB_UPDATE_VERSION
2010-12-09 23:41:42 -05:00
*
2017-12-22 09:48:29 -05:00
* Example :
* You are currently on version 4711 and you are preparing changes that demand an update script .
2010-12-09 23:41:42 -05:00
*
2017-12-22 16:31:32 -05:00
* 1. Create a function " update_4712() " here in the update . php
2019-06-23 13:56:21 -04: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 15:47:16 -04:00
*
* If you need to run a script before the database update , name the function " pre_update_4712() "
2010-12-09 23:41:42 -05:00
*/
2020-02-09 10:34:23 -05:00
use Friendica\Core\Addon ;
use Friendica\Core\Logger ;
use Friendica\Core\Update ;
use Friendica\Core\Worker ;
use Friendica\Database\DBA ;
2020-06-06 16:43:23 -04:00
use Friendica\Database\DBStructure ;
2020-02-09 10:34:23 -05:00
use Friendica\DI ;
use Friendica\Model\Contact ;
use Friendica\Model\Item ;
2020-08-21 14:37:58 -04:00
use Friendica\Model\Photo ;
2020-02-09 10:34:23 -05:00
use Friendica\Model\User ;
use Friendica\Model\Storage ;
use Friendica\Util\DateTimeFormat ;
use Friendica\Worker\Delivery ;
2018-12-21 04:36:01 -05:00
function update_1179 ()
{
2020-01-19 15:21:13 -05:00
if ( DI :: config () -> get ( 'system' , 'no_community_page' )) {
2020-01-19 15:21:53 -05:00
DI :: config () -> set ( 'system' , 'community_page_style' , CP_NO_COMMUNITY_PAGE );
2018-12-21 04:36:01 -05:00
}
2015-02-08 14:35:40 -05:00
2015-02-08 10:03:23 -05:00
// Update the central item storage with uid=0
2017-11-05 07:15:53 -05:00
Worker :: add ( PRIORITY_LOW , " threadupdate " );
2015-02-08 10:03:23 -05:00
2018-10-14 07:19:37 -04:00
return Update :: SUCCESS ;
2015-02-08 10:03:23 -05:00
}
2015-03-07 15:24:39 -05:00
2018-12-21 04:36:01 -05:00
function update_1181 ()
{
2015-03-07 15:24:39 -05:00
// Fill the new fields in the term table.
2020-05-15 02:50:20 -04:00
// deactivated, the "term" table is deprecated
// Worker::add(PRIORITY_LOW, "TagUpdate");
2015-03-07 15:24:39 -05:00
2018-10-14 07:19:37 -04:00
return Update :: SUCCESS ;
2015-03-07 15:24:39 -05:00
}
2015-10-17 09:26:11 -04:00
2018-12-21 04:36:01 -05:00
function update_1189 ()
{
2015-10-17 09:26:11 -04:00
2020-01-19 15:21:13 -05:00
if ( strlen ( DI :: config () -> get ( 'system' , 'directory_submit_url' )) &&
! strlen ( DI :: config () -> get ( 'system' , 'directory' ))) {
2020-01-19 15:21:53 -05:00
DI :: config () -> set ( 'system' , 'directory' , dirname ( DI :: config () -> get ( 'system' , 'directory_submit_url' )));
2020-01-19 15:22:33 -05:00
DI :: config () -> delete ( 'system' , 'directory_submit_url' );
2015-10-17 09:26:11 -04:00
}
2018-10-14 07:19:37 -04:00
return Update :: SUCCESS ;
2015-10-17 09:26:11 -04:00
}
2015-11-11 17:39:14 -05:00
2018-12-21 04:36:01 -05:00
function update_1191 ()
{
2020-01-19 15:21:53 -05:00
DI :: config () -> set ( 'system' , 'maintenance' , 1 );
2015-11-11 17:39:14 -05:00
2018-01-17 13:42:40 -05:00
if ( Addon :: isEnabled ( 'forumlist' )) {
2020-03-10 16:00:44 -04:00
Addon :: uninstall ( 'forumlist' );
2015-11-11 17:39:14 -05:00
}
2015-11-12 10:42:27 -05:00
// select old formlist addon entries
2018-12-21 05:49:38 -05:00
$r = q ( " SELECT `uid`, `cat`, `k`, `v` FROM `pconfig` WHERE `cat` = '%s' " ,
2018-07-21 09:10:13 -04:00
DBA :: escape ( 'forumlist' )
2015-11-11 17:40:26 -05:00
);
2015-11-11 17:39:14 -05:00
2015-11-12 10:42:27 -05:00
// convert old forumlist addon entries in new config entries
2018-07-21 08:46:04 -04:00
if ( DBA :: isResult ( $r )) {
2015-11-12 10:42:27 -05:00
foreach ( $r as $rr ) {
$uid = $rr [ 'uid' ];
$family = $rr [ 'cat' ];
$key = $rr [ 'k' ];
$value = $rr [ 'v' ];
2015-11-11 17:39:14 -05:00
2018-12-21 04:36:01 -05:00
if ( $key === 'randomise' ) {
2020-01-18 10:56:46 -05:00
DI :: pConfig () -> delete ( $uid , $family , $key );
2018-12-21 04:36:01 -05:00
}
2015-11-11 17:39:14 -05:00
2015-11-12 10:42:27 -05:00
if ( $key === 'show_on_profile' ) {
2018-12-21 04:36:01 -05:00
if ( $value ) {
2020-02-16 06:32:18 -05:00
DI :: pConfig () -> set ( $uid , 'feature' , 'forumlist_profile' , $value );
2018-12-21 04:36:01 -05:00
}
2015-11-11 17:39:14 -05:00
2020-01-18 10:56:46 -05:00
DI :: pConfig () -> delete ( $uid , $family , $key );
2015-11-12 10:42:27 -05:00
}
2015-11-11 17:39:14 -05:00
2015-11-12 10:42:27 -05:00
if ( $key === 'show_on_network' ) {
2018-12-21 04:36:01 -05:00
if ( $value ) {
2020-02-16 06:32:18 -05:00
DI :: pConfig () -> set ( $uid , 'feature' , 'forumlist_widget' , $value );
2018-12-21 04:36:01 -05:00
}
2015-11-11 17:39:14 -05:00
2020-01-18 10:56:46 -05:00
DI :: pConfig () -> delete ( $uid , $family , $key );
2015-11-12 10:42:27 -05:00
}
2015-11-11 17:39:14 -05:00
}
}
2015-11-12 10:42:27 -05:00
2020-01-19 15:21:53 -05:00
DI :: config () -> set ( 'system' , 'maintenance' , 0 );
2015-11-12 10:42:27 -05:00
2018-10-14 07:19:37 -04:00
return Update :: SUCCESS ;
2015-11-11 17:39:14 -05:00
}
2016-09-26 15:35:01 -04:00
2018-12-21 04:36:01 -05:00
function update_1203 ()
{
2018-12-21 05:49:38 -05:00
$r = q ( " UPDATE `user` SET `account-type` = %d WHERE `page-flags` IN (%d, %d) " ,
2019-01-06 23:49:13 -05:00
DBA :: escape ( User :: ACCOUNT_TYPE_COMMUNITY ),
2019-01-06 12:37:48 -05:00
DBA :: escape ( User :: PAGE_FLAGS_COMMUNITY ),
DBA :: escape ( User :: PAGE_FLAGS_PRVGROUP )
2018-12-21 04:36:01 -05:00
);
2016-10-09 03:01:19 -04:00
}
2018-01-20 22:37:13 -05:00
2018-12-21 04:36:01 -05:00
function update_1244 ()
{
2018-01-20 22:37:13 -05:00
// Sets legacy_password for all legacy hashes
2018-07-20 08:19:26 -04:00
DBA :: update ( 'user' , [ 'legacy_password' => true ], [ 'SUBSTR(password, 1, 4) != "$2y$"' ]);
2018-01-20 22:37:13 -05:00
// All legacy hashes are re-hashed using the new secure hashing function
2018-07-20 08:19:26 -04:00
$stmt = DBA :: select ( 'user' , [ 'uid' , 'password' ], [ 'legacy_password' => true ]);
2018-12-21 04:36:01 -05:00
while ( $user = DBA :: fetch ( $stmt )) {
2018-07-20 08:19:26 -04:00
DBA :: update ( 'user' , [ 'password' => User :: hashPassword ( $user [ 'password' ])], [ 'uid' => $user [ 'uid' ]]);
2018-01-20 22:37:13 -05:00
}
// Logged in users are forcibly logged out
2018-07-20 08:19:26 -04:00
DBA :: delete ( 'session' , [ '1 = 1' ]);
2018-01-20 22:37:13 -05:00
2018-10-14 07:19:37 -04:00
return Update :: SUCCESS ;
2018-01-20 22:37:13 -05:00
}
2018-01-22 17:58:03 -05:00
2018-12-21 04:36:01 -05:00
function update_1245 ()
{
2020-01-19 15:21:13 -05:00
$rino = DI :: config () -> get ( 'system' , 'rino_encrypt' );
2018-01-22 17:58:03 -05:00
if ( ! $rino ) {
2018-10-14 07:19:37 -04:00
return Update :: SUCCESS ;
2018-01-22 17:58:03 -05:00
}
2020-01-19 15:21:53 -05:00
DI :: config () -> set ( 'system' , 'rino_encrypt' , 1 );
2018-01-22 17:58:03 -05:00
2018-10-14 07:19:37 -04:00
return Update :: SUCCESS ;
2018-01-22 17:58:03 -05:00
}
2018-01-23 18:57:51 -05:00
2018-12-21 04:36:01 -05:00
function update_1247 ()
{
2018-01-23 18:57:51 -05:00
// Removing hooks with the old name
2018-07-20 08:19:26 -04:00
DBA :: e ( " DELETE FROM `hook`
2018-01-23 18:57:51 -05:00
WHERE `hook` LIKE 'plugin_%' " );
// Make sure we install the new renamed ones
Addon :: reload ();
}
2018-05-08 13:50:06 -04:00
2018-12-21 04:36:01 -05:00
function update_1260 ()
{
2020-01-19 15:21:53 -05:00
DI :: config () -> set ( 'system' , 'maintenance' , 1 );
DI :: config () -> set (
2018-12-21 04:42:24 -05:00
'system' ,
'maintenance_reason' ,
2020-01-18 14:52:34 -05:00
DI :: l10n () -> t (
2018-12-21 04:42:24 -05:00
'%s: Updating author-id and owner-id in item and thread table. ' ,
DateTimeFormat :: utcNow () . ' ' . date ( 'e' )
)
);
2018-05-08 13:50:06 -04:00
2018-07-20 08:19:26 -04:00
$items = DBA :: p ( " SELECT `id`, `owner-link`, `owner-name`, `owner-avatar`, `network` FROM `item`
2018-05-08 13:50:06 -04:00
WHERE `owner-id` = 0 AND `owner-link` != '' " );
2018-07-20 08:19:26 -04:00
while ( $item = DBA :: fetch ( $items )) {
2018-05-08 13:50:06 -04:00
$contact = [ 'url' => $item [ 'owner-link' ], 'name' => $item [ 'owner-name' ],
2018-05-09 03:09:47 -04:00
'photo' => $item [ 'owner-avatar' ], 'network' => $item [ 'network' ]];
2020-07-15 17:08:42 -04:00
$cid = Contact :: getIdForURL ( $item [ 'owner-link' ], 0 , null , $contact );
2018-05-08 13:50:06 -04:00
if ( empty ( $cid )) {
continue ;
}
Item :: update ([ 'owner-id' => $cid ], [ 'id' => $item [ 'id' ]]);
}
2018-07-20 08:19:26 -04:00
DBA :: close ( $items );
2018-05-08 13:50:06 -04:00
2018-07-20 08:19:26 -04:00
DBA :: e ( " UPDATE `thread` INNER JOIN `item` ON `thread`.`iid` = `item`.`id`
2018-05-08 13:50:06 -04:00
SET `thread` . `owner-id` = `item` . `owner-id` WHERE `thread` . `owner-id` = 0 " );
2018-07-20 08:19:26 -04:00
$items = DBA :: p ( " SELECT `id`, `author-link`, `author-name`, `author-avatar`, `network` FROM `item`
2018-05-08 13:50:06 -04:00
WHERE `author-id` = 0 AND `author-link` != '' " );
2018-07-20 08:19:26 -04:00
while ( $item = DBA :: fetch ( $items )) {
2018-05-08 13:50:06 -04:00
$contact = [ 'url' => $item [ 'author-link' ], 'name' => $item [ 'author-name' ],
2018-05-09 03:09:47 -04:00
'photo' => $item [ 'author-avatar' ], 'network' => $item [ 'network' ]];
2020-07-15 17:08:42 -04:00
$cid = Contact :: getIdForURL ( $item [ 'author-link' ], 0 , null , $contact );
2018-05-08 13:50:06 -04:00
if ( empty ( $cid )) {
continue ;
}
Item :: update ([ 'author-id' => $cid ], [ 'id' => $item [ 'id' ]]);
}
2018-07-20 08:19:26 -04:00
DBA :: close ( $items );
2018-05-08 13:50:06 -04:00
2018-07-20 08:19:26 -04:00
DBA :: e ( " UPDATE `thread` INNER JOIN `item` ON `thread`.`iid` = `item`.`id`
2018-05-08 13:50:06 -04:00
SET `thread` . `author-id` = `item` . `author-id` WHERE `thread` . `author-id` = 0 " );
2020-01-19 15:21:53 -05:00
DI :: config () -> set ( 'system' , 'maintenance' , 0 );
2018-10-14 07:19:37 -04:00
return Update :: SUCCESS ;
2018-05-08 13:50:06 -04:00
}
2018-05-10 06:41:32 -04:00
2018-12-21 04:36:01 -05:00
function update_1261 ()
{
2018-05-10 06:41:32 -04:00
// This fixes the results of an issue in the develop branch of 2018-05.
2018-12-21 05:30:13 -05:00
DBA :: update ( 'contact' , [ 'blocked' => false , 'pending' => false ], [ 'uid' => 0 , 'blocked' => true , 'pending' => true ]);
2018-10-14 07:19:37 -04:00
return Update :: SUCCESS ;
2018-05-10 06:41:32 -04:00
}
2018-07-19 09:52:05 -04:00
2018-12-21 04:36:01 -05:00
function update_1278 ()
{
2020-01-19 15:21:53 -05:00
DI :: config () -> set ( 'system' , 'maintenance' , 1 );
DI :: config () -> set (
2018-12-21 04:42:24 -05:00
'system' ,
'maintenance_reason' ,
2020-01-18 14:52:34 -05:00
DI :: l10n () -> t (
2018-12-21 04:42:24 -05:00
'%s: Updating post-type.' ,
DateTimeFormat :: utcNow () . ' ' . date ( 'e' )
)
);
2018-07-19 09:52:05 -04:00
Item :: update ([ 'post-type' => Item :: PT_PAGE ], [ 'bookmark' => true ]);
Item :: update ([ 'post-type' => Item :: PT_PERSONAL_NOTE ], [ 'type' => 'note' ]);
2020-01-19 15:21:53 -05:00
DI :: config () -> set ( 'system' , 'maintenance' , 0 );
2018-07-19 09:52:05 -04:00
2018-10-14 07:19:37 -04:00
return Update :: SUCCESS ;
2018-07-19 09:52:05 -04:00
}
2018-10-17 14:34:24 -04:00
2018-12-21 04:36:01 -05:00
function update_1288 ()
{
2018-10-17 14:34:24 -04:00
// Updates missing `uri-id` values
2018-12-21 05:30:13 -05:00
DBA :: e ( " UPDATE `item-activity` INNER JOIN `item` ON `item`.`iaid` = `item-activity`.`id` SET `item-activity`.`uri-id` = `item`.`uri-id` WHERE `item-activity`.`uri-id` IS NULL OR `item-activity`.`uri-id` = 0 " );
DBA :: e ( " UPDATE `item-content` INNER JOIN `item` ON `item`.`icid` = `item-content`.`id` SET `item-content`.`uri-id` = `item`.`uri-id` WHERE `item-content`.`uri-id` IS NULL OR `item-content`.`uri-id` = 0 " );
2018-10-17 14:34:24 -04:00
2018-10-29 05:16:07 -04:00
return Update :: SUCCESS ;
2018-10-17 14:34:24 -04:00
}
2018-12-18 11:53:00 -05:00
// Post-update script of PR 5751
2018-12-24 05:15:32 -05:00
function update_1298 ()
2018-12-20 05:49:58 -05:00
{
2018-12-24 05:15:32 -05:00
$keys = [ 'gender' , 'marital' , 'sexual' ];
foreach ( $keys as $translateKey ) {
$allData = DBA :: select ( 'profile' , [ 'id' , $translateKey ]);
2020-01-18 14:55:41 -05:00
$allLangs = DI :: l10n () -> getAvailableLanguages ();
2018-12-24 05:15:32 -05: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 = [];
// First we get the the localizations
if ( file_exists ( " view/lang/ $lang /strings.php " )) {
include " view/lang/ $lang /strings.php " ;
}
if ( file_exists ( " addon/morechoice/lang/ $lang /strings.php " )) {
include " addon/morechoice/lang/ $lang /strings.php " ;
}
$localizedStrings = $a -> strings ;
unset ( $a );
$key = array_search ( $toTranslate , $localizedStrings );
if ( $key !== false ) {
break ;
}
// defaulting to empty string
$key = '' ;
2018-12-20 11:43:07 -05:00
}
2018-12-24 05:15:32 -05:00
if ( $key == '' ) {
$fail ++ ;
} else {
DBA :: update ( 'profile' , [ $translateKey => $key ], [ 'id' => $data [ 'id' ]]);
2018-12-30 15:42:56 -05:00
Logger :: notice ( 'Updated contact' , [ 'action' => 'update' , 'contact' => $data [ 'id' ], " $translateKey " => $key ,
'was' => $data [ $translateKey ]]);
2019-04-05 14:04:39 -04:00
Worker :: add ( PRIORITY_LOW , 'ProfileUpdate' , $data [ 'id' ]);
2018-12-24 05:15:32 -05:00
Contact :: updateSelfFromUserID ( $data [ 'id' ]);
$success ++ ;
2018-12-20 11:43:07 -05:00
}
2018-12-18 11:53:00 -05:00
}
}
2018-12-24 04:53:44 -05:00
2018-12-30 15:42:56 -05:00
Logger :: notice ( $translateKey . " fix completed " , [ 'action' => 'update' , 'translateKey' => $translateKey , 'Success' => $success , 'Fail' => $fail ]);
2018-12-24 04:53:44 -05:00
}
return Update :: SUCCESS ;
}
2019-04-05 14:04:39 -04: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 ;
}
$item = Item :: selectFirst ([ 'id' , 'gravity' ], [ 'uid' => $contact [ 'uid' ], 'guid' => $entry [ 'guid' ]]);
if ( ! DBA :: isResult ( $item )) {
continue ;
}
$deliver_options = [ 'priority' => PRIORITY_MEDIUM , 'dont_fork' => true ];
2019-06-10 10:19:24 -04:00
Worker :: add ( $deliver_options , 'Delivery' , Delivery :: POST , $item [ 'id' ], $entry [ 'cid' ]);
2020-02-16 06:32:18 -05:00
Logger :: info ( 'Added delivery worker' , [ 'item' => $item [ 'id' ], 'contact' => $entry [ 'cid' ]]);
2019-04-05 16:24:49 -04:00
DBA :: delete ( 'queue' , [ 'id' => $entry [ 'id' ]]);
2019-04-05 14:04:39 -04:00
}
return Update :: SUCCESS ;
}
2019-06-29 04:30:48 -04:00
function update_1315 ()
{
2020-08-22 01:22:08 -04:00
if ( DBStructure :: existsTable ( 'item-delivery-data' )) {
DBA :: delete ( 'item-delivery-data' , [ 'postopts' => '' , 'inform' => '' , 'queue_count' => 0 , 'queue_done' => 0 ]);
}
2019-07-09 03:23:36 -04:00
return Update :: SUCCESS ;
}
function update_1318 ()
{
DBA :: update ( 'profile' , [ 'marital' => " In a relation " ], [ 'marital' => " Unavailable " ]);
DBA :: update ( 'profile' , [ 'marital' => " Single " ], [ 'marital' => " Available " ]);
Worker :: add ( PRIORITY_LOW , 'ProfileUpdate' );
return Update :: SUCCESS ;
2019-07-07 18:00:48 -04:00
}
2019-09-18 23:54:54 -04:00
function update_1323 ()
{
$users = DBA :: select ( 'user' , [ 'uid' ]);
while ( $user = DBA :: fetch ( $users )) {
Contact :: updateSelfFromUserID ( $user [ 'uid' ]);
}
DBA :: close ( $users );
return Update :: SUCCESS ;
}
2019-12-17 02:10:55 -05: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 00:47:02 -04:00
Contact\User :: setBlocked ( $contact [ 'id' ], $contact [ 'uid' ], $contact [ 'blocked' ]);
Contact\User :: setIgnored ( $contact [ 'id' ], $contact [ 'uid' ], $contact [ 'readonly' ]);
2019-12-17 02:10:55 -05:00
}
DBA :: close ( $contacts );
return Update :: SUCCESS ;
}
2020-01-06 15:14:01 -05:00
function update_1330 ()
2020-01-04 19:58:49 -05:00
{
2020-01-19 15:21:13 -05:00
$currStorage = DI :: config () -> get ( 'storage' , 'class' , '' );
2020-01-04 19:58:49 -05:00
2020-01-06 16:46:22 -05:00
// set the name of the storage instead of the classpath as config
2020-01-04 19:58:49 -05:00
if ( ! empty ( $currStorage )) {
2020-01-06 16:46:22 -05:00
/** @var Storage\IStorage $currStorage */
2020-01-19 15:21:53 -05:00
if ( ! DI :: config () -> set ( 'storage' , 'name' , $currStorage :: getName ())) {
2020-01-06 15:14:01 -05:00
return Update :: FAILED ;
2020-01-06 17:23:44 -05:00
}
// try to delete the class since it isn't needed. This won't work with config files
2020-01-19 15:22:33 -05:00
DI :: config () -> delete ( 'storage' , 'class' );
2020-01-04 19:58:49 -05:00
}
2020-01-06 16:46:22 -05:00
// Update attachments and photos
2020-01-17 17:47:26 -05:00
if ( ! DBA :: p ( " UPDATE `photo` SET `photo`.`backend-class` = SUBSTR(`photo`.`backend-class`, 25) WHERE `photo`.`backend-class` LIKE 'Friendica \\ \ Model \\ \ Storage \\ \ %' ESCAPE '|' " ) ||
! DBA :: p ( " UPDATE `attach` SET `attach`.`backend-class` = SUBSTR(`attach`.`backend-class`, 25) WHERE `attach`.`backend-class` LIKE 'Friendica \\ \ Model \\ \ Storage \\ \ %' ESCAPE '|' " )) {
2020-01-06 15:14:01 -05:00
return Update :: FAILED ;
};
2020-01-04 19:58:49 -05:00
return Update :: SUCCESS ;
}
2020-01-19 09:43:59 -05:00
function update_1332 ()
{
$condition = [ " `is-default` IS NOT NULL " ];
$profiles = DBA :: select ( 'profile' , [], $condition );
while ( $profile = DBA :: fetch ( $profiles )) {
2020-01-23 14:00:35 -05:00
DI :: profileField () -> migrateFromLegacyProfile ( $profile );
2020-01-19 09:43:59 -05:00
}
DBA :: close ( $profiles );
DBA :: update ( 'contact' , [ 'profile-id' => null ], [ '`profile-id` IS NOT NULL' ]);
return Update :: SUCCESS ;
}
2020-05-09 11:38:40 -04:00
function update_1347 ()
{
foreach ( Item :: ACTIVITIES as $index => $activity ) {
DBA :: insert ( 'verb' , [ 'id' => $index + 1 , 'name' => $activity ], true );
}
return Update :: SUCCESS ;
}
2020-05-10 10:55:03 -04:00
function pre_update_1348 ()
{
2020-05-10 13:41:16 -04: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 13:37:02 -04:00
}
2020-05-10 10:55:03 -04: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 13:37:02 -04:00
2020-08-24 16:06:06 -04:00
DBA :: e ( " DELETE FROM `auth_codes` WHERE NOT `client_id` IN (SELECT `client_id` FROM `clients`) " );
DBA :: e ( " DELETE FROM `tokens` WHERE NOT `client_id` IN (SELECT `client_id` FROM `clients`) " );
2020-05-10 13:37:02 -04:00
return Update :: SUCCESS ;
2020-05-10 10:55:03 -04:00
}
function update_1348 ()
{
// Insert a permissionset with id=0
2020-05-10 13:48:34 -04:00
// Inserting it without an ID and then changing the value to 0 tricks the auto increment
2020-05-10 13:41:16 -04:00
if ( ! DBA :: exists ( 'permissionset' , [ 'id' => 0 ])) {
DBA :: insert ( 'permissionset' , [ 'allow_cid' => '' , 'allow_gid' => '' , 'deny_cid' => '' , 'deny_gid' => '' ]);
$lastid = DBA :: lastInsertId ();
if ( $lastid != 0 ) {
DBA :: update ( 'permissionset' , [ 'id' => 0 ], [ 'id' => $lastid ]);
}
2020-05-10 13:37:02 -04:00
}
2020-05-10 13:41:16 -04: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 13:37:02 -04:00
}
2020-05-10 10:55:03 -04:00
return Update :: SUCCESS ;
}
2020-05-19 16:28:27 -04:00
function update_1349 ()
{
$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`
SET `vid` = `item-activity` . `activity` + 1 WHERE `gravity` = ? AND ( `vid` IS NULL OR `vid` = 0 ) " , GRAVITY_ACTIVITY)) {
return Update :: FAILED ;
}
return Update :: SUCCESS ;
2020-05-28 17:44:55 -04:00
}
function update_1351 ()
{
if ( ! DBA :: e ( " UPDATE `thread` INNER JOIN `item` ON `thread`.`iid` = `item`.`id` SET `thread`.`uri-id` = `item`.`uri-id` " )) {
return Update :: FAILED ;
}
return Update :: SUCCESS ;
}
2020-06-06 16:43:23 -04:00
function pre_update_1354 ()
{
2020-06-07 12:41:01 -04:00
if ( DBStructure :: existsColumn ( 'contact' , [ 'ffi_keyword_blacklist' ])
2020-07-16 06:23:56 -04:00
&& ! DBStructure :: existsColumn ( 'contact' , [ 'ffi_keyword_denylist' ])
2020-06-06 16:43:23 -04:00
&& ! DBA :: e ( " ALTER TABLE `contact` CHANGE `ffi_keyword_blacklist` `ffi_keyword_denylist` text null " )) {
return Update :: FAILED ;
}
2020-07-16 14:30:20 -04: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 16:43:23 -04:00
2020-07-16 14:30:20 -04: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 16:43:23 -04:00
return Update :: SUCCESS ;
}
2020-07-19 06:03:33 -04: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 15:21:49 -04: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 14:37:58 -04: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 16:06:06 -04: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 ;
}
if ( ! DBA :: e ( " DELETE FROM `clients` WHERE NOT `uid` IN (SELECT `uid` FROM `user`) " )) {
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 17:03:00 -04:00
if ( ! DBA :: e ( " DELETE FROM `intro` WHERE NOT `uid` IN (SELECT `uid` FROM `user`) " )) {
return Update :: FAILED ;
}
2020-08-24 16:06:06 -04: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 ;
}
if ( ! DBA :: e ( " DELETE FROM `profile_check` WHERE NOT `uid` IN (SELECT `uid` FROM `user`) " )) {
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 ;
}
if ( ! DBA :: e ( " DELETE FROM `tokens` WHERE NOT `uid` IN (SELECT `uid` FROM `user`) " )) {
return Update :: FAILED ;
}
if ( ! DBA :: e ( " DELETE FROM `user-contact` WHERE NOT `uid` IN (SELECT `uid` FROM `user`) " )) {
return Update :: FAILED ;
}
if ( ! DBA :: e ( " DELETE FROM `user-item` WHERE NOT `uid` IN (SELECT `uid` FROM `user`) " )) {
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 ;
}
if ( ! DBA :: e ( " DELETE FROM `participation` WHERE NOT `cid` IN (SELECT `id` FROM `contact`) " )) {
return Update :: FAILED ;
}
if ( ! DBA :: e ( " DELETE FROM `profile_check` WHERE NOT `cid` IN (SELECT `id` FROM `contact`) " )) {
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 `participation` WHERE NOT `fid` IN (SELECT `id` FROM `fcontact`) " )) {
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 ;
}
if ( ! DBA :: e ( " DELETE FROM `participation` WHERE NOT `iid` IN (SELECT `id` FROM `item`) " )) {
return Update :: FAILED ;
}
if ( ! DBA :: e ( " DELETE FROM `user-item` WHERE NOT `iid` IN (SELECT `id` FROM `item`) " )) {
return Update :: FAILED ;
}
return Update :: SUCCESS ;
}
2020-08-26 01:32:47 -04:00
function pre_update_1365 ()
{
if ( ! DBA :: e ( " DELETE FROM `notify-threads` WHERE NOT `notify-id` IN (SELECT `id` FROM `notify`) " )) {
return Update :: FAILED ;
}
if ( ! DBA :: e ( " DELETE FROM `thread` WHERE NOT `iid` IN (SELECT `id` FROM `item`) " )) {
return Update :: FAILED ;
}
2020-11-14 09:50:24 -05:00
return Update :: SUCCESS ;
2020-08-26 03:01:01 -04:00
}
2020-11-13 05:05:52 -05: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 17:33:44 -05: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 ;
}
if ( ! DBA :: e ( " DELETE FROM `thread` WHERE NOT `uid` IN (SELECT `uid` FROM `user`) " )) {
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 ;
}
if ( ! DBA :: e ( " DELETE FROM `contact` WHERE NOT `uid` IN (SELECT `uid` FROM `user`) " )) {
return Update :: FAILED ;
}
Photo :: delete ([ " NOT `uid` IN (SELECT `uid` FROM `user`) " ]);
return Update :: SUCCESS ;
}