aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--util/z6convert.php149
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;
+
+