1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
/* eurephiadb_session_common.c -- Common function for handling sessions
*
* GPLv2 only - Copyright (C) 2008
* David Sommerseth <dazo@users.sourceforge.net>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; version 2
* of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
/**
* @file eurephiadb_session_common.c
* @author David Sommerseth <dazo@users.sourceforge.net>
* @date 2008-11-28
*
* @brief Common functions for handling eurephia sessions.
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <eurephia_nullsafe.h>
#include <eurephia_context.h>
#include <eurephia_log.h>
#include <eurephia_values.h>
#include <eurephiadb_session_struct.h>
#include <eurephiadb_driver.h>
/**
* Adds or updates a key in the eurephiaVALUES stack. Database is updated before the stack is updated.
* If database fails, the stack is not updated.
*
* @param ctx eurephiaCTX
* @param session eurephiaSESSION, which contains information about the current user session
* @param key key name of the value to be stored
* @param val value to be stored
*
* @return Returns 1 on success, otherwise 0.
*/
int eDBset_session_value(eurephiaCTX *ctx, eurephiaSESSION *session, const char *key, const char *val) {
eurephiaVALUES *svals = NULL;
if( (session == NULL) || (key == NULL) ) {
return 0;
}
DEBUG(ctx, 30, "Function call: eDBset_session_value(ctx, '%s','%s','%s')",
session->sessionkey, key, val);
// Create a new session value buffer if it does not exist
if( session->sessvals == NULL ) {
session->sessvals = eCreate_value_space(ctx, 10);
if( session->sessvals == NULL ) {
eurephia_log(ctx, LOG_PANIC, 0, "Could not allocate memory for session values");
return 0;
}
}
// Check if the session value exists already. If it does update it, or else add it
svals = eGet_valuestruct(session->sessvals, key);
if( (svals == NULL) && (val != NULL) ) {
DEBUG(ctx, 32, "eDBset_session_value ... New session value: %s = '%s'", key, val);
// Add a new session value
if( eDBstore_session_value(ctx, session, SESSVAL_NEW, key, val) ) {
DEBUG(ctx, 32, "eDBset_session_value ... Adding value to value stack: %s = '%s'",
key, val);
// Add value to the stack
eAdd_value(ctx, session->sessvals, key, val);
DEBUG(ctx, 32, "Registered session variable to session '%s': %s = %s",
session->sessionkey, key, val);
}
} else if( svals != NULL ) {
if( (val != NULL) && (strcmp(svals->val, val) == 0) ) {
DEBUG(ctx, 32, "Session value not changed('%s','%s','%s)",
session->sessionkey, key, val);
return 1;
}
// Update the value in the stack if database is updated without errors
if( eDBstore_session_value(ctx, session,(val != NULL ? SESSVAL_UPDATE : SESSVAL_DELETE), key,val)){
free_nullsafe(ctx, svals->val);
svals->val = strdup_nullsafe(val);
DEBUG(ctx, 32, "Session variable updated in session '%s': %s = %s",
session->sessionkey, key, val);
}
} else if( (svals == NULL) && (val == NULL ) ) {
DEBUG(ctx, 32, "Ignoring saving new session value '%s' == NULL", key);
}
return 1;
}
/**
* Free up the memory used by a session structure. This is normally not called directly, but called via the
* eDBfree_session(...) macro.
*
* @param ctx eurephiaCTX
* @param session Pointer to the eurephiaSESSION structure to be freed.
*/
void eDBfree_session_func(eurephiaCTX *ctx, eurephiaSESSION *session) {
if( session == NULL ) {
return;
}
DEBUG(ctx, 12, "Function call: eDBfree_session(ctx, '%s')", session->sessionkey);
eFree_values(ctx, session->sessvals);
free_nullsafe(ctx, session->sessionkey);
free(session);
}
|