!7 static double updateInterval = 60; sbool infoBoxes, fullUpdateAtStart = true; sbool snippetsDB_inited; !include once #1014750 // CSnippet static Thread downloadThread; p-subst { //restartWith384MBHeap(); // for xfullgrab autoRestart10Mins(); snippetsDB_init(); } svoid snippetsDB_init() { lock programLock(); if (snippetsDB_inited) ret; set snippetsDB_inited; mainConcepts.autoSaveInterval = 1000*60; // every minute mainConcepts.noXFullGrab = true; dbIndexing(CSnippet, 'id); for (CSnippet s) s.legacyCompaction(); botWithCommandList("Snippets."); if (fullUpdateAtStart) fullDownload(); doEvery(0, updateInterval, f update); } svoid fullDownload { L l = listAllSnippets(); printWithTime(n(l, "snippet") + " on server"); slurp(l); downloadSomeText(); } static int slurp(L l) { lock dbLock(); int changes = 0; for (Snippet s : l) { CSnippet cs = uniq(CSnippet, id := parseSnippetID(s.id)); changes += cset(cs, title := s.title, type := s.type); if (neq(cs.md5, s.md5)) changes += cset(cs, md5 := s.md5, text := null); } S text = n2(changes, "changed snippet"); if (infoBoxes && changes != 0) infoBox(text); printWithTime(text); ret changes; } // with text svoid update { L l = listRecentlyChangedSnippets(); printWithTime(n(l, "snippet") + " on server"); slurp(l); downloadSomeText(); } answer { lock dbLock(); if "full download" { fullDownload(); ret "OK, have " + n(countConcepts(CSnippet), "snippet"); } if "update" { update(); ret "OK"; } if "download some text" { if (downloadThread != null) ret "Already downloading"; downloadSomeText(); ret "Yo"; } if "stop downloading" { cancelThread(downloadThread); downloadThread = null; ret "OK"; } if "get snippet text *" { CSnippet c = findConcept(CSnippet, id := parseSnippetID($1)); if (c == null) ret "not found"; downloadText(c); ret "OK " + quote(c.text()); } if "count" ret n2(countConcepts(CSnippet), "snippet"); if "all snippet ids" ret struct(map fsI(sorted(collect(CSnippet, 'id)))); if "kill" { cleanKillIn1(); ret "OK"; } } svoid downloadText(CSnippet s) { if (s.text != null) ret; cset(s, text := eq(s.md5, emptyMD5()) ? "" : toUtf8(loadSnippet(s.id))); } svoid downloadSomeText { lock dbLock(); if (downloadThread != null) ret; downloadThread = startThread(r { try { int n = 0; for (CSnippet s) if (s.text != null) ++n; printWithTime("Have text for " + n + "/" + n(countConcepts(CSnippet), "concept"); new ConcurrentEvaluator e; e.coresToUse = 10; for (final CSnippet s) { ping(); if (s.text == null) e.add(r { ping(); downloadText(s); /*++n; if ((n % 100) == 0) printWithTime("Have text for " + n + "/" + n(countConcepts(CSnippet), "concept");*/ }); } e.startWaitCleanUp(); } finally { downloadThread = null; } }); }