/* This clones a database to give a private view per user. */ static int cloneDatabase(HttpConn *conn) { Esp *esp; EspRoute *eroute; EspReq *req; cchar *id; req = conn->reqData; eroute = conn->rx->route->eroute; assert(eroute->edi); assert(eroute->edi->flags & EDI_PRIVATE); esp = req->esp; if (!esp->databases) { lock(esp); if (!esp->databases) { esp->databases = mprCreateHash(0, 0); esp->databasesTimer = mprCreateTimerEvent(NULL, "esp-databases", 60 * 1000, pruneDatabases, esp, 0); } unlock(esp); } /* If the user is logging in or out, this will create a redundant session here. */ httpGetSession(conn, 1); id = httpGetSessionID(conn); if ((req->edi = mprLookupKey(esp->databases, id)) == 0) { if ((req->edi = ediClone(eroute->edi)) == 0) { mprLog("error esp", 0, "Cannot clone database: %s", eroute->edi->path); return MPR_ERR_CANT_OPEN; } mprAddKey(esp->databases, id, req->edi); } return 0; }
PUBLIC cchar *espGetSessionID(HttpConn *conn, int create) { HttpSession *session; if ((session = httpGetSession(getConn(), create)) != 0) { return session->id; } return 0; }
PUBLIC void destroySession() { HttpSession *sp; HttpConn *conn; conn = getConn(); if ((sp = httpGetSession(conn, 0)) != 0) { httpDestroySession(sp); } }
static void setupFlash(HttpConn *conn) { EspReq *req; req = conn->reqData; if (httpGetSession(conn, 0)) { req->flash = httpGetSessionObj(conn, ESP_FLASH_VAR); req->lastFlash = 0; if (req->flash) { httpRemoveSessionVar(conn, ESP_FLASH_VAR); req->lastFlash = mprCloneHash(req->flash); } } }
PUBLIC void espSetFlashv(HttpConn *conn, cchar *kind, cchar *fmt, va_list args) { EspReq *req; cchar *msg; req = conn->reqData; msg = sfmtv(fmt, args); if (req->flash == 0) { req->flash = mprCreateHash(0, MPR_HASH_STABLE); } mprAddKey(req->flash, kind, sclone(msg)); /* Create a session as early as possible so a Set-Cookie header can be omitted. */ httpGetSession(conn, 1); }
static void setupFlash(HttpConn *conn) { EspReq *req; req = conn->data; if (httpGetSession(conn, 0)) { req->flash = httpGetSessionObj(conn, ESP_FLASH_VAR); req->lastFlash = 0; if (req->flash) { mprAssert(req->flash->fn); httpSetSessionVar(conn, ESP_FLASH_VAR, ""); req->lastFlash = mprCloneHash(req->flash); } else { req->flash = 0; } } }
PUBLIC void espSetFlashv(HttpConn *conn, cchar *kind, cchar *fmt, va_list args) { EspReq *req; cchar *prior, *msg; req = conn->data; msg = sfmtv(fmt, args); if (req->flash == 0) { req->flash = mprCreateHash(0, MPR_HASH_STABLE); } if ((prior = mprLookupKey(req->flash, kind)) != 0) { mprAddKey(req->flash, kind, sjoin(prior, "\n", msg, NULL)); } else { mprAddKey(req->flash, kind, sclone(msg)); } /* Create a session as early as possible so a Set-Cookie header can be omitted. */ httpGetSession(conn, 1); }
void espSetFlashv(HttpConn *conn, cchar *kind, cchar *fmt, va_list args) { EspReq *req; MprKey *kp; cchar *prior, *msg; req = conn->data; msg = sfmtv(fmt, args); if (req->flash == 0) { req->flash = mprCreateHash(0, 0); httpGetSession(conn, 1); } if ((prior = mprLookupKey(req->flash, kind)) != 0) { kp = mprAddKey(req->flash, kind, sjoin(prior, "\n", msg, NULL)); } else { kp = mprAddKey(req->flash, kind, sclone(msg)); } if (kp) { kp->type = MPR_JSON_STRING; } }