]> code.citadel.org Git - citadel.git/blobdiff - citadel/server/room_ops.c
cdb_fetch() and cdb_next_item() now return a struct cdbdata instead of a pointer...
[citadel.git] / citadel / server / room_ops.c
index 45aa1079ff3f267a621d066a4e4e61b9e8c9925f..b45913c485bfe653b4645949f20205fb516e4a6c 100644 (file)
@@ -302,7 +302,7 @@ void room_sanity_check(struct ctdlroom *qrbuf) {
 
 // CtdlGetRoom()  -  retrieve room data from disk
 int CtdlGetRoom(struct ctdlroom *qrbuf, const char *room_name) {
-       struct cdbdata *cdbqr;
+       struct cdbdata cdbqr;
        char lowercase_name[ROOMNAMELEN];
        char personal_lowercase_name[ROOMNAMELEN];
        long len;
@@ -322,13 +322,12 @@ int CtdlGetRoom(struct ctdlroom *qrbuf, const char *room_name) {
        cdbqr = cdb_fetch(CDB_ROOMS, lowercase_name, strlen(lowercase_name));
 
        // If that didn't work, try the user's personal namespace
-       if (cdbqr == NULL) {
+       if (cdbqr.len == 0) {
                snprintf(personal_lowercase_name, sizeof personal_lowercase_name, "%010ld.%s", CC->user.usernum, lowercase_name);
                cdbqr = cdb_fetch(CDB_ROOMS, personal_lowercase_name, strlen(personal_lowercase_name));
        }
-       if (cdbqr != NULL) {
-               memcpy(qrbuf, cdbqr->ptr, ((cdbqr->len > sizeof(struct ctdlroom)) ?  sizeof(struct ctdlroom) : cdbqr->len));
-               cdb_free(cdbqr);
+       if (cdbqr.len > 0) {
+               memcpy(qrbuf, cdbqr.ptr, ((cdbqr.len > sizeof(struct ctdlroom)) ?  sizeof(struct ctdlroom) : cdbqr.len));
                room_sanity_check(qrbuf);
                return (0);
        }
@@ -432,13 +431,12 @@ int CtdlGetAvailableFloor(void) {
 
 // CtdlGetFloor()  -  retrieve floor data from disk
 void CtdlGetFloor(struct floor *flbuf, int floor_num) {
-       struct cdbdata *cdbfl;
+       struct cdbdata cdbfl;
 
        memset(flbuf, 0, sizeof(struct floor));
        cdbfl = cdb_fetch(CDB_FLOORTAB, &floor_num, sizeof(int));
-       if (cdbfl != NULL) {
-               memcpy(flbuf, cdbfl->ptr, ((cdbfl->len > sizeof(struct floor)) ?  sizeof(struct floor) : cdbfl->len));
-               cdb_free(cdbfl);
+       if (cdbfl.len > 0) {
+               memcpy(flbuf, cdbfl.ptr, ((cdbfl.len > sizeof(struct floor)) ?  sizeof(struct floor) : cdbfl.len));
        }
        else {
                if (floor_num == 0) {
@@ -525,14 +523,13 @@ void lputfloor(struct floor *flbuf, int floor_num) {
 // Iterate through the room table, performing a callback for each room.
 void CtdlForEachRoom(ForEachRoomCallBack callback_func, void *in_data) {
        struct ctdlroom qrbuf;
-       struct cdbdata *cdbqr;
+       struct cdbdata cdbqr;
 
        cdb_rewind(CDB_ROOMS);
 
-       while (cdbqr = cdb_next_item(CDB_ROOMS), cdbqr != NULL) {
+       while (cdbqr = cdb_next_item(CDB_ROOMS), cdbqr.len>0) {
                memset(&qrbuf, 0, sizeof(struct ctdlroom));
-               memcpy(&qrbuf, cdbqr->ptr, ((cdbqr->len > sizeof(struct ctdlroom)) ?  sizeof(struct ctdlroom) : cdbqr->len) );
-               cdb_free(cdbqr);
+               memcpy(&qrbuf, cdbqr.ptr, ((cdbqr.len > sizeof(struct ctdlroom)) ?  sizeof(struct ctdlroom) : cdbqr.len) );
                room_sanity_check(&qrbuf);
                if (qrbuf.QRflags & QR_INUSE) {
                        callback_func(&qrbuf, in_data);
@@ -543,14 +540,12 @@ void CtdlForEachRoom(ForEachRoomCallBack callback_func, void *in_data) {
 
 // delete_msglist()  -  delete room message pointers
 void delete_msglist(struct ctdlroom *whichroom) {
-        struct cdbdata *cdbml;
+        struct cdbdata cdbml;
 
        // Make sure the msglist we're deleting actually exists, otherwise
        // libdb will complain when we try to delete an invalid record
         cdbml = cdb_fetch(CDB_MSGLISTS, &whichroom->QRnumber, sizeof(long));
-        if (cdbml != NULL) {
-               cdb_free(cdbml);
-
+        if (cdbml.len > 0) {
                // Go ahead and delete it
                cdb_delete(CDB_MSGLISTS, &whichroom->QRnumber, sizeof(long));
        }
@@ -607,25 +602,24 @@ int CtdlIsNonEditable(struct ctdlroom *qrbuf) {
 // If no messages in room, returns 0 and msgs is set to NULL.
 int CtdlFetchMsgList(long roomnum, long **msgs) {
        int num_msgs = 0;
-        struct cdbdata *cdbfr;
+        struct cdbdata cdbfr;
 
         cdbfr = cdb_fetch(CDB_MSGLISTS, &roomnum, sizeof(long));
-       if (cdbfr == NULL) {
+       if (cdbfr.len == 0) {
                syslog(LOG_ERR, "room_ops: no msglist for room %ld", roomnum);
                *msgs = malloc(sizeof(long));   // dummy buffer
                *msgs[0] = 0;
                return (0);
        }
 
-               num_msgs = cdbfr->len / sizeof(long);
+               num_msgs = cdbfr.len / sizeof(long);
        if (num_msgs > 0) {
-               *msgs = malloc(cdbfr->len);
-               memcpy(*msgs, cdbfr->ptr, cdbfr->len);
+               *msgs = malloc(cdbfr.len);
+               memcpy(*msgs, cdbfr.ptr, cdbfr.len);
        }
        else {
                *msgs = NULL;
        }
-               cdb_free(cdbfr);
        return(num_msgs);
 }