X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fdatabase.c;h=dfeb4f013946cb1c4f9c1cda84f2a8143c7b192a;hb=068d33e5d8569b2c4a2c8582178427892b0a8dee;hp=74aa3df4418af7adb1d4bf917473eee4d102b1ca;hpb=fdbd626c5ecb911a71663167e436389b13328079;p=citadel.git diff --git a/citadel/database.c b/citadel/database.c index 74aa3df44..dfeb4f013 100644 --- a/citadel/database.c +++ b/citadel/database.c @@ -1,7 +1,7 @@ /* * This is a data store backend for the Citadel server which uses Berkeley DB. * - * Copyright (c) 1987-2020 by the citadel.org team + * Copyright (c) 1987-2021 by the citadel.org team * * This program is open source software; you can redistribute it and/or * modify it under the terms of the GNU General Public License version 3. @@ -193,14 +193,14 @@ void open_databases(void) { /* * Silently try to create the database subdirectory. If it's already there, no problem. */ - if ((mkdir(ctdl_data_dir, 0700) != 0) && (errno != EEXIST)) { - syslog(LOG_ERR, "db: unable to create database directory [%s]: %m", ctdl_data_dir); + if ((mkdir(ctdl_db_dir, 0700) != 0) && (errno != EEXIST)) { + syslog(LOG_ERR, "db: unable to create database directory [%s]: %m", ctdl_db_dir); } - if (chmod(ctdl_data_dir, 0700) != 0) { - syslog(LOG_ERR, "db: unable to set database directory permissions [%s]: %m", ctdl_data_dir); + if (chmod(ctdl_db_dir, 0700) != 0) { + syslog(LOG_ERR, "db: unable to set database directory permissions [%s]: %m", ctdl_db_dir); } - if (chown(ctdl_data_dir, CTDLUID, (-1)) != 0) { - syslog(LOG_ERR, "db: unable to set the owner for [%s]: %m", ctdl_data_dir); + if (chown(ctdl_db_dir, CTDLUID, (-1)) != 0) { + syslog(LOG_ERR, "db: unable to set the owner for [%s]: %m", ctdl_db_dir); } syslog(LOG_DEBUG, "db: Setting up DB environment"); // db_env_set_func_yield((int (*)(u_long, u_long))sched_yield); @@ -238,20 +238,20 @@ void open_databases(void) { } flags = DB_CREATE | DB_INIT_MPOOL | DB_PRIVATE | DB_INIT_TXN | DB_INIT_LOCK | DB_THREAD | DB_INIT_LOG; - syslog(LOG_DEBUG, "db: dbenv->open(dbenv, %s, %d, 0)", ctdl_data_dir, flags); - ret = dbenv->open(dbenv, ctdl_data_dir, flags, 0); // try opening the database cleanly + syslog(LOG_DEBUG, "db: dbenv->open(dbenv, %s, %d, 0)", ctdl_db_dir, flags); + ret = dbenv->open(dbenv, ctdl_db_dir, flags, 0); // try opening the database cleanly if (ret == DB_RUNRECOVERY) { syslog(LOG_ERR, "db: dbenv->open: %s", db_strerror(ret)); syslog(LOG_ERR, "db: attempting recovery..."); flags |= DB_RECOVER; - ret = dbenv->open(dbenv, ctdl_data_dir, flags, 0); // try recovery + ret = dbenv->open(dbenv, ctdl_db_dir, flags, 0); // try recovery } if (ret == DB_RUNRECOVERY) { syslog(LOG_ERR, "db: dbenv->open: %s", db_strerror(ret)); syslog(LOG_ERR, "db: attempting catastrophic recovery..."); flags &= ~DB_RECOVER; flags |= DB_RECOVER_FATAL; - ret = dbenv->open(dbenv, ctdl_data_dir, flags, 0); // try catastrophic recovery + ret = dbenv->open(dbenv, ctdl_db_dir, flags, 0); // try catastrophic recovery } if (ret) { syslog(LOG_ERR, "db: dbenv->open: %s", db_strerror(ret)); @@ -291,11 +291,11 @@ void cdb_chmod_data(void) { struct dirent *d; char filename[PATH_MAX]; - dp = opendir(ctdl_data_dir); + dp = opendir(ctdl_db_dir); if (dp != NULL) { while (d = readdir(dp), d != NULL) { if (d->d_name[0] != '.') { - snprintf(filename, sizeof filename, "%s/%s", ctdl_data_dir, d->d_name); + snprintf(filename, sizeof filename, "%s/%s", ctdl_db_dir, d->d_name); syslog(LOG_DEBUG, "db: chmod(%s, 0600) returned %d", filename, chmod(filename, 0600)); syslog(LOG_DEBUG, "db: chown(%s, CTDLUID, -1) returned %d", filename, chown(filename, CTDLUID, (-1)) @@ -317,7 +317,7 @@ void close_databases(void) { syslog(LOG_INFO, "db: performing final checkpoint"); if ((ret = dbenv->txn_checkpoint(dbenv, 0, 0, 0))) { - syslog(LOG_ERR, "txn_checkpoint: %s", db_strerror(ret)); + syslog(LOG_ERR, "db: txn_checkpoint: %s", db_strerror(ret)); } syslog(LOG_INFO, "db: flushing the database logs"); @@ -325,11 +325,6 @@ void close_databases(void) { syslog(LOG_ERR, "db: log_flush: %s", db_strerror(ret)); } -#ifdef DB_STAT_ALL - /* print some statistics... */ - dbenv->lock_stat_print(dbenv, DB_STAT_ALL); -#endif - /* close the tables */ syslog(LOG_INFO, "db: closing databases"); for (i = 0; i < MAXCDB; ++i) { @@ -341,10 +336,16 @@ void close_databases(void) { } + // This seemed nifty at the time but did anyone really look at it? + // #ifdef DB_STAT_ALL + // /* print some statistics... */ + // dbenv->lock_stat_print(dbenv, DB_STAT_ALL); + // #endif + /* Close the handle. */ ret = dbenv->close(dbenv, 0); if (ret) { - syslog(LOG_EMERG, "db: DBENV->close: %s", db_strerror(ret)); + syslog(LOG_ERR, "db: DBENV->close: %s", db_strerror(ret)); } } @@ -383,7 +384,7 @@ void cdb_decompress_if_necessary(struct cdbdata *cdb) { if (uncompress((Bytef *) uncompressed_data, (uLongf *) & destLen, (const Bytef *) compressed_data, (uLong) sourceLen) != Z_OK) { - syslog(LOG_EMERG, "db: uncompress() error"); + syslog(LOG_ERR, "db: uncompress() error"); cdb_abort(); } @@ -425,7 +426,7 @@ int cdb_store(int cdb, const void *ckey, int ckeylen, void *cdata, int cdatalen) compressed_data = malloc(buffer_len); if (compress2((Bytef *) (compressed_data + sizeof(struct CtdlCompressHeader)), &destLen, (Bytef *) cdata, (uLongf) cdatalen, 1) != Z_OK) { - syslog(LOG_EMERG, "db: compress2() error"); + syslog(LOG_ERR, "db: compress2() error"); cdb_abort(); } zheader.compressed_len = (size_t) destLen; @@ -442,7 +443,7 @@ int cdb_store(int cdb, const void *ckey, int ckeylen, void *cdata, int cdatalen) 0 // flags ); if (ret) { - syslog(LOG_EMERG, "db: cdb_store(%d): %s", cdb, db_strerror(ret)); + syslog(LOG_ERR, "db: cdb_store(%d): %s", cdb, db_strerror(ret)); cdb_abort(); } if (compressing) { @@ -464,7 +465,7 @@ int cdb_store(int cdb, const void *ckey, int ckeylen, void *cdata, int cdatalen) txabort(tid); goto retry; } else { - syslog(LOG_EMERG, "db: cdb_store(%d): %s", cdb, db_strerror(ret)); + syslog(LOG_ERR, "db: cdb_store(%d): %s", cdb, db_strerror(ret)); cdb_abort(); } } else { @@ -494,7 +495,7 @@ int cdb_delete(int cdb, void *key, int keylen) { if (TSD->tid != NULL) { ret = dbp[cdb]->del(dbp[cdb], TSD->tid, &dkey, 0); if (ret) { - syslog(LOG_EMERG, "db: cdb_delete(%d): %s", cdb, db_strerror(ret)); + syslog(LOG_ERR, "db: cdb_delete(%d): %s", cdb, db_strerror(ret)); if (ret != DB_NOTFOUND) { cdb_abort(); } @@ -510,7 +511,7 @@ int cdb_delete(int cdb, void *key, int keylen) { txabort(tid); goto retry; } else { - syslog(LOG_EMERG, "db: cdb_delete(%d): %s", cdb, db_strerror(ret)); + syslog(LOG_ERR, "db: cdb_delete(%d): %s", cdb, db_strerror(ret)); cdb_abort(); } } else { @@ -533,7 +534,7 @@ static DBC *localcursor(int cdb) { } if (ret) { - syslog(LOG_EMERG, "db: localcursor: %s", db_strerror(ret)); + syslog(LOG_ERR, "db: localcursor: %s", db_strerror(ret)); cdb_abort(); } @@ -573,7 +574,7 @@ struct cdbdata *cdb_fetch(int cdb, const void *key, int keylen) { } if ((ret != 0) && (ret != DB_NOTFOUND)) { - syslog(LOG_EMERG, "db: cdb_fetch(%d): %s", cdb, db_strerror(ret)); + syslog(LOG_ERR, "db: cdb_fetch(%d): %s", cdb, db_strerror(ret)); cdb_abort(); } @@ -584,7 +585,7 @@ struct cdbdata *cdb_fetch(int cdb, const void *key, int keylen) { tempcdb = (struct cdbdata *) malloc(sizeof(struct cdbdata)); if (tempcdb == NULL) { - syslog(LOG_EMERG, "db: cdb_fetch: Cannot allocate memory for tempcdb"); + syslog(LOG_ERR, "db: cdb_fetch: Cannot allocate memory for tempcdb"); cdb_abort(); return NULL; /* make it easier for static analysis... */ } else { @@ -630,7 +631,7 @@ void cdb_rewind(int cdb) { int ret = 0; if (TSD->cursors[cdb] != NULL) { - syslog(LOG_EMERG, "db: cdb_rewind: must close cursor on database %d before reopening", cdb); + syslog(LOG_ERR, "db: cdb_rewind: must close cursor on database %d before reopening", cdb); cdb_abort(); /* cclose(TSD->cursors[cdb]); */ } @@ -640,7 +641,7 @@ void cdb_rewind(int cdb) { */ ret = dbp[cdb]->cursor(dbp[cdb], TSD->tid, &TSD->cursors[cdb], 0); if (ret) { - syslog(LOG_EMERG, "db: cdb_rewind: db_cursor: %s", db_strerror(ret)); + syslog(LOG_ERR, "db: cdb_rewind: db_cursor: %s", db_strerror(ret)); cdb_abort(); } } @@ -664,7 +665,7 @@ struct cdbdata *cdb_next_item(int cdb) { if (ret) { if (ret != DB_NOTFOUND) { - syslog(LOG_EMERG, "db: cdb_next_item(%d): %s", cdb, db_strerror(ret)); + syslog(LOG_ERR, "db: cdb_next_item(%d): %s", cdb, db_strerror(ret)); cdb_abort(); } cdb_close_cursor(cdb); @@ -687,7 +688,7 @@ void cdb_begin_transaction(void) { bailIfCursor(TSD->cursors, "can't begin transaction during r/o cursor"); if (TSD->tid != NULL) { - syslog(LOG_EMERG, "db: cdb_begin_transaction: ERROR: nested transaction"); + syslog(LOG_ERR, "db: cdb_begin_transaction: ERROR: nested transaction"); cdb_abort(); } @@ -725,9 +726,10 @@ void cdb_trunc(int cdb) { u_int32_t count; if (TSD->tid != NULL) { - syslog(LOG_EMERG, "db: cdb_trunc must not be called in a transaction."); + syslog(LOG_ERR, "db: cdb_trunc must not be called in a transaction."); cdb_abort(); - } else { + } + else { bailIfCursor(TSD->cursors, "attempt to write during r/o cursor"); retry: @@ -741,9 +743,9 @@ void cdb_trunc(int cdb) { /* txabort(tid); */ goto retry; } else { - syslog(LOG_EMERG, "db: cdb_truncate(%d): %s", cdb, db_strerror(ret)); + syslog(LOG_ERR, "db: cdb_truncate(%d): %s", cdb, db_strerror(ret)); if (ret == ENOMEM) { - syslog(LOG_EMERG, "db: You may need to tune your database; please read http://www.citadel.org/doku.php?id=faq:troubleshooting:out_of_lock_entries for more information."); + syslog(LOG_ERR, "db: You may need to tune your database; please read http://www.citadel.org/doku.php?id=faq:troubleshooting:out_of_lock_entries for more information."); } exit(CTDLEXIT_DB); } @@ -797,52 +799,10 @@ int CheckIfAlreadySeen(StrBuf *guid) { } -void cmd_rsen(char *argbuf) { - char Token[SIZ]; - long TLen; - char Time[SIZ]; - - struct UseTable ut; - struct cdbdata *cdbut; - - if (CtdlAccessCheck(ac_aide)) { - return; - } - - TLen = extract_token(Token, argbuf, 1, '|', sizeof Token); - if (strncmp(argbuf, "GET", 3) == 0) { - cdbut = cdb_fetch(CDB_USETABLE, Token, TLen); - if (cdbut != NULL) { - memcpy(&ut, cdbut->ptr, ((cdbut->len > sizeof(struct UseTable)) ? sizeof(struct UseTable) : cdbut->len)); - - cprintf("%d %ld\n", CIT_OK, ut.ut_timestamp); - } else { - cprintf("%d not found\n", ERROR + NOT_HERE); - } - - } else if (strncmp(argbuf, "SET", 3) == 0) { - memcpy(ut.ut_msgid, Token, TLen); - extract_token(Time, argbuf, 2, '|', sizeof Time); - ut.ut_timestamp = atol(Time); - cdb_store(CDB_USETABLE, Token, TLen, &ut, sizeof(struct UseTable)); - cprintf("%d token updated\n", CIT_OK); - } else if (strncmp(argbuf, "DEL", 3) == 0) { - if (cdb_delete(CDB_USETABLE, Token, TLen)) - cprintf("%d not found\n", ERROR + NOT_HERE); - else - cprintf("%d deleted.\n", CIT_OK); - - } else { - cprintf("%d Usage: [GET|SET|DEL]|Token|timestamp\n", ERROR); - } - -} - - CTDL_MODULE_INIT(database) { if (!threading) { - CtdlRegisterProtoHook(cmd_rsen, "RSEN", "manipulate Aggregators seen database"); + // nothing to do here } /* return our module id for the log */