src/hg/instinct/hgHeatmap2/hgSessions.c 1.7

1.7 2009/06/04 03:50:37 jsanborn
added copyright notices, removed cluster library
Index: src/hg/instinct/hgHeatmap2/hgSessions.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/instinct/hgHeatmap2/hgSessions.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -b -B -U 1000000 -r1.6 -r1.7
--- src/hg/instinct/hgHeatmap2/hgSessions.c	3 Oct 2008 23:56:11 -0000	1.6
+++ src/hg/instinct/hgHeatmap2/hgSessions.c	4 Jun 2009 03:50:37 -0000	1.7
@@ -1,190 +1,194 @@
+/********************************************************************************/
+/* Copyright 2007-2009 -- The Regents of the University of California           */
+/********************************************************************************/
+
 /* hgSessions.c 
  *   These routines handle the storing and retrieving of JSON objects stored in a local
  * mysql database "sessionTrash".
  */
 
 #include "common.h"
 #include "cart.h"
 #include "hCommon.h"
 #include "hdb.h"
 
 #define SESSION_TABLE "sessions" 
 #define SESSION_DB "sessionTrash"
 
 static char const rcsid[] = "$Id$";
 
 
 static char *heatMapDbProfile = "localDb";  // database profile to use
 
 
 void createSessionTable(struct sqlConnection *conn)
 {
 struct dyString *dy = newDyString(1024);
 dyStringPrintf(dy, "CREATE TABLE %s (\n", SESSION_TABLE);
 dyStringPrintf(dy, "sessionKey int not null,\n");
 dyStringPrintf(dy, "user int not null,\n");
 dyStringPrintf(dy, "name varchar(255) not null,\n");
 dyStringPrintf(dy, "useCount int not null,\n");
 dyStringPrintf(dy, "lastUse datetime not null,\n");
 dyStringPrintf(dy, "settings longblob not null,\n");
 dyStringPrintf(dy, "PRIMARY KEY(user)\n");
 dyStringPrintf(dy, ")\n");
 sqlUpdate(conn,dy->string);
 dyStringFree(&dy);
 }
 
 char *retrieveSettingsByUser(struct cart *cart, struct sqlConnection *conn)
 {
 char query[1024];
 struct sqlResult *sr = NULL;
 char **row = NULL;
 
 unsigned int userId = cartUserId(cart);
 
 safef(query, sizeof(query), "SELECT settings FROM %s WHERE user=%u",
       SESSION_TABLE, userId);
 sr = sqlGetResult(conn,query);
 
 // Currently, only supporting one session per user ID.  This is to
 // avoid allowing people to write lots of entries to the db.
 row = sqlNextRow(sr);
 if (!row) 
     return NULL;
 char *settings = cloneString(row[0]);
 sqlFreeResult(&sr);
 return settings;
 }
 
 
 char *retrieveSettingsByKey(struct cart *cart, struct sqlConnection *conn, char *key)
 {
 char query[1024];
 struct sqlResult *sr = NULL;
 char **row = NULL;
 
 safef(query, sizeof(query), "SELECT settings FROM %s WHERE sessionKey=%s",
       SESSION_TABLE, key);
 sr = sqlGetResult(conn,query);
 
 // Currently, only supporting one session per user ID.  This is to
 // avoid allowing people to write lots of entries to the db.
 row = sqlNextRow(sr);
 if (!row)
     return NULL;
 char *settings = cloneString(row[0]);
 sqlFreeResult(&sr);
 return settings;
 }
    
 
 int getUniqueKey(struct sqlConnection *conn)
 {
 int stime;
 long ltime;
 
 // get current time to seed random
 ltime = time(NULL);
 stime = (unsigned) ltime/2;
 srand(stime);
 
 char query[1024];
 struct sqlResult *sr = NULL;
 char **row = NULL;
 
 int key = random();
 
 safef(query, sizeof(query), "SELECT settings FROM %s WHERE sessionKey=%d",
       SESSION_TABLE, key);
 sr = sqlGetResult(conn,query); 
 row = sqlNextRow(sr);
 
 int count = 0;
 while (row && count < 100)
     {
     sqlFreeResult(&sr);
 
     key = random();
     safef(query, sizeof(query), "SELECT settings FROM %s WHERE sessionKey=%d",
           SESSION_TABLE, key);
     sr = sqlGetResult(conn,query);
     row = sqlNextRow(sr);
     count++;
     }
 
 if (row)
     errAbort("Couldn't find unique key");
 
 return key;
 }
 
 char *retrieveSettings(struct cart *cart, char *key)
 {
 struct sqlConnection *conn = hAllocConnProfile(heatMapDbProfile, SESSION_DB);
 if (!conn)
     errAbort("Couldn't connect to session database");
 
 if (!sqlTableExists(conn, SESSION_TABLE))
     {
     hFreeConn(&conn);
     return NULL;
     }
 
 char *settings = NULL;
 if (!key)
     settings = retrieveSettingsByUser(cart, conn);
 else
     settings = retrieveSettingsByKey(cart, conn, key);
 
 hFreeConn(&conn);
 return settings;
 }
 
 
 int saveUserSettings(struct cart *cart, char *vars)
 {
 if (!cart || !vars)
     return -1;
 
 char *settings = replaceChars(vars, "\"", "'");  // replace " with single quote
 
 struct sqlConnection *conn = hAllocConnProfile(heatMapDbProfile, SESSION_DB);
 if (!conn)
     errAbort("Couldn't connect to session database");
 
 if (!sqlTableExists(conn, SESSION_TABLE))
     createSessionTable(conn);
 
 char query[1024];
 struct sqlResult *sr = NULL;
 char **row = NULL;
 
 unsigned int userId = cartUserId(cart);
 char *sessionName = "test";
 
 safef(query, sizeof(query), "SELECT sessionKey,useCount FROM %s WHERE user=%u",
       SESSION_TABLE, userId);
 sr = sqlGetResult(conn,query);
 row = sqlNextRow(sr);
 
 int key = -1;
 struct dyString *dy = newDyString(1024);
 if (row)
     {
     key = sqlUnsigned(row[0]);
     int useCount = sqlUnsigned(row[1]);
     sqlFreeResult(&sr);
     dyStringPrintf(dy, "UPDATE %s SET useCount=%d,lastUse=now(),settings=\"%s\" WHERE user=%u",
                    SESSION_TABLE, useCount+1, settings, userId);
     }
 else
     {
     key = getUniqueKey(conn);
     sqlFreeResult(&sr);
     dyStringPrintf(dy, "INSERT %s VALUES(%d,%u,\"%s\",1,now(),\"%s\")",
                    SESSION_TABLE, key, userId, sessionName, settings);
     }
 sqlUpdate(conn,dy->string);
 
 hFreeConn(&conn);
 return key;
 }