/
dbh.c
231 lines (178 loc) · 6.55 KB
/
dbh.c
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
#include "dbh.h"
extern sqlite3* DBH_dbhnd;
/*
===========================================================================
Funktion: DBH_CreateHandle
Übergabeparameter: nFilePath
Rückgabeparameter: db
Beschreibung: Erstellt einen Handler für die Datenbank
===========================================================================
*/
sqlite3* DBH_CreateHandle( char* nFilePath )
{
sqlite3* db = NULL;
if ( sqlite3_open( nFilePath, &db ) == SQLITE_OK )
return db;
return NULL;
}
/*
===========================================================================
Funktion: DBH_CloseHandle
Übergabeparameter: nHandle
Rückgabeparameter: -
Beschreibung: Schließt den Handler für die Datenbank
===========================================================================
*/
void DBH_CloseHandle( sqlite3* nHandle )
{
sqlite3_close( nHandle );
}
/*
===========================================================================
Funktion: DBH_Query
Übergabeparameter: nQueryString, nCallback, nCallbackArgument, pErrMsgnErrorMsg
Rückgabeparameter: sqlite3_exec
Beschreibung: Prüft, ob ein SQL-Statement vorhanden ist
===========================================================================
*/
s32 DBH_Query( char* nQueryString, DBH_pCallbackFn nCallback, void* nCallbackArgument, char* pErrMsgnErrorMsg )
{
if ( nQueryString == NULL )
return SQLITE_FAIL;
return sqlite3_exec( DBH_dbhnd, nQueryString, nCallback, nCallbackArgument, &pErrMsgnErrorMsg );
}
/*
===========================================================================
Funktion: DBH_UserExistsByName
Übergabeparameter: nUsername
Rückgabeparameter: exists
Beschreibung: Prüft in der Datenbank, ob der Username bereits existiert.
===========================================================================
*/
u8 DBH_UserExistsByName( char* nUsername )
{
struct DBH_sCallbackArgumentPair ap;
ap.rowIter = 0;
char* pQueryString = malloc( 128 );
memset( pQueryString, 0, 128 );
sprintf( pQueryString, "SELECT 1 FROM Users WHERE username = '%s'", nUsername );
DBH_Query( pQueryString, DBH_Callback_GetRowCount, &ap, NULL );
free( pQueryString );
return ap.rowIter;
}
/*
===========================================================================
Funktion: DBH_UserExistsByID
Übergabeparameter: nUserId
Rückgabeparameter: exists
Beschreibung: Prüft in der Datenbank, ob die UserID bereits existiert.
===========================================================================
*/
u8 DBH_UserExistsById( u32 nUserId )
{
struct DBH_sCallbackArgumentPair ap;
ap.rowIter = 0;
char* pQueryString = malloc( 128 );
memset( pQueryString, 0, 128 );
sprintf( pQueryString, "SELECT 1 FROM Users WHERE id = '%d'", nUserId );
DBH_Query( pQueryString, DBH_Callback_GetRowCount, &ap, NULL );
free( pQueryString );
return ap.rowIter;
}
/*
===========================================================================
Funktion: DBH_IsValidAuthByName
Übergabeparameter: nUsername, nPassword
Rückgabeparameter: isValid
Beschreibung: Prüft in der Datenbank, ob die Kombination von Username und
Passwort übereinstimmt.
===========================================================================
*/
u8 DBH_IsValidAuthByName( char* nUsername, char* nPassword )
{
struct DBH_sCallbackArgumentPair ap;
ap.rowIter = 0;
char* pQueryString = malloc( 128 );
memset( pQueryString, 0, 128 );
sprintf( pQueryString, "SELECT 1 FROM Users WHERE username = '%s' and password = '%s'", nUsername, nPassword );
DBH_Query( pQueryString, DBH_Callback_GetRowCount, &ap, NULL );
free( pQueryString );
return ap.rowIter;
}
/*
===========================================================================
Funktion: DBH_IsValidAuthById
Übergabeparameter: nUserId, nPassword
Rückgabeparameter: isValid
Beschreibung: Prüft in der Datenbank, ob die Kombination UserId und
Passwort übereinstimmt.
===========================================================================
*/
u8 DBH_IsValidAuthById( u32 nUserId, char* nPassword )
{
struct DBH_sCallbackArgumentPair ap;
ap.rowIter = 0;
char* pQueryString = malloc( 128 );
memset( pQueryString, 0, 128 );
sprintf( pQueryString, "SELECT 1 FROM Users WHERE id = '%d' and password = '%s'", nUserId, nPassword );
DBH_Query( pQueryString, DBH_Callback_GetRowCount, &ap, NULL );
free( pQueryString );
return ap.rowIter;
}
/*
===========================================================================
Funktion: DBH_RegisterUser
Übergabeparameter: nUsername, nPassword
Rückgabeparameter: uid
Beschreibung: Ermöglicht die Registrierung eines Users in der Datenbank.
===========================================================================
*/
u32 DBH_RegisterUser( char* nUsername, char* nPassword )
{
u32 uid = 0;
if ( DBH_UserExistsByName( nUsername ) ) return uid;
char* pQueryString = malloc( 128 );
memset( pQueryString, 0, 128 );
sprintf( pQueryString, "INSERT INTO Users (username, password) VALUES ('%s', '%s')", nUsername, nPassword );
DBH_Query( pQueryString, NULL, NULL, NULL );
free( pQueryString );
// assumes a maximum user id of 2^32
uid = (u32) sqlite3_last_insert_rowid( DBH_dbhnd );
return uid;
}
/*
===========================================================================
Funktion: DBH_DeleteUser
Übergabeparameter: nUserId, nPassword
Rückgabeparameter: deleted
Beschreibung: Ermöglicht die Löschung eines Users aus der Datenbank.
===========================================================================
*/
u8 DBH_DeleteUser( u8 nUserId, char* nPassword )
{
s32 rc;
u8 deleted = 0;
if ( !DBH_UserExistsById( nUserId ) || !DBH_IsValidAuthById( nUserId, nPassword ) )
return deleted;
char* pQueryString = malloc( 128 );
memset( pQueryString, 0, 128 );
sprintf( pQueryString, "DELETE FROM Users WHERE id = %d", nUserId );
rc = DBH_Query( pQueryString, NULL, NULL, NULL );
free( pQueryString );
if ( rc = SQLITE_OK ) deleted = 1;
return deleted;
}
/*
===========================================================================
Funktion: DBH_Callback_GetRowCount
Übergabeparameter: nCallbackParam, nNumColumns, nColumns, nColumnNames
Rückgabeparameter: 0
Beschreibung: Zählt die Anzahl der Spalten in der Datenbank.
===========================================================================
*/
int DBH_Callback_GetRowCount( void* nCallbackParam, int nNumColumns, char** nColumns, char** nColumnNames )
{
struct DBH_sCallbackArgumentPair* ap = ( struct DBH_sCallbackArgumentPair* ) nCallbackParam;
ap->rowIter += 1;
return 0;
}