fork.php 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. <?php
  2. /*
  3. *
  4. *
  5. */
  6. require_once "../public/_pdo.php";
  7. require_once "../public/function.php";
  8. require_once "../path.php";
  9. if($_COOKIE["uid"]){
  10. $uid=$_COOKIE["uid"];
  11. }
  12. else{
  13. echo "尚未登录";
  14. echo "<h3><a href='../ucenter/index.php?op=login'>登录</a>后才可以打开文档 </h3>";
  15. exit;
  16. }
  17. PDO_Connect("sqlite:"._FILE_DB_FILEINDEX_);
  18. if(isset($_GET["doc_id"])){
  19. $doc_id=$_GET["doc_id"];
  20. $query = "select * from fileindex where id='{$doc_id}' ";
  21. $Fetch = PDO_FetchAll($query);
  22. $iFetch=count($Fetch);
  23. if($iFetch>0){
  24. //文档信息
  25. $orgFileInfo = $Fetch[0];
  26. $owner=$Fetch[0]["user_id"];
  27. $filename=$Fetch[0]["file_name"];
  28. $title=$Fetch[0]["title"];
  29. $tag=$Fetch[0]["tag"];
  30. $mbook=$Fetch[0]["book"];
  31. $paragraph=$Fetch[0]["paragraph"];
  32. if($owner==$uid){
  33. //自己的文档
  34. echo "这是自己的文档,不能复刻。";
  35. }
  36. else{
  37. //别人的文档
  38. //查询自己是否以前打开过
  39. $query = "select * from fileindex where parent_id='{$doc_id}' and user_id='{$uid}' ";
  40. $FetchSelf = PDO_FetchAll($query);
  41. $iFetchSelf=count($FetchSelf);
  42. if($iFetchSelf>0){
  43. //以前打开过
  44. echo "文档已经复刻";
  45. echo "正在<a href='../studio/editor.php?op=opendb&doc_id={$doc_id}'>打开</a>文档";
  46. echo "<script>";
  47. echo "window.location.assign(\"../studio/editor.php?op=opendb&doc_id={$doc_id}\");";
  48. echo "</script>";
  49. }
  50. else{
  51. //以前没打开过
  52. echo "<h3>共享的文档,正在fork...</h3>";
  53. echo "<div style='display:none;'>";
  54. //获取文件路径
  55. PDO_Connect("sqlite:"._FILE_DB_USERINFO_);
  56. $query = "select userid from user where id='{$owner}'";
  57. $FetchUid = PDO_FetchOne($query);
  58. if($FetchUid){
  59. //$source=$dir_user_base.$FetchUid.$dir_mydocument.$filename;
  60. //$dest=$dir_user_base.$userid.$dir_mydocument.$filename;
  61. //复制数据
  62. //打开逐词解析数据库
  63. $dns = "sqlite:"._FILE_DB_USER_WBW_;
  64. $dbhWBW = new PDO($dns, "", "",array(PDO::ATTR_PERSISTENT=>true));
  65. $dbhWBW->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
  66. //打开译文数据库
  67. $dns = "sqlite:"._FILE_DB_SENTENCE_;
  68. $dbhSent = new PDO($dns, "", "",array(PDO::ATTR_PERSISTENT=>true));
  69. $dbhSent->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
  70. //逐词解析新数据数组
  71. $arrNewBlock = array();
  72. $arrNewBlockData = array();
  73. $arrBlockTransform = array();
  74. //译文新数据数组
  75. $arrSentNewBlock = array();
  76. $arrSentNewBlockData = array();
  77. $arrSentBlockTransform = array();
  78. $newDocBlockList=array();
  79. $blocks = json_decode($Fetch[0]["doc_block"]);
  80. for ($i=0;$i<count($blocks);$i++) {
  81. switch($blocks[$i]->type){
  82. case 1:
  83. break;
  84. case 2:
  85. //译文
  86. $blockid = $blocks[$i]->block_id;
  87. $query = "select * from sent_block where id= ? ";
  88. $stmt = $dbhSent->prepare($query);
  89. $stmt->execute(array($blockid));
  90. $fBlock = $stmt->fetchAll(PDO::FETCH_ASSOC);
  91. $newBlockId = UUID::V4();
  92. $newDocBlockList[]=array('type' => 2,'block_id' => $newBlockId);
  93. $arrSentBlockTransform[$fBlock[0]["id"]] = $newBlockId;
  94. if(count($fBlock)>0){
  95. array_push( $arrSentNewBlock,array($newBlockId,
  96. $fBlock[0]["id"],
  97. $fBlock[0]["book"],
  98. $fBlock[0]["paragraph"],
  99. $_COOKIE["userid"],
  100. $fBlock[0]["lang"],
  101. $fBlock[0]["author"],
  102. $fBlock[0]["editor"],
  103. $fBlock[0]["tag"],
  104. $fBlock[0]["status"],
  105. mTime(),
  106. mTime()
  107. ));
  108. }
  109. $query = "select * from sentence where block_id= ? ";
  110. $stmtSent = $dbhSent->prepare($query);
  111. $stmtSent->execute(array($fBlock[0]["id"]));
  112. $fBlockData = $stmtSent->fetchAll(PDO::FETCH_ASSOC);
  113. foreach($fBlockData as $value){
  114. array_push( $arrSentNewBlockData,array(UUID::V4(),
  115. $arrSentBlockTransform[$value["block_id"]],
  116. $value["book"],
  117. $value["paragraph"],
  118. $value["begin"],
  119. $value["end"],
  120. $value["tag"],
  121. $value["author"],
  122. $_COOKIE["userid"],
  123. $value["text"],
  124. $value["language"],
  125. $value["ver"],
  126. $value["status"],
  127. mTime(),
  128. mTime()
  129. ));
  130. }
  131. break;
  132. case 3:
  133. break;
  134. case 4:
  135. break;
  136. case 5:
  137. break;
  138. case 6:
  139. $blockid = $blocks[$i]->block_id;
  140. $query = "select * from wbw_block where id= ? ";
  141. $stmt = $dbhWBW->prepare($query);
  142. $stmt->execute(array($blockid));
  143. $fBlock = $stmt->fetchAll(PDO::FETCH_ASSOC);
  144. $newBlockId = UUID::V4();
  145. $newDocBlockList[]=array('type' => 6,'block_id' => $newBlockId);
  146. $arrBlockTransform[$fBlock[0]["id"]] = $newBlockId;
  147. if(count($fBlock)>0){
  148. array_push( $arrNewBlock,array($newBlockId,
  149. $fBlock[0]["id"],
  150. $_COOKIE["userid"],
  151. $fBlock[0]["book"],
  152. $fBlock[0]["paragraph"],
  153. $fBlock[0]["style"],
  154. $fBlock[0]["lang"],
  155. $fBlock[0]["status"],
  156. mTime(),
  157. mTime()
  158. ));
  159. }
  160. $query = "select * from wbw where block_id= ? ";
  161. $stmtWBW = $dbhWBW->prepare($query);
  162. $stmtWBW->execute(array($fBlock[0]["id"]));
  163. $fBlockData = $stmtWBW->fetchAll(PDO::FETCH_ASSOC);
  164. foreach($fBlockData as $value){
  165. array_push( $arrNewBlockData,array(UUID::V4(),
  166. $arrBlockTransform[$value["block_id"]],
  167. $value["book"],
  168. $value["paragraph"],
  169. $value["wid"],
  170. $value["word"],
  171. $value["data"],
  172. mTime(),
  173. mTime(),
  174. $value["status"],
  175. $_COOKIE["userid"]
  176. ));
  177. }
  178. break;
  179. case 2:
  180. break;
  181. }
  182. }
  183. //逐词解析block数据块
  184. if(count($arrNewBlock)>0){
  185. $dbhWBW->beginTransaction();
  186. $query="INSERT INTO wbw_block ('id','parent_id','owner','book','paragraph','style','lang','status','modify_time','receive_time') VALUES (?,?,?,?,?,?,?,?,?,?)";
  187. $stmtNewBlock = $dbhWBW->prepare($query);
  188. foreach($arrNewBlock as $oneParam){
  189. //print_r($oneParam);
  190. $stmtNewBlock->execute($oneParam);
  191. }
  192. // 提交更改
  193. $dbhWBW->commit();
  194. if (!$stmtNewBlock || ($stmtNewBlock && $stmtNewBlock->errorCode() != 0)) {
  195. $error = $dbhWBW->errorInfo();
  196. echo "error - $error[2] <br>";
  197. }
  198. else{
  199. //逐词解析block块复刻成功
  200. $count=count($arrNewBlock);
  201. echo "wbw block $count recorders.<br/>";
  202. }
  203. }
  204. if(count($arrNewBlockData)>0){
  205. // 开始一个事务,逐词解析数据 关闭自动提交
  206. $dbhWBW->beginTransaction();
  207. $query="INSERT INTO wbw ('id','block_id','book','paragraph','wid','word','data','modify_time','receive_time','status','owner') VALUES (?,?,?,?,?,?,?,?,?,?,?)";
  208. $stmtWbwData = $dbhWBW->prepare($query);
  209. foreach($arrNewBlockData as $oneParam){
  210. $stmtWbwData->execute($oneParam);
  211. }
  212. // 提交更改
  213. $dbhWBW->commit();
  214. if (!$stmtWbwData || ($stmtWbwData && $stmtWbwData->errorCode() != 0)) {
  215. $error = $dbhWBW->errorInfo();
  216. echo "error - $error[2] <br>";
  217. }
  218. else{
  219. //逐词解析 数据 复刻成功
  220. $count=count($arrNewBlockData);
  221. echo "new wbw $count recorders.";
  222. }
  223. }
  224. //译文 block数据块
  225. if(count($arrSentNewBlock)>0){
  226. $dbhSent->beginTransaction();
  227. $query="INSERT INTO sent_block ('id','parent_id','book','paragraph','owner','lang','author','editor','tag','status','modify_time','receive_time') VALUES (?,?,?,?,?,?,?,?,?,?,?,?)";
  228. $stmtSentNewBlock = $dbhSent->prepare($query);
  229. foreach($arrSentNewBlock as $oneParam){
  230. //print_r($oneParam);
  231. $stmtSentNewBlock->execute($oneParam);
  232. }
  233. // 提交更改
  234. $dbhSent->commit();
  235. if (!$stmtSentNewBlock || ($stmtSentNewBlock && $stmtSentNewBlock->errorCode() != 0)) {
  236. $error = $dbhSent->errorInfo();
  237. echo "error - $error[2] <br>";
  238. }
  239. else{
  240. //译文 block块复刻成功
  241. $count=count($arrNewBlock);
  242. echo "wbw block $count recorders.<br/>";
  243. }
  244. }
  245. if(count($arrSentNewBlockData)>0){
  246. // 开始一个事务,逐词解析数据 关闭自动提交
  247. $dbhSent->beginTransaction();
  248. $query="INSERT INTO sentence ('id','block_id','book','paragraph','begin','end','tag','author','editor','text','language','ver','status','modify_time','receive_time') VALUES (? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ?, ?)";
  249. $stmtSentData = $dbhSent->prepare($query);
  250. foreach($arrSentNewBlockData as $oneParam){
  251. $stmtSentData->execute($oneParam);
  252. }
  253. // 提交更改
  254. $dbhSent->commit();
  255. if (!$stmtSentData || ($stmtSentData && $stmtSentData->errorCode() != 0)) {
  256. $error = $dbhSent->errorInfo();
  257. echo "error - $error[2] <br>";
  258. }
  259. else{
  260. //译文 数据 复刻成功
  261. $count=count($arrSentNewBlockData);
  262. echo "new translation $count recorders.";
  263. }
  264. }
  265. //插入记录到文件索引
  266. $filesize=0;
  267. //服务器端文件列表
  268. PDO_Connect("sqlite:"._FILE_DB_FILEINDEX_);
  269. $query="INSERT INTO fileindex ('id',
  270. 'parent_id',
  271. 'user_id',
  272. 'book',
  273. 'paragraph',
  274. 'file_name',
  275. 'title',
  276. 'tag',
  277. 'status',
  278. 'create_time',
  279. 'modify_time',
  280. 'accese_time',
  281. 'file_size',
  282. 'share',
  283. 'doc_info',
  284. 'doc_block',
  285. 'receive_time'
  286. )
  287. VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
  288. $stmt = $PDO->prepare($query);
  289. $newDocId = UUID::v4();
  290. $newDocInfo = $orgFileInfo;
  291. $newDocInfo["id"] = $newDocId;
  292. $newDocInfo["parent_id"] = $orgFileInfo["id"];
  293. $newDocInfo["user_id"] = $_COOKIE["uid"];
  294. $newDocInfo["doc_block"] = json_encode($newDocBlockList, JSON_UNESCAPED_UNICODE);
  295. $newData=array($newDocInfo["id"],
  296. $newDocInfo["parent_id"],
  297. $newDocInfo["user_id"],
  298. $newDocInfo["book"],
  299. $newDocInfo["paragraph"],
  300. $newDocInfo["file_name"],
  301. $newDocInfo["title"],
  302. $newDocInfo["tag"],
  303. $newDocInfo["status"],
  304. mTime(),
  305. mTime(),
  306. mTime(),
  307. $newDocInfo["file_size"],
  308. $newDocInfo["share"],
  309. $newDocInfo["doc_info"],
  310. $newDocInfo["doc_block"],
  311. mTime()
  312. );
  313. $stmt->execute($newData);
  314. if (!$stmt || ($stmt && $stmt->errorCode() != 0)) {
  315. $error = PDO_ErrorInfo();
  316. echo "error - $error[2] <br>";
  317. }
  318. else{
  319. //文档列表插入成功
  320. echo "doc list updata 1 recorders.";
  321. echo "</div>";
  322. echo "<h3>复刻成功</h3>";
  323. echo "正在<a href='../studio/editor.php?op=opendb&doc_id={$newDocId}'>打开</a>文档";
  324. echo "<script>";
  325. echo "window.location.assign(\"../studio/editor.php?op=opendb&fileid={$newDocId}\");";
  326. echo "</script>";
  327. }
  328. }
  329. else{
  330. echo "无效的文档id";
  331. }
  332. }
  333. }
  334. }
  335. }
  336. ?>