]> code.citadel.org Git - citadel.git/commitdiff
* Optimized the updating of visit records in several places by checking to
authorArt Cancro <ajc@citadel.org>
Wed, 23 Jul 2003 03:57:05 +0000 (03:57 +0000)
committerArt Cancro <ajc@citadel.org>
Wed, 23 Jul 2003 03:57:05 +0000 (03:57 +0000)
  see if they've changed and aborting the db update if they haven't.
* Functions which read/write user records are now slightly faster due to
  an improvement of the algorithm used to generate the database keys.

citadel/ChangeLog
citadel/room_ops.c
citadel/user_ops.c

index 7398fc499bf6bdba34ba46ee0bb2f4f44ecb5ff0..ca6fe79a5cb7da9ef0f77fa326175215ce42307d 100644 (file)
@@ -1,4 +1,10 @@
  $Log$
+ Revision 608.6  2003/07/23 03:57:05  ajc
+ * Optimized the updating of visit records in several places by checking to
+   see if they've changed and aborting the db update if they haven't.
+ * Functions which read/write user records are now slightly faster due to
+   an improvement of the algorithm used to generate the database keys.
+
  Revision 608.5  2003/07/22 03:07:50  nbryant
  fix build for Solaris
 
@@ -4884,3 +4890,4 @@ Sat Jul 11 00:20:48 EDT 1998 Nathan Bryant <bryant@cs.usm.maine.edu>
 
 Fri Jul 10 1998 Art Cancro <ajc@uncensored.citadel.org>
        * Initial CVS import
+
index 058b3ac4503fbc94c074fc95a774551e65b5d679..efb410502fedf46967d684ebf2a13abe20b7273f 100644 (file)
@@ -745,6 +745,7 @@ void usergoto(char *where, int display_result, int transiently,
         struct cdbdata *cdbfr;
        long *msglist = NULL;
        int num_msgs = 0;
+       unsigned int original_v_flags;
 
        /* If the supplied room name is NULL, the caller wants us to know that
         * it has already copied the room record into CC->room, so
@@ -759,6 +760,7 @@ void usergoto(char *where, int display_result, int transiently,
 
        begin_critical_section(S_USERS);
        CtdlGetRelationship(&vbuf, &CC->user, &CC->room);
+       original_v_flags = vbuf.v_flags;
 
        /* Know the room ... but not if it's the page log room, or if the
         * caller specified that we're only entering this room transiently.
@@ -768,7 +770,11 @@ void usergoto(char *where, int display_result, int transiently,
                vbuf.v_flags = vbuf.v_flags & ~V_FORGET & ~V_LOCKOUT;
                vbuf.v_flags = vbuf.v_flags | V_ACCESS;
        }
-       CtdlSetRelationship(&vbuf, &CC->user, &CC->room);
+       
+       /* Only rewrite the database record if we changed something */
+       if (vbuf.v_flags != original_v_flags) {
+               CtdlSetRelationship(&vbuf, &CC->user, &CC->room);
+       }
        end_critical_section(S_USERS);
 
        /* Check for new mail */
index 4b9b00858f3a5bdf080066766adb5e4bcd2c05cd..f2ffcf884253a9aa8f8916220ad9b1665ce74360 100644 (file)
 #include "citserver.h"
 
 
+/*
+ * makeuserkey() - convert a username into the format used as a database key
+ *                 (it's just the username converted into lower case)
+ */
+static inline void makeuserkey(char *key, char *username) {
+       int i, len;
+
+       len = strlen(username);
+       for (i=0; i<=len; ++i) {
+               key[i] = tolower(username[i]);
+       }
+}
+
+
 /*
  * getuser()  -  retrieve named user into supplied buffer.
  *               returns 0 on success
@@ -61,9 +75,8 @@
 int getuser(struct ctdluser *usbuf, char name[])
 {
 
-       char lowercase_name[USERNAME_SIZE];
+       char usernamekey[USERNAME_SIZE];
        char sysuser_name[USERNAME_SIZE];
-       int a;
        struct cdbdata *cdbus;
        int using_sysuser = 0;
 
@@ -76,19 +89,13 @@ int getuser(struct ctdluser *usbuf, char name[])
 #endif
 
        if (using_sysuser) {
-               for (a = 0; a <= strlen(sysuser_name); ++a) {
-                       lowercase_name[a] = tolower(sysuser_name[a]);
-               }
+               makeuserkey(usernamekey, sysuser_name);
        }
        else {
-               for (a = 0; a <= strlen(name); ++a) {
-                       if (a < sizeof(lowercase_name))
-                               lowercase_name[a] = tolower(name[a]);
-               }
+               makeuserkey(usernamekey, name);
        }
-       lowercase_name[sizeof(lowercase_name) - 1] = 0;
 
-       cdbus = cdb_fetch(CDB_USERS, lowercase_name, strlen(lowercase_name));
+       cdbus = cdb_fetch(CDB_USERS, usernamekey, strlen(usernamekey));
        if (cdbus == NULL) {    /* user not found */
                return(1);
        }
@@ -121,18 +128,13 @@ int lgetuser(struct ctdluser *usbuf, char *name)
  */
 void putuser(struct ctdluser *usbuf)
 {
-       char lowercase_name[USERNAME_SIZE];
-       int a;
+       char usernamekey[USERNAME_SIZE];
 
-       for (a = 0; a <= strlen(usbuf->fullname); ++a) {
-               if (a < sizeof(lowercase_name))
-                       lowercase_name[a] = tolower(usbuf->fullname[a]);
-       }
-       lowercase_name[sizeof(lowercase_name) - 1] = 0;
+       makeuserkey(usernamekey, usbuf->fullname);
 
        usbuf->version = REV_LEVEL;
        cdb_store(CDB_USERS,
-                 lowercase_name, strlen(lowercase_name),
+                 usernamekey, strlen(usernamekey),
                  usbuf, sizeof(struct ctdluser));
 
 }
@@ -667,14 +669,11 @@ int purge_user(char pname[])
 {
        char filename[64];
        struct ctdluser usbuf;
-       char lowercase_name[USERNAME_SIZE];
-       int a;
+       char usernamekey[USERNAME_SIZE];
        struct CitContext *ccptr;
        int user_is_logged_in = 0;
 
-       for (a = 0; a <= strlen(pname); ++a) {
-               lowercase_name[a] = tolower(pname[a]);
-       }
+       makeuserkey(usernamekey, pname);
 
        if (getuser(&usbuf, pname) != 0) {
                lprintf(5, "Cannot purge user <%s> - not found\n", pname);
@@ -707,7 +706,7 @@ int purge_user(char pname[])
        cdb_delete(CDB_VISIT, &usbuf.usernum, sizeof(long));
 
        /* delete the userlog entry */
-       cdb_delete(CDB_USERS, lowercase_name, strlen(lowercase_name));
+       cdb_delete(CDB_USERS, usernamekey, strlen(usernamekey));
 
        /* remove the user's bio file */
        snprintf(filename, sizeof filename, "./bio/%ld", usbuf.usernum);
@@ -990,6 +989,7 @@ void cmd_slrp(char *new_ptr)
 {
        long newlr;
        struct visit vbuf;
+       struct visit original_vbuf;
 
        if (CtdlAccessCheck(ac_logged_in)) {
                return;
@@ -1004,9 +1004,15 @@ void cmd_slrp(char *new_ptr)
        lgetuser(&CC->user, CC->curr_user);
 
        CtdlGetRelationship(&vbuf, &CC->user, &CC->room);
+       memcpy(&original_vbuf, &vbuf, sizeof(struct visit));
        vbuf.v_lastseen = newlr;
        snprintf(vbuf.v_seen, sizeof vbuf.v_seen, "*:%ld", newlr);
-       CtdlSetRelationship(&vbuf, &CC->user, &CC->room);
+
+       /* Only rewrite the record if it changed */
+       if ( (vbuf.v_lastseen != original_vbuf.v_lastseen)
+          || (strcmp(vbuf.v_seen, original_vbuf.v_seen)) ) {
+               CtdlSetRelationship(&vbuf, &CC->user, &CC->room);
+       }
 
        lputuser(&CC->user);
        cprintf("%d %ld\n", CIT_OK, newlr);