#!/usr/bin/env php ['xchan'], 'abook' => ['abook_xchan'], 'app' => ['app_author'], 'chat' => ['chat_xchan'], 'chatpresence' => ['cp_xchan'], 'dreport' => ['dreport_recip', 'dreport_xchan'], 'mail' => ['from_xchan', 'to_xchan'], 'pgrp_member' => ['xchan'], 'source' => ['src_channel_xchan', 'src_xchan'], 'updates' => ['ud_hash'], 'xchat' => ['xchat_xchan'], 'xign' => ['xchan'], 'xlink' => ['xlink_xchan', 'xlink_link'], 'xprof' => ['xprof_hash'], 'xtag' => ['xtag_hash'] ]; $r = dbq("SELECT channel.channel_name, channel.channel_portable_id, xchan.xchan_network FROM channel LEFT JOIN xchan ON channel_portable_id = xchan_hash WHERE xchan.xchan_network = 'zot' AND channel.channel_removed = 0" ); if($dryrun) { echo "--------------------------------------------------" . PHP_EOL; echo "-- This is a dry-run. No data will be modified! --" . PHP_EOL; echo "--------------------------------------------------" . PHP_EOL; sleep(3); } foreach($r as $rr) { $zot_xchan = $rr['channel_portable_id']; $r = q("SELECT xchan_guid FROM xchan WHERE xchan_hash = '%s' AND xchan_network = 'zot'", dbesc($zot_xchan) ); if(!$r) { echo '-- ' . $zot_xchan . 'failed: zot xchan not found' . PHP_EOL; continue; } $guid = $r[0]['xchan_guid']; $r = q("SELECT xchan_hash, xchan_guid_sig FROM xchan WHERE xchan_guid = '%s' AND xchan_network = 'zot6'", dbesc($guid) ); if(!$r) { echo '-- ' . $zot_xchan . 'failed: zot6 xchan not found' . PHP_EOL; continue; } $zot[] = $zot_xchan; $zot6[] = $r[0]['xchan_hash']; echo "-- converting indexed data for " . $rr['channel_name'] . PHP_EOL; foreach($core as $table => $cols) { foreach($cols as $col) { if(! $dryrun) { $z = q("UPDATE $table SET $col = '%s' WHERE $col = '%s'", dbesc($r[0]['xchan_hash']), dbesc($zot_xchan) ); } } } } // columns which require a whole table scan $core = [ 'attach' => ['creator', 'allow_cid', 'deny_cid'], 'channel' => ['channel_allow_cid', 'channel_deny_cid'], 'chatroom' => ['allow_cid', 'deny_cid'], 'config' => ['v'], 'event' => ['event_xchan', 'allow_cid', 'deny_cid'], 'iconfig' => ['v'], 'item' => ['owner_xchan', 'author_xchan', 'source_xchan', 'route', 'allow_cid', 'deny_cid'], 'menu_item' => ['allow_cid', 'deny_cid'], 'obj' => ['allow_cid', 'deny_cid'], 'pconfig' => ['v'], 'photo' => ['xchan', 'allow_cid', 'deny_cid'], 'xconfig' => ['xchan', 'v'] ]; foreach($core as $table => $cols) { $fields = implode(", ", $cols); $id_col = db_columns($table)[0]; $cur_id = 0; $i = 0; $r = dbq("SELECT COUNT(*) AS total, MAX($id_col) AS max_id FROM $table"); $items_total = $r[0]['total']; $max_id = $r[0]['max_id']; echo PHP_EOL; echo "-- converting $table table data" . PHP_EOL; while ($cur_id < $max_id) { $r = dbq("SELECT $id_col FROM $table WHERE $id_col > $cur_id ORDER BY $id_col LIMIT 100"); foreach($r as $rr) { $q = ''; $cur_id = $rr[$id_col]; $x = dbq("SELECT $fields FROM $table WHERE $id_col = $cur_id")[0]; foreach($x as $k => $v) $q .= (empty($q) ? "UPDATE $table SET " : ", ") . "$k = '" . dbesc(str_replace($zot, $zot6, $x[$k])) . "'"; $q .= " WHERE $id_col = $cur_id"; if(! $dryrun) dbq("$q"); $i++; } echo "$i/$items_total\r"; } echo "$i/$items_total\r"; echo PHP_EOL; } echo PHP_EOL; echo "Done!" . PHP_EOL;