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
concept CSnippet {
long id;
S type;
S title, md5, text;
}
static Thread downloadThread;
p {
mainConcepts.autoSaveInterval = 1000*60; // every minute
dbIndexing(CSnippet, 'id);
bot("Snippets.");
}
svoid fullDownload {
L l = listAllSnippets();
print(n(l, "snippet") + " on server");
slurp(l);
}
static int slurp(L l) {
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);
}
print(n(changes, "change"));
ret changes;
}
svoid update {
L l = listRecentlyChangedSnippets();
print(n(l, "snippet") + " on server");
slurp(l);
downloadSomeTextInParallel();
}
answer {
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";
downloadSomeTextInParallel();
ret "Yo";
}
if "download some text serially" {
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);
}
}
svoid downloadText(CSnippet s) {
if (s.text != null) ret;
cset(s, text := eq(s.md5, emptyMD5()) ? "" : loadSnippet(s.id));
}
svoid downloadSomeText {
downloadThread = startThread(r {
try {
int n = 0; for (CSnippet s) if (s.text != null) ++n;
print("Have text for " + n + "/" + n(countConcepts(CSnippet), "concept");
for (final CSnippet s) {
ping();
if (s.text == null) {
downloadText(s);
++n;
if ((n % 100) == 0)
print("Have text for " + n + "/" + n(countConcepts(CSnippet), "concept");
}
}
} finally {
downloadThread = null;
}
});
}
svoid downloadSomeTextInParallel {
downloadThread = startThread(r {
try {
int n = 0; for (CSnippet s) if (s.text != null) ++n;
print("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)
print("Have text for " + n + "/" + n(countConcepts(CSnippet), "concept");*/
});
}
try {
e.start();
while (!e.done()) sleepSeconds(1);
} finally {
e.cancel();
}
} finally {
downloadThread = null;
}
});
}