Warning: session_start(): open(/var/lib/php/sessions/sess_pghihkgh59sbftm6r06lp71cul, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning: session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
!7
static double updateInterval = 60;
sbool infoBoxes;
!include once #1014750 // CSnippet
static Thread downloadThread;
p-subst {
//restartWith384MBHeap(); // for xfullgrab
autoRestart10Mins();
mainConcepts.autoSaveInterval = 1000*60; // every minute
mainConcepts.noXFullGrab = true;
dbIndexing(CSnippet, 'id);
for (CSnippet s) s.legacyCompaction();
botWithCommandList("Snippets.");
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;
}
});
}