Advertisement
Guest User

Untitled

a guest
Jun 10th, 2019
194
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.18 KB | None | 0 0
  1. 'use strict';
  2.  
  3. var mongo = require('mongodb');
  4. var fs = require('fs');
  5.  
  6. var cachedDb;
  7. var cachedClient;
  8. var cachedBoards;
  9. var cachedPosts;
  10. var cachedThreads;
  11.  
  12. function lookForThreads(boardUri, relation, callback) {
  13.  
  14. cachedThreads.find({
  15. boardUri : boardUri,
  16. threadId : {
  17. $in : Object.keys(relation).map(function(element) {
  18. return +element;
  19. })
  20. }
  21. }, {
  22. projection : {
  23. _id : 0,
  24. threadId : 1
  25. }
  26. }).toArray(function(error, results) {
  27.  
  28. if (error) {
  29. return callback(error);
  30. }
  31.  
  32. for (var i = 0; i < results.length; i++) {
  33. delete relation[results[i].threadId];
  34. }
  35.  
  36. callback();
  37.  
  38. });
  39.  
  40. }
  41.  
  42. function processBoard(boardUri, results, callback, index) {
  43.  
  44. index = index || 0;
  45.  
  46. cachedPosts.find({
  47. boardUri : boardUri
  48. }, {
  49. projection : {
  50. threadId : 1,
  51. _id : 0,
  52. postId : 1
  53. }
  54. }).sort({
  55. _id : 1
  56. }).skip(index * 100).limit(100).toArray(function(error, foundPosts) {
  57.  
  58. if (error || !foundPosts.length) {
  59. return callback(error);
  60. }
  61.  
  62. var relation = results[boardUri] || {};
  63. results[boardUri] = relation;
  64.  
  65. for (var i = 0; i < foundPosts.length; i++) {
  66.  
  67. var post = foundPosts[i];
  68.  
  69. var threadList = relation[post.threadId] || [];
  70.  
  71. relation[post.threadId] = threadList;
  72.  
  73. threadList.push(post.postId);
  74.  
  75. }
  76.  
  77. lookForThreads(boardUri, relation, function(error) {
  78.  
  79. if (error) {
  80. return callback(error);
  81. }
  82.  
  83. processBoard(boardUri, results, callback, ++index);
  84.  
  85. });
  86.  
  87. });
  88.  
  89. }
  90.  
  91. function initCheck(callback, toSkip, results) {
  92.  
  93. toSkip = toSkip || 0;
  94. results = results || {};
  95.  
  96. cachedBoards.find().sort({
  97. _id : 1
  98. }).skip(toSkip).toArray(function(error, list) {
  99.  
  100. if (error) {
  101. callback(error);
  102. } else if (!list.length) {
  103. callback(null, results);
  104. } else {
  105.  
  106. processBoard(list[0].boardUri, results, function(error) {
  107.  
  108. if (error) {
  109. callback(error);
  110. } else {
  111. initCheck(callback, ++toSkip, results);
  112. }
  113.  
  114. });
  115.  
  116. }
  117.  
  118. });
  119.  
  120. }
  121.  
  122. function connect(connectString, dbToUse, callback, attempts) {
  123.  
  124. attempts = attempts || 0;
  125.  
  126. mongo.MongoClient.connect(connectString, {
  127. useNewUrlParser : true
  128. }, function connectedDb(error, client) {
  129.  
  130. if (error) {
  131.  
  132. if (attempts > 9) {
  133. callback(error);
  134. } else {
  135.  
  136. console.log(error);
  137. console.log('Retrying in 10 seconds');
  138.  
  139. setTimeout(function() {
  140. connect(connectString, dbToUse, callback, ++attempts);
  141. }, 10000);
  142. }
  143.  
  144. } else {
  145.  
  146. cachedClient = client;
  147. cachedDb = client.db(dbToUse);
  148.  
  149. cachedBoards = cachedDb.collection('boards');
  150. cachedPosts = cachedDb.collection('posts');
  151. cachedThreads = cachedDb.collection('threads');
  152.  
  153. initCheck(callback);
  154. }
  155.  
  156. });
  157.  
  158. }
  159.  
  160. function init(callback) {
  161.  
  162. var dbSettings = JSON.parse(fs.readFileSync(__dirname + '/settings/db.json'));
  163.  
  164. var connectString = 'mongodb://';
  165.  
  166. if (dbSettings.user) {
  167. connectString += dbSettings.user + ':' + dbSettings.password + '@';
  168. }
  169.  
  170. connectString += dbSettings.address + ':';
  171. connectString += dbSettings.port + '/' + dbSettings.db;
  172.  
  173. if (dbSettings.ssl) {
  174. connectString += '?ssl=true';
  175. }
  176.  
  177. connect(connectString, dbSettings.db, callback);
  178.  
  179. }
  180.  
  181. init(function(error, results) {
  182.  
  183. if (error) {
  184. console.log(error);
  185. } else {
  186.  
  187. console.log(JSON.stringify(results, null, 2));
  188.  
  189. var orList = [];
  190.  
  191. for ( var key in results) {
  192.  
  193. var threadList = Object.keys(results[key]).map(function(element) {
  194. return +element;
  195. });
  196.  
  197. if (!threadList.length) {
  198. continue;
  199. }
  200.  
  201. orList.push({
  202. boardUri : key,
  203. threadId : {
  204. $in : threadList
  205. }
  206. });
  207.  
  208. }
  209.  
  210. if (!orList.length) {
  211. return cachedClient.close();
  212. }
  213.  
  214. cachedPosts.deleteMany({
  215. $or : orList
  216. }, function(error, result) {
  217.  
  218. if (error) {
  219. console.log(error);
  220. }
  221.  
  222. cachedClient.close();
  223. });
  224.  
  225. }
  226.  
  227. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement