#include "artv_dump.h"
#include "dtds/user-defs.h"
#include "undef_data.h"
- client_write("\n", 1);
+ cprintf("\n");
}
void artv_dump_room_msg(long msgnum, void *userdata) {
cprintf(" msgnum: %ld\n", msgnum);
fprintf(artv_global_message_list, "%ld\n", msgnum);
- client_write("\n", 1);
+ cprintf("\n");
}//// TODO
*/
CtdlForEachMessage(MSGS_ALL, 0L, NULL, NULL, NULL,
artv_export_room_msg, NULL);
- client_write("0\n", 2);
+ cprintf("0\n");
}
*/
CtdlForEachMessage(MSGS_ALL, 0L, NULL, NULL, NULL,
artv_dump_room_msg, NULL);
- client_write("\n\n", 2);
+ cprintf("\n\n");
}
int i;
for (i=0; i < MAXFLOORS; ++i) {
- client_write("floor\n", 5);
+ client_write("floor\n", 6);
cprintf("%d\n", i);
getfloor(&qfbuf, i);
buf = &qfbuf;
int i;
for (i=0; i < MAXFLOORS; ++i) {
- client_write("floor\n", 5);
+ client_write("floor\n", 6);
cprintf("%d\n", i);
getfloor(&qfbuf, i);
buf = &qfbuf;
+void artv_export_openids(void) {
+ struct cdbdata *cdboi;
+ long usernum;
+
+ cdb_rewind(CDB_OPENID);
+ while (cdboi = cdb_next_item(CDB_OPENID), cdboi != NULL) {
+ if (cdboi->len > sizeof(long)) {
+ client_write("openid\n", 7);
+ memcpy(&usernum, cdboi->ptr, sizeof(long));
+ cprintf("%s\n", (cdboi->ptr)+sizeof(long) );
+ cprintf("%ld\n", usernum);
+ }
+ cdb_free(cdboi);
+ }
+}
+
+
+
+
void artv_export_messages(void) {
char buf[SIZ];
long msgnum;
Ctx = CC;
cprintf("%d Exporting all Citadel databases.\n", LISTING_FOLLOWS);
-
+ Ctx->dont_term = 1;
cprintf("version\n%d\n", REV_LEVEL);
/* export the config file (this is done using x-macros) */
cprintf("%d\n", CitControl.version);
if (Ctx->kill_me != 1)
artv_export_users();
+ if (Ctx->kill_me != 1)
+ artv_export_openids();
if (Ctx->kill_me != 1)
artv_export_rooms();
if (Ctx->kill_me != 1)
artv_export_visits();
if (Ctx->kill_me != 1)
artv_export_messages();
-
client_write("000\n", 4);
+ Ctx->dont_term = 0;
}
void artv_do_dump(void) {
}
-/*
- */
void artv_import_visit(void) {
struct visit vbuf;
char buf[SIZ];
}
+void artv_import_openid(void) {
+ char buf[SIZ];
+ long usernum;
+ char openid[1024];
+ char *data;
+ int data_len;
+
+ client_getln(openid, sizeof openid);
+ client_getln(buf, sizeof buf); usernum = atol(buf);
+ if (IsEmptyStr(openid)) return;
+
+ data_len = sizeof(long) + strlen(openid) + 1;
+ data = malloc(data_len);
+
+ memcpy(data, &usernum, sizeof(long));
+ memcpy(&data[sizeof(long)], openid, strlen(openid) + 1);
+
+ cdb_store(CDB_OPENID, openid, strlen(openid), data, data_len);
+ free(data);
+
+ CtdlLogPrintf(CTDL_INFO, "Imported OpenID %s for user #%ld\n", openid, usernum);
+}
+
void artv_import_message(long *iterations, char **b64buf, size_t *b64size, char **plain, size_t *plain_size) {
struct MetaData smi;
long msgnum;
long msglen;
- FILE *fp;
char buf[SIZ];
- char tempfile[PATH_MAX];
- char *mbuf;
size_t b64len = 0;
char *tbuf, *tbuf2;
size_t mlen;
b64len += mlen;
}
+ /**
+ * FIXME: This is an ideal place for a "sub thread". What we should do is create a new thread
+ * This new thread would be given the base64 encoded message, it would then decode it and store
+ * it. This would allow the thread that is reading from the client to continue doing so, basically
+ * backgrounding the decode and store operation. This would increase the speed of the import from
+ * the users perspective.
+ */
+
/**
* Decode and store the message
* If this decode and store takes more than 5 seconds the sendcommand WD timer may expire.
- * This is the reason for outputting a dot before and after.
*/
msglen = CtdlDecodeBase64(*plain, *b64buf, b64len);
-// cprintdot(iterations);
CtdlLogPrintf(CTDL_DEBUG, "msglen = %ld\n", msglen);
cdb_store(CDB_MSGMAIN, &msgnum, sizeof(long), *plain, msglen);
-// cprintdot(iterations);
PutMetaData(&smi);
CtdlLogPrintf(CTDL_INFO, "Imported message %ld\n", msgnum);
-/*
- CtdlMakeTempFileName(tempfile, sizeof tempfile);
- snprintf(buf, sizeof buf, "%s -d >%s", file_base64, tempfile);
- fp = popen(buf, "w");
- while (client_getln(buf, sizeof buf) >= 0 , strcasecmp(buf, END_OF_MESSAGE)) {
- if (CtdlThreadCheckStop())
- {
- pclose(fp);
- unlink (tempfile);
- return;
- }
- cprintdot(iterations);
- fprintf(fp, "%s\n", buf);
- }
- pclose(fp);
- fp = fopen(tempfile, "rb");
- fseek(fp, 0L, SEEK_END);
- msglen = ftell(fp);
- fclose(fp);
- CtdlLogPrintf(CTDL_DEBUG, "msglen = %ld\n", msglen);
-
- mbuf = malloc(msglen);
- fp = fopen(tempfile, "rb");
- fread(mbuf, msglen, 1, fp);
- fclose(fp);
-
- cdb_store(CDB_MSGMAIN, &msgnum, sizeof(long), mbuf, msglen);
-
- free(mbuf);
- unlink(tempfile);
-
- PutMetaData(&smi);
- CtdlLogPrintf(CTDL_INFO, "Imported message %ld\n", msgnum);
-*/
}
plain[0] = 0;
plain_size = SIZ;
+ CC->dont_term = 1;
+
cprintf("%d sock it to me\n", SEND_LISTING);
abuf[0] = '\0';
unbuffer_output();
else if (!strcasecmp(buf, "room")) artv_import_room(&iterations);
else if (!strcasecmp(buf, "floor")) artv_import_floor();
else if (!strcasecmp(buf, "visit")) artv_import_visit();
+ else if (!strcasecmp(buf, "openid")) artv_import_openid();
else if (!strcasecmp(buf, "message"))
{
b64mes[0] = 0;
CtdlLogPrintf(CTDL_INFO, "Invalid keyword <%s>. Flushing input.\n", buf);
while (client_getln(buf, sizeof buf) >= 0 && strcmp(buf, "000")) ;;
rebuild_euid_index();
+ rebuild_usersbynumber();
+ CC->dont_term = 0;
}
static int is_running = 0;
if (CtdlAccessCheck(ac_internal)) return;
- if (is_running) {
+
+ if (CtdlTrySingleUser())
+ {
+ CtdlMakeTempFileName(artv_tempfilename1, sizeof artv_tempfilename1);
+ CtdlMakeTempFileName(artv_tempfilename2, sizeof artv_tempfilename2);
+
+ extract_token(cmd, cmdbuf, 0, '|', sizeof cmd);
+ if (!strcasecmp(cmd, "export")) artv_do_export();
+ else if (!strcasecmp(cmd, "import")) artv_do_import();
+ else if (!strcasecmp(cmd, "dump")) artv_do_dump();
+ else cprintf("%d illegal command\n", ERROR + ILLEGAL_VALUE);
+
+ unlink(artv_tempfilename1);
+ unlink(artv_tempfilename2);
+
+ CtdlEndSingleUser();
+ }
+ else
+ {
cprintf("%d The importer/exporter is already running.\n",
ERROR + RESOURCE_BUSY);
- return;
}
- is_running = 1;
-
- CtdlMakeTempFileName(artv_tempfilename1, sizeof artv_tempfilename1);
- CtdlMakeTempFileName(artv_tempfilename2, sizeof artv_tempfilename2);
-
- extract_token(cmd, cmdbuf, 0, '|', sizeof cmd);
- if (!strcasecmp(cmd, "export")) artv_do_export();
- else if (!strcasecmp(cmd, "import")) artv_do_import();
- else if (!strcasecmp(cmd, "dump")) artv_do_dump();
- else cprintf("%d illegal command\n", ERROR + ILLEGAL_VALUE);
-
- unlink(artv_tempfilename1);
- unlink(artv_tempfilename2);
-
- is_running = 0;
}