Просмотр исходного кода

Merge branch 'laravel-migrate-wbw' into laravel

visuddhinanda@gmail.com 4 лет назад
Родитель
Сommit
0659bfbd26

+ 11 - 0
app/Models/CustomBook.php

@@ -0,0 +1,11 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+class CustomBook extends Model
+{
+    use HasFactory;
+}

+ 11 - 0
app/Models/CustomBookId.php

@@ -0,0 +1,11 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+class CustomBookId extends Model
+{
+    use HasFactory;
+}

+ 11 - 0
app/Models/CustomBookSentence.php

@@ -0,0 +1,11 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+class CustomBookSentence extends Model
+{
+    use HasFactory;
+}

+ 39 - 0
database/migrations/2022_02_11_090826_create_custom_books_table.php

@@ -0,0 +1,39 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateCustomBooksTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('custom_books', function (Blueprint $table) {
+            $table->bigInteger('id')->primary();
+            $table->integer('book_id')->uniqid();
+            $table->string('title',512)->index();
+            $table->string('owner',36)->index();
+            $table->bigInteger('editor_id')->index();
+            $table->string('lang',16);
+            $table->integer('status');
+
+            $table->timestamp('created_at')->useCurrent()->index();
+			$table->timestamp('updated_at')->useCurrent()->useCurrentOnUpdate()->index();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('custom_books');
+    }
+}

+ 49 - 0
database/migrations/2022_02_13_024642_create_custom_book_sentences_table.php

@@ -0,0 +1,49 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateCustomBookSentencesTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('custom_book_sentences', function (Blueprint $table) {
+            $table->bigInteger('id')->primary();
+
+            $table->integer('book')->index();
+            $table->integer('paragraph');
+            $table->integer('word_start');
+            $table->integer('word_end');
+            $table->text('content');
+            $table->enum('content_type',['markdown','text','html'])->default('markdown');
+            $table->integer('length');
+            $table->string('owner',36)->index();
+            $table->string('lang',16);
+            $table->integer('status')->default(10);
+
+            $table->bigInteger('create_time')->index();
+            $table->bigInteger('modify_time')->index();
+
+            $table->timestamp('created_at')->useCurrent()->index();
+			$table->timestamp('updated_at')->useCurrent()->useCurrentOnUpdate()->index();
+
+            $table->index(['book','paragraph','word_start','word_end']);
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('custom_book_sentences');
+    }
+}

+ 34 - 0
database/migrations/2022_02_14_094254_create_custom_book_ids_table.php

@@ -0,0 +1,34 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateCustomBookIdsTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('custom_book_ids', function (Blueprint $table) {
+            $table->id();
+            $table->string('key',32)->default('max_book_number');
+            $table->integer('value');
+            $table->timestamp('created_at')->useCurrent()->index();
+			$table->timestamp('updated_at')->useCurrent()->useCurrentOnUpdate()->index();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('custom_book_ids');
+    }
+}

+ 15 - 7
public/app/config.table.php

@@ -333,8 +333,8 @@ define("_SQLITE_TABLE_CUSTOM_BOOK_", "custom_book");
 define("_SQLITE_TABLE_CUSTOM_BOOK_SENT_", "custom_book_sentence");
 
 define("_PG_DB_USER_CUSTOM_BOOK_", _PDO_DB_DSN_);
-define("_PG_TABLE_CUSTOM_BOOK_", "custom_book");
-define("_PG_TABLE_CUSTOM_BOOK_SENT_", "custom_book_sentence");
+define("_PG_TABLE_CUSTOM_BOOK_", "custom_books");
+define("_PG_TABLE_CUSTOM_BOOK_SENT_", "custom_book_sentences");
 
 # 逐词译和译文编辑消息 无需迁移数据
 define("_SQLITE_DB_MESSAGE_", "sqlite:" . __DIR__ . "/../tmp/user/message.db");
@@ -403,8 +403,13 @@ define("_FILE_DB_USER_RBAC_",  __DIR__ . "/../tmp/user/rbac.db3");
 define("_TABLE_FTS_", "fts_texts");
 
 //很少使用
-# 网站设置
-define("_FILE_DB_HOSTSETTING_", "sqlite:" . __DIR__ . "/../tmp/user/hostsetting.db3");
+
+
+define("_SQLITE_DB_HOSTSETTING_", "sqlite:" . __DIR__ . "/../tmp/user/hostsetting.db3");
+define("_SQLITE_TABLE_HOSTSETTING_", "setting");
+
+define("_PG_DB_CUSTOM_BOOK_ID_", _PDO_DB_DSN_);
+define("_PG_TABLE_CUSTOM_BOOK_ID_", "custom_book_ids");
 
 #巴缅字典
 //define("_DICT_DB_PM_", _DB_ENGIN_.":host="._DB_HOST_.";port="._DB_PORT_.";dbname="._DB_NAME_.";user="._DB_USERNAME_.";password="._DB_PASSWORD_.";");
@@ -660,9 +665,9 @@ define("_TABLE_FILEINDEX_", _PG_TABLE_FILEINDEX_);
 
 
 # 用户自定义书
-define("_FILE_DB_USER_CUSTOM_BOOK_", _SQLITE_DB_USER_CUSTOM_BOOK_);
-define("_TABLE_CUSTOM_BOOK_", _SQLITE_TABLE_CUSTOM_BOOK_);
-define("_TABLE_CUSTOM_BOOK_SENT_", _SQLITE_TABLE_CUSTOM_BOOK_SENT_);
+define("_FILE_DB_USER_CUSTOM_BOOK_", _PG_DB_USER_CUSTOM_BOOK_);
+define("_TABLE_CUSTOM_BOOK_", _PG_TABLE_CUSTOM_BOOK_);
+define("_TABLE_CUSTOM_BOOK_SENT_", _PG_TABLE_CUSTOM_BOOK_SENT_);
 
 #点赞
 define("_FILE_DB_LIKE_", _SQLITE_DB_LIKE_);
@@ -687,4 +692,7 @@ define("_TABLE_MESSAGE_", _SQLITE_TABLE_MESSAGE_);
 define("_FILE_DB_USER_DICT_", _SQLITE_DB_USER_DICT_);
 define("_TABLE_USER_DICT_", _SQLITE_TABLE_USER_DICT_);
 
+# 网站设置
+define("_FILE_DB_HOSTSETTING_", _PG_DB_CUSTOM_BOOK_ID_);
+define("_TABLE_HOSTSETTING_", _PG_TABLE_CUSTOM_BOOK_ID_);
 ?>

+ 36 - 9
public/app/db/custom_book.php

@@ -3,10 +3,11 @@ require_once "../config.php";
 require_once "../db/table.php";
 require_once '../hostsetting/function.php';
 
+
 class CustomBook extends Table
 {
     function __construct($redis=false) {
-		parent::__construct(_FILE_DB_USER_CUSTOM_BOOK_, "custom_book", "", "",$redis);
+		parent::__construct(_FILE_DB_USER_CUSTOM_BOOK_, _TABLE_CUSTOM_BOOK_, "", "",$redis);
     }
 
 	public function new($title,$data,$lang)
@@ -34,9 +35,18 @@ class CustomBook extends Table
 				return $respond;
 			}
 
-			$query="INSERT INTO {$this->table} ('book_id','title','owner','lang','status','modify_time','create_time') VALUES (?, ?, ?, ?, ?, ?, ?)";
-
-			$stmt = $this->execute($query,array($currBook,$title,$_COOKIE["userid"],$lang,10,mTime(),mTime()));
+			$query="INSERT INTO {$this->table} 
+            (
+                id,
+                book_id,
+                title,
+                owner,
+                editor_id,
+                lang,
+                status
+                ) VALUES (?,?, ?, ?, ?, ? , ?)";
+
+			$stmt = $this->execute($query,array($this->SnowFlake->id(),$currBook,$title,$_COOKIE["user_uid"],$_COOKIE["user_id"],$lang,10));
 			if($stmt){
 				$CSent = new CustomBookSentence($this->redis);
 				$respond = $CSent->insert($currBook,$sent,$lang);
@@ -53,11 +63,11 @@ class CustomBook extends Table
 class CustomBookSentence extends Table
 {
     function __construct($redis=false) {
-		parent::__construct(_FILE_DB_USER_CUSTOM_BOOK_, "custom_book_sentence", "", "",$redis);
+		parent::__construct(_FILE_DB_USER_CUSTOM_BOOK_, _TABLE_CUSTOM_BOOK_SENT_, "", "",$redis);
     }
 
 	public function getAll($book,$para,$start,$end){
-		$query="SELECT text,length,lang,modify_time,create_time,owner FROM custom_book_sentence WHERE book = ? AND paragraph = ? AND begin=? AND end = ?";
+		$query="SELECT content as text,length,lang,modify_time,create_time,owner FROM {$this->table} WHERE book = ? AND paragraph = ? AND word_start = ? AND word_end = ?";
 		$result = $this->fetch($query,array($book,$para,$start,$end));
 		if($result){
 			return $result;
@@ -76,7 +86,21 @@ class CustomBookSentence extends Table
 		$respond['content']="";
 		# 开始一个事务,关闭自动提交 
 		$this->dbh->beginTransaction();
-		$query="INSERT INTO custom_book_sentence ('book','paragraph','begin','end','length','text','lang','owner','status','create_time','modify_time') VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
+		$query="INSERT INTO {$this->table} 
+        (
+            id,
+            book,
+            paragraph,
+            word_start,
+            word_end,
+            length,
+            content,
+            lang,
+            owner,
+            status,
+            create_time,
+            modify_time
+        ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
 		
 		$sth = $this->dbh->prepare($query);
 		
@@ -112,6 +136,7 @@ class CustomBookSentence extends Table
 					$newText .='{{'."{$book}-{$para}-{$sentNum}-{$sentNum}"."}}\n";
 					$sth->execute(
 							array(
+                                $this->SnowFlake->id(),
 								$book,
 								$para,
 								$sentNum,
@@ -146,6 +171,7 @@ class CustomBookSentence extends Table
 				$newText .='{{'."{$book}-{$para}-{$sentNum}-{$sentNum}"."}}\n";
 				$sth->execute(
 						array(
+                            $this->SnowFlake->id(),
 							$book,
 							$para,
 							$sentNum,
@@ -169,6 +195,7 @@ class CustomBookSentence extends Table
 			$newText .='{{'."{$book}-{$para}-{$sentNum}-{$sentNum}"."}}\n";
 			$sth->execute(
 					array(
+                        $this->SnowFlake->id(),
 						$book,
 						$para,
 						$sentNum,
@@ -204,10 +231,10 @@ class CustomBookSentence extends Table
 	}
 
 	public function getText($book,$para,$start,$end){
-		$query="SELECT text FROM custom_book_sentence WHERE book = ? AND paragraph = ? AND begin=? AND end = ?";
+		$query="SELECT content  FROM {$this->table} WHERE book = ? AND paragraph = ? AND word_start=? AND word_end = ?";
 		$result = $this->fetch($query,array($book,$para,$start,$end));
 		if($result){
-			return $result["text"];
+			return $result["content"];
 		}
 		else{
 			return "unkow";

+ 1 - 1
public/app/db/table.php

@@ -23,7 +23,7 @@ class Table
     protected $SnowFlake;
     function __construct($db,$table,$user="",$password="",$redis=false) {
         $this->dbh = new PDO($db, _DB_USERNAME_, _DB_PASSWORD_,array(PDO::ATTR_PERSISTENT=>true));
-        $this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
+        $this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 		$database = new Medoo([
 			// Initialized and connected PDO object.
 			'pdo' => $this->dbh,

+ 4 - 4
public/app/hostsetting/function.php

@@ -6,15 +6,15 @@ class Hostsetting
     public $dbh;
     public function __construct()
     {
-        $dns = "" . _FILE_DB_HOSTSETTING_;
-        $this->dbh = new PDO($dns, "", "", array(PDO::ATTR_PERSISTENT => true));
+        $dns = _FILE_DB_HOSTSETTING_;
+        $this->dbh = new PDO($dns, _DB_USERNAME_,_DB_PASSWORD_, array(PDO::ATTR_PERSISTENT => true));
         $this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
     }
 
     public function get($key)
     {
         if ($this->dbh) {
-            $query = "SELECT value FROM setting WHERE key= ? ";
+            $query = "SELECT value FROM "._TABLE_HOSTSETTING_." WHERE key= ? ";
             $stmt = $this->dbh->prepare($query);
             $stmt->execute(array($key));
             $row = $stmt->fetch(PDO::FETCH_NUM);
@@ -31,7 +31,7 @@ class Hostsetting
     public function set($key, $value)
     {
         if ($this->dbh) {
-            $query = "UPDATE setting SET value = ?  WHERE key= ? ";
+            $query = "UPDATE "._TABLE_HOSTSETTING_." SET value = ? , updated_at = now() WHERE key= ? ";
             $stmt = $this->dbh->prepare($query);
             $stmt->execute(array($value, $key));
             if (!$stmt || ($stmt && $stmt->errorCode() != 0)) {

+ 17 - 0
public/db/sqlite/custom_book/book_sn.sql

@@ -0,0 +1,17 @@
+--
+-- 由SQLiteStudio v3.1.1 产生的文件 周一 2月 14 16:11:21 2022
+--
+-- 文本编码:UTF-8
+--
+PRAGMA foreign_keys = off;
+BEGIN TRANSACTION;
+
+-- 表:setting
+CREATE TABLE setting (

+    [key]     TEXT PRIMARY KEY,

+    value     TEXT,

+    [default] TEXT

+);
+
+COMMIT TRANSACTION;
+PRAGMA foreign_keys = on;

+ 40 - 0
public/db/sqlite/custom_book/up.sql

@@ -0,0 +1,40 @@
+--
+-- 由SQLiteStudio v3.1.1 产生的文件 周五 2月 11 15:33:54 2022
+--
+-- 文本编码:UTF-8
+--
+PRAGMA foreign_keys = off;
+BEGIN TRANSACTION;
+
+-- 表:custom_book
+CREATE TABLE custom_book 
+(
+    id INTEGER PRIMARY KEY AUTOINCREMENT, 
+    book_id INTEGER NOT NULL, 
+    title VARCHAR (256) NOT NULL, 
+    owner VARCHAR (36) NOT NULL, 
+    lang VARCHAR (8) NOT NULL, 
+    status INTEGER NOT NULL DEFAULT (0), 
+    modify_time INTEGER NOT NULL,
+    create_time INTEGER NOT NULL
+);
+
+-- 表:custom_book_sentence
+CREATE TABLE custom_book_sentence 
+(
+    id INTEGER PRIMARY KEY AUTOINCREMENT, 
+    book INTEGER, 
+    paragraph INTEGER, 
+    "begin" INTEGER, 
+    "end" INTEGER, 
+    length INTEGER, 
+    text TEXT, 
+    lang VARCHAR (8), 
+    owner VARCHAR (36) NOT NULL, 
+    status INTEGER DEFAULT (0), 
+    modify_time INTEGER NOT NULL, 
+    create_time INTEGER NOT NULL
+);
+
+COMMIT TRANSACTION;
+PRAGMA foreign_keys = on;

+ 9 - 0
v1/scripts/install5.sh

@@ -0,0 +1,9 @@
+#!/bin/sh
+
+date
+
+php ./migrations/20220211155400_custom_book_copy.php
+php ./migrations/20220213092400_custom_book_sentence_copy.php
+php ./migrations/20220214163000_custom_book_id_copy.php
+
+date

+ 175 - 0
v1/scripts/migrations/20220211155400_custom_book_copy.php

@@ -0,0 +1,175 @@
+<?php
+/*
+迁移  article 库
+从旧数据表中提取数据插入到新的表
+插入时用uuid判断是否曾经插入
+曾经插入就不插入了
+*/
+require_once __DIR__."/../../../public/app/config.php";
+require_once __DIR__."/../../../public/app/public/snowflakeid.php";
+
+set_exception_handler(function($e){
+	fwrite(STDERR,"error-msg:".$e->getMessage().PHP_EOL);
+	fwrite(STDERR,"error-file:".$e->getFile().PHP_EOL);
+	fwrite(STDERR,"error-line:".$e->getLine().PHP_EOL);
+	exit;
+});
+$start = time();
+# 雪花id
+$snowflake = new SnowFlakeId();
+
+$fpError = fopen(__DIR__.'/log/'.basename($_SERVER['PHP_SELF'],'.php').".err.data.csv",'w');
+
+#user info
+$user_db=_FILE_DB_USERINFO_;#user数据库
+$user_table=_TABLE_USER_INFO_;#user表名
+
+# 
+$src_db = _SQLITE_DB_USER_CUSTOM_BOOK_;#源数据库
+$src_table = _SQLITE_TABLE_CUSTOM_BOOK_;#源表名
+
+$dest_db = _PG_DB_USER_CUSTOM_BOOK_;#目标数据库
+$dest_table = _PG_TABLE_CUSTOM_BOOK_;#目标表名
+
+fwrite(STDOUT,"migarate custom book".PHP_EOL);
+#打开user数据库
+$PDO_USER = new PDO($user_db,_DB_USERNAME_,_DB_PASSWORD_,array(PDO::ATTR_PERSISTENT=>true));
+$PDO_USER->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+fwrite(STDOUT,"open user table".PHP_EOL);
+
+#打开源数据库
+$PDO_SRC = new PDO($src_db,_DB_USERNAME_,_DB_PASSWORD_,array(PDO::ATTR_PERSISTENT=>true));
+$PDO_SRC->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+fwrite(STDOUT,"open src table".PHP_EOL);
+
+#打开目标数据库
+$PDO_DEST = new PDO($dest_db,_DB_USERNAME_,_DB_PASSWORD_,array(PDO::ATTR_PERSISTENT=>true));
+$PDO_DEST->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+fwrite(STDOUT,"open dest table".PHP_EOL);
+
+$queryInsert = "INSERT INTO ".$dest_table." 
+								(
+                                    id,
+                                    book_id,
+									title,
+									owner,
+									editor_id,
+									lang,
+									status,
+									updated_at,
+									created_at) 
+									VALUES (? , ? , ? , ? , ?, ? , ? , ? , ? )";
+$stmtDEST = $PDO_DEST->prepare($queryInsert);
+
+$commitData = [];
+$allInsertCount = 0;
+$allSrcCount = 0;
+$count = 0;
+
+#从user数据表中读取
+$query = "SELECT id,userid  FROM ".$user_table." WHERE userid = ? ";
+$stmtUser = $PDO_USER->prepare($query);
+
+#从源数据表中读取
+$query = "SELECT *  FROM ".$src_table;
+$stmtSrc = $PDO_SRC->prepare($query);
+$stmtSrc->execute();
+while($srcData = $stmtSrc->fetch(PDO::FETCH_ASSOC)){
+	$allSrcCount++;
+
+    if($srcData["owner"]=='visuddhinanda'){
+		$srcData["owner"] = 'ba5463f3-72d1-4410-858e-eadd10884713';
+	}
+    if($srcData["owner"]=='test7'){
+		$srcData["owner"] = '6bd2f4d7-d970-419c-8ee5-f4bac42f4bc1';
+	}
+    if($srcData["owner"]=='Dhammadassi'){
+		$srcData["owner"] = 'd8538ebd-d369-4777-b99a-3ccb1aff8bfc';
+	}
+    if($srcData["owner"]=='pannava'){
+		$srcData["owner"] = '4db550c4-bc1b-43f2-a518-2740cb478f37';
+	}
+    if($srcData["owner"]=='NST'){
+		$srcData["owner"] = '5c23e629-56a3-48e9-97c7-2af73b59c3b9';
+	}
+    if($srcData["owner"]=='viranyani'){
+		$srcData["owner"] = 'C1AB2ABF-EAA8-4EEF-B4D9-3854321852B4';
+	}
+    if($srcData["owner"]=='test6'){
+		$srcData["owner"] = 'f81c7140-64b4-4025-b58c-45a3b386324a';
+	}
+	if($srcData["owner"]=='test28'){
+		$srcData["owner"] = 'df0ad9bc-c0cd-4cd9-af05-e43d23ed57f0';
+	}
+	if($srcData["owner"]=='290fd808-2f46-4b8c-b300-0367badd67ed'){
+		$srcData["owner"] = 'f81c7140-64b4-4025-b58c-45a3b386324a';
+	}
+	if($srcData["owner"]=='BA837178-9ABD-4DD4-96A0-D2C21B756DC4'){
+		$srcData["owner"] = 'ba5463f3-72d1-4410-858e-eadd10884713';
+	}
+	$stmtUser->execute(array($srcData["owner"]));
+	$userId = $stmtUser->fetch(PDO::FETCH_ASSOC);
+	if(!$userId){
+		fwrite(STDERR,time()."error,no user id {$srcData["owner"]}".PHP_EOL);
+		continue;
+	}
+	if(strlen($srcData["owner"])>36){
+		fwrite(STDERR,time().",error,user id too long {$srcData["owner"]}".PHP_EOL);
+		continue;	
+	}
+
+    $srcData["status"] = 30;
+
+    if(empty($srcData["modify_time"])){
+        $srcData["modify_time"] = $srcData["create_time"];
+    }
+
+    if($srcData["create_time"] < 15987088320){
+        $srcData["create_time"] *= 1000;
+    }
+    if($srcData["modify_time"] < 15987088320){
+        $srcData["modify_time"] *= 1000;
+    }
+	//查询是否已经插入
+	$queryExsit = "SELECT id  FROM ".$dest_table." WHERE id = ? ";
+	$getExist = $PDO_DEST->prepare($queryExsit);
+	$getExist->execute(array($srcData["id"]));
+	$exist = $getExist->fetch(PDO::FETCH_ASSOC);
+	if($exist){
+		continue;
+	}
+	#插入目标表
+	$created_at = date("Y-m-d H:i:s.",$srcData["create_time"]/1000).($srcData["create_time"]%1000)." UTC";
+	$updated_at = date("Y-m-d H:i:s.",$srcData["modify_time"]/1000).($srcData["modify_time"]%1000)." UTC";
+	$commitData = array(
+            $snowflake->id(),
+			$srcData["book_id"],
+			$srcData["title"],
+			$srcData["owner"],
+			$userId["id"],
+			$srcData["lang"],
+			$srcData["status"],
+			$created_at,
+			$updated_at
+		);
+	$stmtDEST->execute($commitData);
+
+	$count++;	
+	$allInsertCount++;
+
+
+	if($count ==10000){
+		#10000行输出log 一次
+		echo "finished $count".PHP_EOL;
+		$count=0;
+	}	
+}
+
+fwrite(STDOUT,"insert done $allInsertCount in $allSrcCount ".PHP_EOL) ;
+fwrite(STDOUT, "all done in ".(time()-$start)."s".PHP_EOL);
+
+fclose($fpError);
+
+
+
+

+ 185 - 0
v1/scripts/migrations/20220213092400_custom_book_sentence_copy.php

@@ -0,0 +1,185 @@
+<?php
+/*
+迁移  article 库
+从旧数据表中提取数据插入到新的表
+插入时用uuid判断是否曾经插入
+曾经插入就不插入了
+*/
+require_once __DIR__."/../../../public/app/config.php";
+require_once __DIR__."/../../../public/app/public/snowflakeid.php";
+
+set_exception_handler(function($e){
+	fwrite(STDERR,"error-msg:".$e->getMessage().PHP_EOL);
+	fwrite(STDERR,"error-file:".$e->getFile().PHP_EOL);
+	fwrite(STDERR,"error-line:".$e->getLine().PHP_EOL);
+	exit;
+});
+$start = time();
+# 雪花id
+$snowflake = new SnowFlakeId();
+
+$fpError = fopen(__DIR__.'/log/'.basename($_SERVER['PHP_SELF'],'.php').".err.data.csv",'w');
+
+#user info
+$user_db=_FILE_DB_USERINFO_;#user数据库
+$user_table=_TABLE_USER_INFO_;#user表名
+
+# 
+$src_db = _SQLITE_DB_USER_CUSTOM_BOOK_;#源数据库
+$src_table = _SQLITE_TABLE_CUSTOM_BOOK_SENT_;#源表名
+
+$dest_db = _PG_DB_USER_CUSTOM_BOOK_;#目标数据库
+$dest_table = _PG_TABLE_CUSTOM_BOOK_SENT_;#目标表名
+
+fwrite(STDOUT,"migarate custom book".PHP_EOL);
+#打开user数据库
+$PDO_USER = new PDO($user_db,_DB_USERNAME_,_DB_PASSWORD_,array(PDO::ATTR_PERSISTENT=>true));
+$PDO_USER->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+fwrite(STDOUT,"open user table".PHP_EOL);
+
+#打开源数据库
+$PDO_SRC = new PDO($src_db,_DB_USERNAME_,_DB_PASSWORD_,array(PDO::ATTR_PERSISTENT=>true));
+$PDO_SRC->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+fwrite(STDOUT,"open src table".PHP_EOL);
+
+#打开目标数据库
+$PDO_DEST = new PDO($dest_db,_DB_USERNAME_,_DB_PASSWORD_,array(PDO::ATTR_PERSISTENT=>true));
+$PDO_DEST->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+fwrite(STDOUT,"open dest table".PHP_EOL);
+
+$queryInsert = "INSERT INTO ".$dest_table." 
+								(
+                                    id,
+									book,
+									paragraph,
+									word_start,
+									word_end,
+									content,
+                                    length,
+                                    owner,
+                                    lang,
+                                    status,
+                                    create_time,
+                                    modify_time,
+									updated_at,
+									created_at) 
+									VALUES (? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ?)";
+$stmtDEST = $PDO_DEST->prepare($queryInsert);
+
+$commitData = [];
+$allInsertCount = 0;
+$allSrcCount = 0;
+$count = 0;
+
+#从user数据表中读取
+$query = "SELECT id,userid  FROM ".$user_table." WHERE userid = ? ";
+$stmtUser = $PDO_USER->prepare($query);
+
+#从源数据表中读取
+$query = "SELECT *  FROM ".$src_table;
+$stmtSrc = $PDO_SRC->prepare($query);
+$stmtSrc->execute();
+while($srcData = $stmtSrc->fetch(PDO::FETCH_ASSOC)){
+	$allSrcCount++;
+
+    if($srcData["owner"]=='visuddhinanda'){
+		$srcData["owner"] = 'ba5463f3-72d1-4410-858e-eadd10884713';
+	}
+    if($srcData["owner"]=='test7'){
+		$srcData["owner"] = '6bd2f4d7-d970-419c-8ee5-f4bac42f4bc1';
+	}
+    if($srcData["owner"]=='Dhammadassi'){
+		$srcData["owner"] = 'd8538ebd-d369-4777-b99a-3ccb1aff8bfc';
+	}
+    if($srcData["owner"]=='pannava'){
+		$srcData["owner"] = '4db550c4-bc1b-43f2-a518-2740cb478f37';
+	}
+    if($srcData["owner"]=='NST'){
+		$srcData["owner"] = '5c23e629-56a3-48e9-97c7-2af73b59c3b9';
+	}
+    if($srcData["owner"]=='viranyani'){
+		$srcData["owner"] = 'C1AB2ABF-EAA8-4EEF-B4D9-3854321852B4';
+	}
+    if($srcData["owner"]=='test6'){
+		$srcData["owner"] = 'f81c7140-64b4-4025-b58c-45a3b386324a';
+	}
+	if($srcData["owner"]=='test28'){
+		$srcData["owner"] = 'df0ad9bc-c0cd-4cd9-af05-e43d23ed57f0';
+	}
+	if($srcData["owner"]=='290fd808-2f46-4b8c-b300-0367badd67ed'){
+		$srcData["owner"] = 'f81c7140-64b4-4025-b58c-45a3b386324a';
+	}
+	if($srcData["owner"]=='BA837178-9ABD-4DD4-96A0-D2C21B756DC4'){
+		$srcData["owner"] = 'ba5463f3-72d1-4410-858e-eadd10884713';
+	}
+	$stmtUser->execute(array($srcData["owner"]));
+	$userId = $stmtUser->fetch(PDO::FETCH_ASSOC);
+	if(!$userId){
+		fwrite(STDERR,time()."error,no user id {$srcData["owner"]}".PHP_EOL);
+		continue;
+	}
+	if(strlen($srcData["owner"])>36){
+		fwrite(STDERR,time().",error,user id too long {$srcData["owner"]}".PHP_EOL);
+		continue;	
+	}
+
+    $srcData["status"] = 30;
+
+    if(empty($srcData["modify_time"])){
+        $srcData["modify_time"] = $srcData["create_time"];
+    }
+
+    if($srcData["create_time"] < 15987088320){
+        $srcData["create_time"] *= 1000;
+    }
+    if($srcData["modify_time"] < 15987088320){
+        $srcData["modify_time"] *= 1000;
+    }
+	//查询是否已经插入
+	$queryExsit = "SELECT id  FROM ".$dest_table." WHERE book = ? and paragraph = ? and word_start=? and word_end = ? ";
+	$getExist = $PDO_DEST->prepare($queryExsit);
+	$getExist->execute(array($srcData["book"],$srcData["paragraph"],$srcData["begin"],$srcData["end"]));
+	$exist = $getExist->fetch(PDO::FETCH_ASSOC);
+	if($exist){
+		continue;
+	}
+	#插入目标表
+	$created_at = date("Y-m-d H:i:s.",$srcData["create_time"]/1000).($srcData["create_time"]%1000)." UTC";
+	$updated_at = date("Y-m-d H:i:s.",$srcData["modify_time"]/1000).($srcData["modify_time"]%1000)." UTC";
+	$commitData = array(
+            $snowflake->id(),
+			$srcData["book"],
+			$srcData["paragraph"],
+			$srcData["begin"],
+			$srcData["end"],
+			$srcData["text"],
+			$srcData["length"],
+			$srcData["owner"],
+			$srcData["lang"],
+			$srcData["status"],
+			$srcData["create_time"],
+			$srcData["modify_time"],
+			$created_at,
+			$updated_at
+		);
+	$stmtDEST->execute($commitData);
+
+	$count++;	
+	$allInsertCount++;
+
+
+	if($count ==10000){
+		#10000行输出log 一次
+		echo "finished $count".PHP_EOL;
+		$count=0;
+	}	
+}
+
+fwrite(STDOUT,"insert done $allInsertCount in $allSrcCount ".PHP_EOL) ;
+fwrite(STDOUT, "all done in ".(time()-$start)."s".PHP_EOL);
+
+fclose($fpError);
+
+
+
+

+ 95 - 0
v1/scripts/migrations/20220214163000_custom_book_id_copy.php

@@ -0,0 +1,95 @@
+<?php
+/*
+迁移  article 库
+从旧数据表中提取数据插入到新的表
+插入时用uuid判断是否曾经插入
+曾经插入就不插入了
+*/
+require_once __DIR__."/../../../public/app/config.php";
+require_once __DIR__."/../../../public/app/public/snowflakeid.php";
+
+set_exception_handler(function($e){
+	fwrite(STDERR,"error-msg:".$e->getMessage().PHP_EOL);
+	fwrite(STDERR,"error-file:".$e->getFile().PHP_EOL);
+	fwrite(STDERR,"error-line:".$e->getLine().PHP_EOL);
+	exit;
+});
+$start = time();
+# 雪花id
+$snowflake = new SnowFlakeId();
+
+$fpError = fopen(__DIR__.'/log/'.basename($_SERVER['PHP_SELF'],'.php').".err.data.csv",'w');
+
+
+
+# 
+$src_db = _SQLITE_DB_HOSTSETTING_;#源数据库
+$src_table = _SQLITE_TABLE_HOSTSETTING_;#源表名
+
+$dest_db = _PG_DB_CUSTOM_BOOK_ID_;#目标数据库
+$dest_table = _PG_TABLE_CUSTOM_BOOK_ID_;#目标表名
+
+fwrite(STDOUT,"migarate custom book id".PHP_EOL);
+
+
+#打开源数据库
+$PDO_SRC = new PDO($src_db,_DB_USERNAME_,_DB_PASSWORD_,array(PDO::ATTR_PERSISTENT=>true));
+$PDO_SRC->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+fwrite(STDOUT,"open src table".PHP_EOL);
+
+#打开目标数据库
+$PDO_DEST = new PDO($dest_db,_DB_USERNAME_,_DB_PASSWORD_,array(PDO::ATTR_PERSISTENT=>true));
+$PDO_DEST->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+fwrite(STDOUT,"open dest table".PHP_EOL);
+
+$queryInsert = "INSERT INTO ".$dest_table." 
+								(
+									key,
+									value) 
+									VALUES (? , ?  )";
+$stmtDEST = $PDO_DEST->prepare($queryInsert);
+
+$commitData = [];
+$allInsertCount = 0;
+$allSrcCount = 0;
+$count = 0;
+
+
+#从源数据表中读取
+$query = "SELECT key,value  FROM ".$src_table. " where key = 'max_book_number' ";
+$stmtSrc = $PDO_SRC->prepare($query);
+$stmtSrc->execute();
+if($srcData = $stmtSrc->fetch(PDO::FETCH_ASSOC)){
+	$allSrcCount++;
+	//查询是否已经插入
+	$queryExsit = "SELECT id  FROM ".$dest_table." WHERE key = ? ";
+	$getExist = $PDO_DEST->prepare($queryExsit);
+	$getExist->execute(array($srcData["key"]));
+	$exist = $getExist->fetch(PDO::FETCH_ASSOC);
+	if($exist){
+        echo "key max_book_number exist value=".$getExist['value'];
+		exit;
+	}
+	#插入目标表
+
+	$commitData = array(
+			$srcData["key"],
+			$srcData["value"]
+		);
+	$stmtDEST->execute($commitData);
+
+	$count++;	
+	$allInsertCount++;
+
+}else{
+    echo "no row read".PHP_EOL;
+}
+
+fwrite(STDOUT,"insert done $allInsertCount in $allSrcCount ".PHP_EOL) ;
+fwrite(STDOUT, "all done in ".(time()-$start)."s".PHP_EOL);
+
+fclose($fpError);
+
+
+
+