PageRenderTime 22ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/scripts/Traum/cv_traum.php

https://gitlab.com/roman-davydov/myrulib
PHP | 253 lines | 218 code | 28 blank | 7 comment | 31 complexity | 4771e7205131a1f2a140e312cbf74272 MD5 | raw file
  1. <?php
  2. require_once '../Common/datafile.php';
  3. require_once '../Common/genres.php';
  4. require_once '../Common/strutils.php';
  5. function utf($string)
  6. {
  7. return iconv("WINDOWS-1251", "UTF-8", $string);
  8. }
  9. function letter($string)
  10. {
  11. $char_list = 'А Б В Г Д Е Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ы Э Ю Я A B C D E F G H I J K L M N O P Q R S T U V W X Y Z';
  12. $letter = utf8_substr($string,0,1);
  13. $letter = strtoupperEx($letter,0,1);
  14. if (strpos($char_list, $letter) === false) { $letter = "#"; };
  15. return $letter;
  16. }
  17. function convert_auth($sqlite_db, $min)
  18. {
  19. $sqlite_db->query("begin transaction;");
  20. $sqlite_db->query("DELETE FROM authors");
  21. $handle = fopen("db/author", "r");
  22. while (!feof($handle)) {
  23. $buffer = Trim(fgets($handle, 4096),"\n\r");
  24. if(empty($buffer{0})) continue;
  25. $fields = explode(chr(9), $buffer);
  26. $id = $fields[0];
  27. $names = explode(",", $fields[1].",");
  28. $last_name = utf(trim($names[0]));
  29. $first_name = utf(trim($names[1]));
  30. $middle_name = utf(trim($fields[2]));
  31. $full_name = trim(trim($last_name." ".$first_name)." ".$middle_name);
  32. $letter = letter($full_name);
  33. $numb = $fields[5];
  34. echo "Auth: ".$letter." - ".$id." - ".$full_name."\n";
  35. $sql = "INSERT INTO authors (id, number, letter, full_name, first_name, middle_name, last_name) VALUES(?,?,?,?,?,?,?)";
  36. $insert = $sqlite_db->prepare($sql);
  37. $insert->execute(array($id, $numb, $letter, $full_name, $first_name, $middle_name, $last_name));
  38. }
  39. fclose($handle);
  40. $sqlite_db->query("commit;");
  41. }
  42. function convert_seqn($sqlite_db, $min)
  43. {
  44. $sqlite_db->query("begin transaction;");
  45. $sqlite_db->query("DELETE FROM sequences");
  46. $sqlite_db->query("CREATE TEMP TABLE temp_seqn(id integer primary key, value text)");
  47. $handle = fopen("db/series", "r");
  48. while (!feof($handle)) {
  49. $buffer = Trim(fgets($handle, 4096),"\n\r");
  50. if(empty($buffer{0})) continue;
  51. $fields = explode(chr(9), $buffer);
  52. $code = $fields[0];
  53. $name = utf(trim($fields[1]));
  54. echo "Seqn: ".$code." - ".$name."\n";
  55. $sql = "INSERT INTO temp_seqn(id, value) VALUES(?,?)";
  56. $insert = $sqlite_db->prepare($sql);
  57. $insert->execute(array($code, $name));
  58. }
  59. fclose($handle);
  60. $sql = "INSERT INTO sequences(id, value, number) SELECT id, value, COUNT(DISTINCT id_book) FROM temp_seqn LEFT JOIN bookseq ON id_seq=id GROUP BY id, value";
  61. $sqlite_db->query($sql);
  62. $sqlite_db->query("commit;");
  63. }
  64. function convert_book($sqlite_db, $min)
  65. {
  66. $sqlite_db->query("begin transaction;");
  67. $sqlite_db->query("DELETE FROM books");
  68. $handle = fopen("db/book", "r");
  69. while (!feof($handle)) {
  70. $buffer = Trim(fgets($handle, 4096),"\n\r");
  71. if(empty($buffer{0})) continue;
  72. $fields = explode(chr(9), $buffer);
  73. $book = $fields[0];
  74. $auth = $fields[1];
  75. $title = utf(trim($fields[2]));
  76. $lang = utf(trim($fields[3]));
  77. $seqn = $fields[4];
  78. $numb = $fields[5];
  79. $year = $fields[6];
  80. $arch = utf(trim(str_replace("\\","/",$fields[8]))).utf(trim($fields[9])).".zip";
  81. $file = utf(trim($fields[9]));
  82. $type = substr(strrchr($file, '.'), 1);
  83. $size = $fields[10];
  84. $arsz = $fields[11];
  85. $date = $fields[12];
  86. $crc32 = $fields[13];
  87. if ($date > 2000000) $date = $date - 20000000;
  88. echo "Book: ".$book." - ".$type." - ".$title."\n";
  89. $sql = "INSERT INTO books(id, id_archive, id_author, title, file_name, file_size, file_type, genres, created, lang, year, md5sum) VALUES(?,?,?,?,?,?,?,?,?,?,?,?)";
  90. $insert = $sqlite_db->prepare($sql);
  91. $insert->execute(array($book, $book, $auth, $title, $file, $size, $type, NULL, $date, $lang, $year, $crc32));
  92. $sql = "INSERT INTO archives(id, file_name, file_size, file_count) VALUES(?,?,?,1)";
  93. $insert = $sqlite_db->prepare($sql);
  94. $insert->execute(array($book, $arch, $arsz));
  95. if ($seqn != 0) {
  96. $sql = "INSERT INTO bookseq(id_book, id_seq, number) VALUES(?,?,?)";
  97. $insert = $sqlite_db->prepare($sql);
  98. $insert->execute(array($book, $seqn, $numb));
  99. }
  100. }
  101. fclose($handle);
  102. }
  103. function convert_genr($sqlite_db, $min)
  104. {
  105. $sqlite_db->query("begin transaction;");
  106. $sqlite_db->query("DELETE FROM genres");
  107. $prior = 0;
  108. $fields = "";
  109. $genres = "";
  110. $handle = fopen("db/booktags", "r");
  111. while (true) {
  112. if (feof($handle)) {
  113. $book = 0;
  114. } else {
  115. $buffer = Trim(fgets($handle, 4096),"\n\r");
  116. if(empty($buffer{0})) continue;
  117. $fields = explode(chr(9), $buffer);
  118. $book = $fields[0];
  119. $code = Trim($fields[1]);
  120. $code = Trim($code,"\n\r");
  121. $char = GenreCode($code);
  122. }
  123. if ($prior && $book != $prior) {
  124. echo "Genr: ".$prior." - ".$genres."\n";
  125. $sql = "UPDATE books SET genres=? WHERE id=?";
  126. $insert = $sqlite_db->prepare($sql);
  127. $insert->execute(array($genres, $prior));
  128. $genres = "";
  129. }
  130. if (feof($handle)) break;
  131. if (!empty($char{0})) {
  132. echo "Genr: ".$book." - ".$char." - ".$code."\n";
  133. $sql = "INSERT INTO genres(id_book, id_genre) VALUES(?,?)";
  134. $insert = $sqlite_db->prepare($sql);
  135. $insert->execute(array($book, $char));
  136. $genres = $genres.$char;
  137. }
  138. $prior = $book;
  139. }
  140. fclose($handle);
  141. $sqlite_db->query("commit;");
  142. }
  143. function convert_info($sqlite_db, $min)
  144. {
  145. $sqlite_db->query("begin transaction;");
  146. $text = "";
  147. $prior = 0;
  148. $handle = fopen("db/bookanno", "r");
  149. while (true) {
  150. if (feof($handle)) {
  151. $book = -1;
  152. } else {
  153. $buffer = Trim(fgets($handle, 4096),"\n\r");
  154. if(empty($buffer{0})) continue;
  155. $fields = explode(chr(9), $buffer);
  156. $book = $fields[0];
  157. }
  158. if ($prior && $book != $prior) {
  159. while (substr($text, 0, 2)=="\\n") $text=substr($text, 2);
  160. while (substr($text, -2)=="\\n") $text=substr($text, 0, -2);
  161. $text = str_replace("\\n\\n", "\n", $text);
  162. $text = str_replace("\\n", "</p><p>", $text);
  163. $text = "<p>".$text."</p>";
  164. echo "Info: ".$prior." - ".substr($text, 0, 50)."\n";
  165. $sql = "UPDATE books SET description=? where id=?";
  166. $insert = $sqlite_db->prepare($sql);
  167. $insert->execute(array($text, $prior));
  168. $text = utf(trim($fields[1]));
  169. } else if ($book) {
  170. $text = $text."\\n".utf(trim($fields[1]));
  171. }
  172. if (feof($handle)) break;
  173. $prior = $book;
  174. }
  175. fclose($handle);
  176. $sqlite_db->query("commit;");
  177. }
  178. function convert_date($sqlite_db, $min)
  179. {
  180. $sqlite_db->query("begin transaction;");
  181. $sqlite_db->query("DELETE FROM dates");
  182. $sql = "INSERT INTO dates (id, lib_min, lib_max, lib_num) SELECT created, MIN(id), MAX(id), COUNT(DISTINCT id) FROM books GROUP BY created";
  183. $insert = $sqlite_db->query($sql);
  184. $sqlite_db->query("commit;");
  185. }
  186. function setup_params($sqlite_db, $date, $type)
  187. {
  188. $sqlite_db->query("begin transaction;");
  189. $sqlite_db->query("DELETE FROM params;");
  190. $sqlite_db->query("INSERT INTO params(id,text) VALUES (1, 'Traum library');");
  191. $sqlite_db->query("INSERT INTO params(id,value) VALUES (2, 1);");
  192. $sqlite_db->query("INSERT INTO params(id,text) VALUES (3, 'TRAUM');");
  193. $sqlite_db->query("INSERT INTO params(id,text) VALUES (11, 'traumlibrary.net');");
  194. $sqlite_db->query("INSERT INTO params(id,value) VALUES (20, $date);");
  195. $sqlite_db->query("INSERT INTO params(id,text) VALUES (21, '$type');");
  196. $sqlite_db->query("commit;");
  197. }
  198. function FullImport($file, $date)
  199. {
  200. $sqlite_db = new PDO('sqlite:./'.$file);
  201. create_tables($sqlite_db);
  202. setup_params($sqlite_db, $date, "FULL");
  203. convert_auth($sqlite_db, 0);
  204. convert_book($sqlite_db, 0);
  205. convert_seqn($sqlite_db, 0);
  206. convert_date($sqlite_db, 0);
  207. convert_genr($sqlite_db, 0);
  208. convert_info($sqlite_db, 0);
  209. create_indexes($sqlite_db);
  210. /*
  211. convert_sequences($mysql_db, $sqlite_db, 0);
  212. convert_dates($mysql_db, $sqlite_db, 0);
  213. convert_zips($mysql_db, $sqlite_db, 0);
  214. convert_files($mysql_db, $sqlite_db, 0, 0);
  215. */
  216. }
  217. $sqlitefile = 'myrulib.db';
  218. $date = date('Ymd');
  219. echo "Today: ".$date."\n";
  220. system("rm $sqlitefile");
  221. $sqlite_db = new PDO('sqlite:'.$sqlitefile);
  222. FullImport($sqlitefile, $date);
  223. system("zip traumlib.db.zip $sqlitefile");
  224. ?>