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;
}