Forráskód Böngészése

:sparkles: share migrate to pg

visuddhinanda@gmail.com 4 éve
szülő
commit
69d9abb71e

+ 11 - 0
app/Models/Share.php

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

+ 45 - 0
database/migrations/2022_02_04_012828_create_shares_table.php

@@ -0,0 +1,45 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateSharesTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('shares', function (Blueprint $table) {
+			#使用雪花id
+            $table->bigInteger('id')->primary();
+
+            $table->string('res_id',36);
+            $table->integer('res_type');
+            $table->string('cooperator_id',36);
+            $table->integer('cooperator_type');
+            $table->integer('power');
+            $table->bigInteger('create_time');
+            $table->bigInteger('modify_time');
+
+			$table->timestamp('accepted_at')->nullable()->index();
+            $table->bigInteger('acceptor')->nullable();
+
+			$table->timestamp('created_at')->useCurrent()->index();
+			$table->timestamp('updated_at')->useCurrent()->useCurrentOnUpdate()->index();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('shares');
+    }
+}

+ 3 - 3
public/app/config.table.php

@@ -299,7 +299,7 @@ define("_SQLITE_DB_USER_SHARE_", "sqlite:" . __DIR__ . "/../tmp/user/share.db3")
 define("_SQLITE_TABLE_USER_SHARE_", "share_cooperator");
 
 define("_PG_DB_USER_SHARE_", _PDO_DB_DSN_);
-define("_PG_TABLE_USER_SHARE_", "share_cooperator");
+define("_PG_TABLE_USER_SHARE_", "shares");
 
 # 工作组
 define("_SQLITE_DB_GROUP_", "sqlite:" . __DIR__ . "/../tmp/user/group.db3");
@@ -647,8 +647,8 @@ define("_FILE_DB_TERM_", _PG_DB_TERM_);
 define("_TABLE_TERM_", _PG_TABLE_TERM_);
 
 # 协作
-define("_FILE_DB_USER_SHARE_", _SQLITE_DB_USER_SHARE_);
-define("_TABLE_USER_SHARE_", _SQLITE_TABLE_USER_SHARE_);
+define("_FILE_DB_USER_SHARE_", _PG_DB_USER_SHARE_);
+define("_TABLE_USER_SHARE_", _PG_TABLE_USER_SHARE_);
 
 # 工作组
 define("_FILE_DB_GROUP_", _SQLITE_DB_GROUP_);

+ 1 - 1
public/app/public/_pdo.php

@@ -3,7 +3,7 @@ function PDO_Connect($dsn, $user="", $password="")
 {
     global $PDO;
     $PDO = new PDO($dsn,_DB_USERNAME_,_DB_PASSWORD_,array(PDO::ATTR_PERSISTENT=>true));
-    $PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
+    $PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 }
 function PDO_FetchOne($query, $params=null)
 {

+ 2 - 2
public/app/share/coop_del.php

@@ -14,8 +14,8 @@ $respond['message']="成功";
 if(isset($_POST["res_id"])){
 	$redis = redis_connect();
 
-	PDO_Connect(_FILE_DB_USER_SHARE_);
-    $query = "DELETE FROM share_cooperator WHERE res_id=? and cooperator_id = ? ";
+	PDO_Connect(_FILE_DB_USER_SHARE_,_DB_USERNAME_, _DB_PASSWORD_);
+    $query = "DELETE FROM "._TABLE_USER_SHARE_." WHERE res_id=? and cooperator_id = ? ";
 	$sth = $PDO->prepare($query);
 	if($sth)
 	{

+ 2 - 2
public/app/share/coop_get.php

@@ -8,10 +8,10 @@ require_once '../ucenter/function.php';
 require_once '../group/function.php';
 
 if(isset($_GET["res_id"])){
-    PDO_Connect(_FILE_DB_USER_SHARE_);
+    PDO_Connect(_FILE_DB_USER_SHARE_,_DB_USERNAME_, _DB_PASSWORD_);
     $id=$_GET["res_id"];
     $type=$_GET["res_type"];
-    $query = "SELECT * FROM share_cooperator  WHERE res_id = ? and res_type=? ";
+    $query = "SELECT * FROM "._TABLE_USER_SHARE_."  WHERE res_id = ? and res_type=? ";
 	$Fetch = PDO_FetchAll($query,array($id,$type));
 
 	#获取协作者名字

+ 2 - 2
public/app/share/coop_post.php

@@ -13,8 +13,8 @@ $respond['status']=0;
 $respond['message']="成功";
 if(isset($_POST["res_id"])){
 	$redis = redis_connect();
-	PDO_Connect(_FILE_DB_USER_SHARE_);
-    $query = "UPDATE share_cooperator set power = ? WHERE res_id=? and cooperator_id = ? ";
+	PDO_Connect(_FILE_DB_USER_SHARE_,_DB_USERNAME_, _DB_PASSWORD_);
+    $query = "UPDATE "._TABLE_USER_SHARE_." set power = ? WHERE res_id=? and cooperator_id = ? ";
 	$sth = $PDO->prepare($query);
 	if($sth)
 	{

+ 86 - 61
public/app/share/coop_put.php

@@ -8,74 +8,99 @@ require_once '../ucenter/function.php';
 require_once '../group/function.php';
 require_once "../redis/function.php";
 require_once "../collect/function.php";
+require_once __DIR__."/../public/snowflakeid.php";
+$snowflake = new SnowFlakeId();
 
 $respond['status']=0;
 $respond['message']="成功";
 if(isset($_POST["res_id"])){
 	$redis = redis_connect();
-	PDO_Connect(_FILE_DB_USER_SHARE_);
-	$PDO->beginTransaction();
-    $query = "INSERT  INTO share_cooperator ('id','res_id','res_type','cooperator_id','cooperator_type','power','create_time','modify_time','is_deleted') VALUES (null,?,?,?,?,?,?,?,?) ";
-	$sth = $PDO->prepare($query);
+    #打开目标数据库
+    $dest_db = _PG_DB_USER_SHARE_;#目标数据库
+    $dest_table = _PG_TABLE_USER_SHARE_;#目标表名
+    $PDO_DEST = new PDO($dest_db,_DB_USERNAME_,_DB_PASSWORD_,array(PDO::ATTR_PERSISTENT=>true));
+    $PDO_DEST->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+
+    $queryInsert = "INSERT INTO ".$dest_table." 
+								(
+                                    id,
+									res_id,
+									res_type,
+									cooperator_id,
+									cooperator_type,
+									power,
+									create_time,
+									modify_time,
+									created_at,
+									updated_at) 
+									VALUES (? , ? , ? , ?, ? , ? ,? , ? , ? , ? )";
+    $stmtDEST = $PDO_DEST->prepare($queryInsert);
+
 	$data = json_decode($_POST["user_info"]);
-	foreach ($data as $key => $user) {
-		# code...
-		$sth->execute(array($_POST["res_id"],
-							$_POST["res_type"],
-							$user->id,
-							$user->type,
-							$_POST["power"],
-							mTime(),
-							mTime(),
-							0
-						));
-	}
-	$PDO->commit();
+    try {
+        $PDO_DEST->beginTransaction();
+        foreach ($data as $key => $user) {
+            # code...
+            #插入目标表
+            $create_time = mTime();
+            $created_at = date("Y-m-d H:i:s.",$create_time/1000).($create_time%1000)." UTC";
+            $updated_at = date("Y-m-d H:i:s.",$create_time/1000).($create_time%1000)." UTC";
+            $commitData = array(
+                $snowflake->id(),
+                $_POST["res_id"],
+                $_POST["res_type"],
+                $user->id,
+                $user->type,
+                $_POST["power"],
+                $create_time,
+                $create_time,
+                $created_at,
+                $updated_at
+            );
+            $stmtDEST->execute($commitData);
+        }
+        $PDO_DEST->commit();
+
+        $respond['status']=0;
+        $respond['message']="成功";
+        if($redis){
+            switch ((int)$_POST["res_type"]) {
+                case 1:
+                    # pcs
+                    $redis->del("power://pcs/".$_POST["res_id"]);
+                    break;
+                case 2:
+                    # channel
+                    $redis->del("power://channel/".$_POST["res_id"]);
+                    break;
+                case 3:
+                    # code...
+                    $redis->del("power://article/".$_POST["res_id"]);
+                    break;
+                case 4:
+                    # 文集
+                    $redis->del("power://collection/".$_POST["res_id"]);
+                    # 删除文章列表权限缓存
+                    $collection = new CollectInfo($redis);
+                    $articleList = $collection->getArticleList($_POST["res_id"]);
+                    foreach ($articleList as $key => $value) {
+                        # code...
+                        $redis->del("power://article/".$value);
+                    }
+                    break;
+                default:
+                    # code...
+                    break;
+            }
+        }
         
-	if (!$sth || ($sth && $sth->errorCode() != 0)) {
-		/*  识别错误且回滚更改  */
-		$PDO->rollBack();
-		$error = PDO_ErrorInfo();
-		$respond['status']=1;
-		$respond['message']=$error[2];
-		echo json_encode($respond, JSON_UNESCAPED_UNICODE);
-		exit;
-	}
-	else{
-		$respond['status']=0;
-		$respond['message']="成功";
-		if($redis){
-			switch ((int)$_POST["res_type"]) {
-				case 1:
-					# pcs
-					$redis->del("power://pcs/".$_POST["res_id"]);
-					break;
-				case 2:
-					# channel
-					$redis->del("power://channel/".$_POST["res_id"]);
-					break;
-				case 3:
-					# code...
-					$redis->del("power://article/".$_POST["res_id"]);
-					break;
-				case 4:
-					# 文集
-					$redis->del("power://collection/".$_POST["res_id"]);
-					# 删除文章列表权限缓存
-					$collection = new CollectInfo($redis);
-					$articleList = $collection->getArticleList($_POST["res_id"]);
-					foreach ($articleList as $key => $value) {
-						# code...
-						$redis->del("power://article/".$value);
-					}					
-					break;											
-				default:
-					# code...
-					break;
-			}
-		}
-	}	
-    echo json_encode($respond, JSON_UNESCAPED_UNICODE);
+        echo json_encode($respond, JSON_UNESCAPED_UNICODE);
+    }catch (Exception $e) {
+    $PDO_DEST->rollBack();
+    	$respond['status']=1;
+        $respond['message']="Failed: " . $e->getMessage();
+        echo json_encode($respond, JSON_UNESCAPED_UNICODE);
+    }
 }
 else{
 	$respond['status']=1;

+ 9 - 9
public/app/share/function.php

@@ -15,9 +15,9 @@ $res_type 见readme.md#资源类型 -1全部类型资源
 function share_res_list_get($userid,$res_type=-1){
 	$redis = redis_connect();
 	# 找我加入的群
-	$dbhGroup = new PDO(_FILE_DB_GROUP_, "", "");
+	$dbhGroup = new PDO(_FILE_DB_GROUP_, _DB_USERNAME_, _DB_PASSWORD_);
     $dbhGroup->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
-	$query = "SELECT group_id from group_member where user_id = ?  limit 0,200";
+	$query = "SELECT group_id from group_member where user_id = ?  limit 200";
 	$stmtGroup = $dbhGroup->prepare($query);
 	$stmtGroup->execute(array($userid));
 	$my_group = $stmtGroup->fetchAll(PDO::FETCH_ASSOC);
@@ -30,11 +30,11 @@ function share_res_list_get($userid,$res_type=-1){
 	
 	$place_holders = implode(',', array_fill(0, count($userList), '?'));
 	$Fetch=array();
-	$PDO = new PDO(_FILE_DB_USER_SHARE_, "", "");
+	$PDO = new PDO(_FILE_DB_USER_SHARE_, _DB_USERNAME_, _DB_PASSWORD_);
     $PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
 	if($res_type==-1){
 		#所有类型资源
-		$query = "SELECT res_id,res_type,power FROM share_cooperator  WHERE is_deleted=0 AND cooperator_id IN ($place_holders) ";
+		$query = "SELECT res_id,res_type,power FROM "._TABLE_USER_SHARE_."  WHERE  cooperator_id IN ($place_holders) ";
 		$stmt = $PDO->prepare($query);
 		$stmt->execute($userList);
 		$Fetch =$stmt->fetchAll(PDO::FETCH_ASSOC);
@@ -42,7 +42,7 @@ function share_res_list_get($userid,$res_type=-1){
 	else{
 		#指定类型资源
 		$userList[]=$res_type;
-		$query = "SELECT res_id,res_type,power FROM share_cooperator  WHERE is_deleted=0 AND  cooperator_id IN ($place_holders) AND res_type = ?";
+		$query = "SELECT res_id,res_type,power FROM "._TABLE_USER_SHARE_."  WHERE   cooperator_id IN ($place_holders) AND res_type = ?";
 		$stmt = $PDO->prepare($query);
 		$stmt->execute($userList);
 		$Fetch =$stmt->fetchAll(PDO::FETCH_ASSOC);
@@ -144,9 +144,9 @@ function share_get_res_power($userid,$res_id){
 			return 0;
 		}
 		# 找我加入的群
-		$dbhGroup = new PDO(_FILE_DB_GROUP_, "", "");
+		$dbhGroup = new PDO(_FILE_DB_GROUP_, _DB_USERNAME_, _DB_PASSWORD_);
 		$dbhGroup->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
-		$query = "SELECT group_id from group_member where user_id = ?  limit 0,100";
+		$query = "SELECT group_id from group_member where user_id = ?  limit 100";
 		$stmtGroup = $dbhGroup->prepare($query);
 		$stmtGroup->execute(array($userid));
 		$my_group = $stmtGroup->fetchAll(PDO::FETCH_ASSOC);
@@ -159,11 +159,11 @@ function share_get_res_power($userid,$res_id){
 		
 		$place_holders = implode(',', array_fill(0, count($userList), '?'));
 		$Fetch=array();
-		$PDO = new PDO(_FILE_DB_USER_SHARE_, "", "");
+		$PDO = new PDO(_FILE_DB_USER_SHARE_, _DB_USERNAME_, _DB_PASSWORD_);
 		$PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
 
 			$userList[]=$res_id;
-			$query = "SELECT power FROM share_cooperator  WHERE is_deleted=0 AND  cooperator_id IN ($place_holders) AND res_id = ? ";
+			$query = "SELECT power FROM "._TABLE_USER_SHARE_."  WHERE  cooperator_id IN ($place_holders) AND res_id = ? ";
 			$stmt = $PDO->prepare($query);
 			$stmt->execute($userList);
 			$Fetch =$stmt->fetchAll(PDO::FETCH_ASSOC);

+ 0 - 0
public/db/sqlite/share/share.sql


+ 1 - 1
v1/scripts/install3.sh

@@ -3,6 +3,6 @@
 date
 
 php ./migrations/20220202172100_dhamma_terms_copy.php
-
+php ./migrations/20220204081300_share_copy.php
 
 date

+ 177 - 0
v1/scripts/migrations/20220204081300_share_copy.php

@@ -0,0 +1,177 @@
+<?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_SHARE_;#源数据库
+$src_table = _SQLITE_TABLE_USER_SHARE_;#源表名
+
+$dest_db = _PG_DB_USER_SHARE_;#目标数据库
+$dest_table = _PG_TABLE_USER_SHARE_;#目标表名
+
+fwrite(STDOUT,"migarate share ".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,
+									res_id,
+									res_type,
+									cooperator_id,
+									cooperator_type,
+									power,
+									create_time,
+									modify_time,
+									created_at,
+									updated_at) 
+									VALUES (? , ? , ? , ?, ? , ? ,? , ? , ? , ? )";
+$stmtDEST = $PDO_DEST->prepare($queryInsert);
+
+$commitData = [];
+$allInsertCount = 0;
+$allSrcCount = 0;
+$count = 0;
+
+#从user数据表中读取
+$query = "SELECT id  FROM ".$user_table." WHERE userid = ? ";
+$stmtUser = $PDO_USER->prepare($query);
+
+    #删除目标数据表中全部数据
+    fwrite(STDOUT,"delete dest".PHP_EOL);
+
+    $query = "delete from $dest_table ";
+    $stmtDest = $PDO_DEST->prepare($query);
+    $stmtDest->execute();
+    
+#从源数据表中读取
+$query = "SELECT *  FROM ".$src_table;
+$stmtSrc = $PDO_SRC->prepare($query);
+$stmtSrc->execute();
+while($srcData = $stmtSrc->fetch(PDO::FETCH_ASSOC)){
+	$allSrcCount++;
+
+if($srcData["cooperator_type"]==0){
+    if($srcData["cooperator_id"]=='visuddhinanda'){
+		$srcData["cooperator_id"] = 'ba5463f3-72d1-4410-858e-eadd10884713';
+	}
+    if($srcData["cooperator_id"]=='test7'){
+		$srcData["cooperator_id"] = '6bd2f4d7-d970-419c-8ee5-f4bac42f4bc1';
+	}
+    if($srcData["cooperator_id"]=='Dhammadassi'){
+		$srcData["cooperator_id"] = 'd8538ebd-d369-4777-b99a-3ccb1aff8bfc';
+	}
+    if($srcData["cooperator_id"]=='pannava'){
+		$srcData["cooperator_id"] = '4db550c4-bc1b-43f2-a518-2740cb478f37';
+	}
+    if($srcData["cooperator_id"]=='NST'){
+		$srcData["cooperator_id"] = '5c23e629-56a3-48e9-97c7-2af73b59c3b9';
+	}
+    if($srcData["cooperator_id"]=='viranyani'){
+		$srcData["cooperator_id"] = 'C1AB2ABF-EAA8-4EEF-B4D9-3854321852B4';
+	}
+    if($srcData["cooperator_id"]=='test6'){
+		$srcData["cooperator_id"] = 'f81c7140-64b4-4025-b58c-45a3b386324a';
+	}
+	if($srcData["cooperator_id"]=='test28'){
+		$srcData["cooperator_id"] = 'df0ad9bc-c0cd-4cd9-af05-e43d23ed57f0';
+	}
+	if($srcData["cooperator_id"]=='290fd808-2f46-4b8c-b300-0367badd67ed'){
+		$srcData["cooperator_id"] = 'f81c7140-64b4-4025-b58c-45a3b386324a';
+	}
+	if($srcData["cooperator_id"]=='BA837178-9ABD-4DD4-96A0-D2C21B756DC4'){
+		$srcData["cooperator_id"] = 'ba5463f3-72d1-4410-858e-eadd10884713';
+	}
+	$stmtUser->execute(array($srcData["cooperator_id"]));
+	$userId = $stmtUser->fetch(PDO::FETCH_ASSOC);
+	if(!$userId){
+		fwrite(STDERR,time()."error,no user id {$srcData["cooperator_id"]}".PHP_EOL);
+		continue;
+	}
+}
+
+
+	if(strlen($srcData["cooperator_id"])>36){
+		fwrite(STDERR,time().",error,user id too long {$srcData["cooperator_id"]}".PHP_EOL);
+		continue;	
+	}
+
+
+    if($srcData["create_time"] < 15987088320){
+        $srcData["create_time"] *= 1000;
+    }
+    if($srcData["modify_time"] < 15987088320){
+        $srcData["modify_time"] *= 1000;
+    }
+
+
+	#插入目标表
+	$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["res_id"],
+			$srcData["res_type"],
+			$srcData["cooperator_id"],
+			$srcData["cooperator_type"],
+			$srcData["power"],
+			$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);
+
+
+
+