s4

changeset 779:23be002abbaa feature-world

Add s4-migrate.sh
author HIROSE Yuuji <yuuji@gentei.org>
date Thu, 11 Jun 2020 19:15:40 +0900
parents 3e6d36fa579d
children b23f26406690
files s4-migrate.sh
diffstat 1 files changed, 185 insertions(+), 0 deletions(-) [+]
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/s4-migrate.sh	Thu Jun 11 19:15:40 2020 +0900
     1.3 @@ -0,0 +1,185 @@
     1.4 +#!/bin/sh
     1.5 +# s4 - migration module
     1.6 +# (C)2020 by HIROSE, Yuuji
     1.7 +
     1.8 +srcdb=`unset DB; [ -f $1 ] && . ./$1 && echo ${DB:-db/cgi.sq3}`
     1.9 +dst=`unset DB; [ -f $2 ] && . ./$2 && echo "${DB:-db/cgi.sq3}|$URL"`
    1.10 +dstdb=${dst%\|*}
    1.11 +dsturl=${dst##*\|}
    1.12 +type htmlescape >/dev/null 2>&1 || . `dirname $1`/s4-funcs.sh
    1.13 +world=${2##*-config-}; world=${world%.*}
    1.14 +htmlworld=`echo "$world"|htmlescape`
    1.15 +
    1.16 +echo srcdb=$srcdb dstdb=$dstdb
    1.17 +echo URL=$URL
    1.18 +echo dstURL=$dsturl
    1.19 +
    1.20 +shift 2
    1.21 +
    1.22 +query "ATTACH DATABASE \"$dstdb\" AS dst;" || abort "Cannot attach db #{dstdb}"
    1.23 +
    1.24 +failure=0
    1.25 +for grid; do
    1.26 +  grid=$((0 + $grid))
    1.27 +  gnamesql="(SELECT gname FROM main.grp WHERE rowid=$grid)"
    1.28 +  grp=`query "SELECT gname FROM main.grp WHERE rowid=$grid;"`
    1.29 +  htmlgrp=`echo "$grp"|htmlescape`
    1.30 +  qgrp=`sqlquote "$grp"`
    1.31 +  if [ -n "`query 'SELECT gname FROM dst.grp WHERE gname=$qgrp;'`" ]; then
    1.32 +    echo "[$htmlgrp]グループがWorld[$htmlworld]にあるので中止します。"|html p
    1.33 +    failure=$((failure+1))
    1.34 +    continue
    1.35 +  fi
    1.36 +  echo "Copying $grid..."
    1.37 +  query "BEGIN;"
    1.38 +  query "REPLACE INTO dst.grp SELECT * FROM main.grp WHERE rowid=$grid;"
    1.39 +  destrowid=`query "SELECT last_insert_rowid();"`
    1.40 +  for tbl in grp_s grp_m grp_mem grp_mem_s grp_mem_m \
    1.41 +		   grp_adm grp_adm_s grp_adm_m; do
    1.42 +    query "REPLACE INTO dst.$tbl SELECT * FROM main.$tbl
    1.43 +	   WHERE gname=$gnamesql;"
    1.44 +  done
    1.45 +  blogs=`query "SELECT group_concat(\"'\"||id||\"'\", ',')
    1.46 +  	        FROM main.blog_s WHERE key='owner' AND val=$gnamesql;"`
    1.47 +  echo blogs=$blogs
    1.48 +  for tbl in blog blog_s blog_m; do
    1.49 +    query <<-EOF
    1.50 +	REPLACE INTO dst.$tbl
    1.51 +	  SELECT * FROM main.$tbl
    1.52 +	  WHERE id IN ($blogs);
    1.53 +	EOF
    1.54 +  done
    1.55 +  for blogid in $blogs; do
    1.56 +    for tbl in article article_s article_m; do
    1.57 +      query <<-EOF
    1.58 +	REPLACE INTO dst.$tbl
    1.59 +	  SELECT * FROM main.$tbl
    1.60 +	  WHERE id IN (SELECT id FROM main.article WHERE blogid IN ($blogs));
    1.61 +	EOF
    1.62 +    done
    1.63 +  done
    1.64 +  ## Check the equality of two DBs
    1.65 +  echo "grid=$grid grp=$grp qgrp=$qgrp" | htmlescape
    1.66 +  # grp
    1.67 +  d1=$(query <<-EOF
    1.68 +	SELECT * FROM main.grp
    1.69 +	       	 NATURAL LEFT JOIN main.grp_s
    1.70 +		 NATURAL LEFT JOIN main.grp_m
    1.71 +	WHERE gname=$qgrp
    1.72 +	EXCEPT
    1.73 +	SELECT * FROM dst.grp
    1.74 +	       	 NATURAL LEFT JOIN dst.grp_s
    1.75 +		 NATURAL LEFT JOIN dst.grp_m
    1.76 +	WHERE gname=$qgrp;
    1.77 +	EOF
    1.78 +	)
    1.79 +  err DONE 
    1.80 +  err d1="$d1"
    1.81 +  # blog
    1.82 +  d2=$(query <<-EOF
    1.83 +	SELECT * FROM main.blog
    1.84 +	       	 NATURAL LEFT JOIN main.blog_s
    1.85 +		 NATURAL LEFT JOIN main.blog_m
    1.86 +	WHERE id IN (SELECT id FROM main.blog_s
    1.87 +	      	     WHERE key='owner' AND val=$qgrp)
    1.88 +	EXCEPT
    1.89 +	SELECT * FROM dst.blog
    1.90 +	       	 NATURAL LEFT JOIN dst.blog_s
    1.91 +		 NATURAL LEFT JOIN dst.blog_m
    1.92 +	WHERE id IN (SELECT id FROM dst.blog_s
    1.93 +	      	     WHERE key='owner' AND val=$qgrp);
    1.94 +	EOF
    1.95 +    )
    1.96 +  # article
    1.97 +  d3=$(query <<-EOF
    1.98 +	SELECT * FROM main.article
    1.99 +	       	 NATURAL LEFT JOIN main.article_s
   1.100 +	       	 NATURAL LEFT JOIN main.article_m
   1.101 +	WHERE blogid IN ($blogs)
   1.102 +	EXCEPT
   1.103 +	SELECT * FROM dst.article
   1.104 +	       	 NATURAL LEFT JOIN dst.article_s
   1.105 +	       	 NATURAL LEFT JOIN dst.article_m
   1.106 +	WHERE blogid IN ($blogs);
   1.107 +	EOF
   1.108 +       )
   1.109 +  if [ -z "$d1$d2$d3" ]; then
   1.110 +    echo "Copying done, rewriting article links..."
   1.111 +    echo "Old URL: $UR"
   1.112 +    echo "New URL: $dsturl"
   1.113 +    query <<-EOF
   1.114 +	UPDATE dst.article_s
   1.115 +	SET val=replace(val, '$URL', '$dsturl')
   1.116 +	WHERE key='text' AND val LIKE '|${URL}|' ESCAPE '|';
   1.117 +	UPDATE dst.blog_s
   1.118 +	SET val=replace(val, '$URL', '$dsturl')
   1.119 +	WHERE key='heading' AND val LIKE '|${URL}|' ESCAPE '|';
   1.120 +	EOF
   1.121 +    # Create blog-rowid conversion table
   1.122 +    sedfile=$tmpd/arttrans.sed
   1.123 +    query <<-EOF > $sedfile
   1.124 +	WITH arttrans AS (
   1.125 +	  SELECT s.rowid srcrid, d.rowid dstrid
   1.126 +	  FROM main.article s JOIN dst.article d ON s.id=d.id
   1.127 +	  WHERE s.id in (SELECT id
   1.128 +	  	     	 FROM article WHERE blogid IN ($blogs))
   1.129 +	) SELECT printf("/^>/s/\#%s\([^0-9]*\)/\#%s\1/g", srcrid, dstrid)
   1.130 +	  FROM arttrans;
   1.131 +	EOF
   1.132 +    query <<-EOF > $tmpd/repl.art.rowid
   1.133 +	SELECT rowid FROM dst.article_s
   1.134 +	WHERE key='text' AND val GLOB '>*#[1-9]*'
   1.135 +	  AND id IN (SELECT id FROM article WHERE blogid IN ($blogs));
   1.136 +	EOF
   1.137 +    sql=$tmpd/update.sql
   1.138 +    for arid in `cat $tmpd/repl.art.rowid`; do
   1.139 +      newval=`query "SELECT hex(val) FROM dst.article_s WHERE rowid=$arid;" \
   1.140 +              | unhexize | sed -f "$sedfile" | hexize`
   1.141 +      echo "UPDATE dst.article_s SET val=X'$newval' WHERE rowid=$arid;" >>$sql
   1.142 +    done
   1.143 +    # Rewrite blog-links in the group
   1.144 +    #  Create sed script
   1.145 +    sedfile2=${sedfile}2
   1.146 +    query <<-EOF > $sedfile2
   1.147 +	WITH blogtrans AS (
   1.148 +	  SELECT s.rowid srcrid, d.rowid dstrid
   1.149 +	  FROM main.blog s JOIN dst.blog d ON s.id=d.id
   1.150 +	  WHERE s.id IN ($blogs)
   1.151 +	) SELECT printf('s/\(\?replyblog\)\+%s\([^0-9]*\)/\1+%s\2/g',
   1.152 +		         srcrid, dstrid)
   1.153 +	  FROM blogtrans;
   1.154 +	EOF
   1.155 +    bloglinks=$tmpd/bloglinks.rowid
   1.156 +    query <<-EOF > $bloglinks
   1.157 +	SELECT rowid FROM dst.article_s
   1.158 +	WHERE key='text' AND val LIKE '%?replyblog+%'
   1.159 +	  AND id IN (SELECT id FROM article WHERE blogid IN ($blogs));
   1.160 +	EOF
   1.161 +    for arid in `cat $bloglinks`; do
   1.162 +      newval=`query "SELECT hex(replace(val, '$URL', '$dsturl')) 
   1.163 +      		     FROM dst.article_s WHERE rowid=$arid;" \
   1.164 +              | unhexize | sed -f "$sedfile2" | hexize`
   1.165 +      echo "UPDATE dst.article_s SET val=X'$newval' WHERE rowid=$arid;" >>$sql
   1.166 +    done
   1.167 +    if query ".read $sql"; then
   1.168 +      echo "Success!!"
   1.169 +      query <<-EOF
   1.170 +	DELETE FROM main.article WHERE blogid IN ($blogs);
   1.171 +	DELETE FROM main.blog WHERE id IN ($blogs);
   1.172 +	DELETE FROM main.grp WHERE rowid=$grid;
   1.173 +	EOF
   1.174 +      query "END;"
   1.175 +      echo "Done."
   1.176 +    else
   1.177 +      failure=-1
   1.178 +      echo "Replacing failed."
   1.179 +      query "ROLLBACK;"
   1.180 +    fi
   1.181 +  else
   1.182 +    failure=$((failure + 1))
   1.183 +    echo "Fail!"
   1.184 +    query "ROLLBACK;"
   1.185 +  fi
   1.186 +done
   1.187 +
   1.188 +return $failure