diff options
Diffstat (limited to 'util/z6convert.php')
-rw-r--r-- | util/z6convert.php | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/util/z6convert.php b/util/z6convert.php new file mode 100644 index 000000000..5cc306753 --- /dev/null +++ b/util/z6convert.php @@ -0,0 +1,149 @@ +#!/usr/bin/env php +<?php + +// Convert database to support Zot 6 +require_once('include/cli_startup.php'); + +cli_startup(); + +$dryrun = (($argv[1] === 'dry-run') ? true : false); + +$zot = []; +$zot6 = []; + +// indexed columns +$core = [ + 'abconfig' => ['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; + + |