-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAccounts.pgc
More file actions
96 lines (76 loc) · 2.35 KB
/
Accounts.pgc
File metadata and controls
96 lines (76 loc) · 2.35 KB
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
#include <string.h>
#include <pgtypes_timestamp.h>
#include "Accounts.h"
EXEC SQL WHENEVER SQLWARNING SQLPRINT;
EXEC SQL WHENEVER SQLERROR SQLPRINT;
EXEC SQL WHENEVER NOT FOUND CONTINUE;
void CreateAccountsTable()
{
EXEC SQL CREATE EXTENSION IF NOT EXISTS pgcrypto;
EXEC SQL CREATE TABLE Accounts
(
AccountId serial PRIMARY KEY,
Nickname varchar(20) NOT NULL UNIQUE,
RegistrationDateTime timestamp NOT NULL DEFAULT current_timestamp,
LoginDateTime timestamp,
PasswordHash char(34) NOT NULL
);
EXEC SQL COMMIT;
}
void DropAccountsTable()
{
EXEC SQL DROP TABLE IF EXISTS Accounts CASCADE;
EXEC SQL COMMIT;
}
void Register(char* login, char* password)
{
EXEC SQL BEGIN DECLARE SECTION;
char* login_ = login;
char* password_ = password;
EXEC SQL END DECLARE SECTION;
EXEC SQL INSERT INTO Accounts (Nickname, PasswordHash) VALUES (:login_, crypt(:password_, gen_salt('md5')));
EXEC SQL COMMIT;
}
bool Login(char* login, char* password)
{
EXEC SQL BEGIN DECLARE SECTION;
char* login_ = login;
char* password_ = password;
bool res = false;
EXEC SQL END DECLARE SECTION;
EXEC SQL SELECT (PasswordHash = crypt(:password_, PasswordHash)) INTO :res FROM Accounts WHERE Nickname = :login_;
if (res)
{
EXEC SQL UPDATE Accounts SET LoginDateTime = current_timestamp WHERE Nickname = :login_;
}
EXEC SQL COMMIT;
return res;
}
void GetAccountInfo(char* nickname, int* outAccountId, char* outTimeLogin, char* outTimeRegister)
{
EXEC SQL BEGIN DECLARE SECTION;
char* nickname_ = nickname;
timestamp loginTs;
timestamp registerTs;
int accountId;
int loginTs_ind;
EXEC SQL END DECLARE SECTION;
EXEC SQL SELECT AccountId, RegistrationDateTime, LoginDateTime
INTO :accountId, :registerTs, :loginTs :loginTs_ind
FROM Accounts
WHERE Nickname = :nickname_;
*outAccountId = accountId;
char* registerStr = PGTYPEStimestamp_to_asc(registerTs);
strcpy(outTimeRegister, registerStr);
PGTYPESchar_free(registerStr);
if (loginTs_ind == 0)
{
char* loginStr = PGTYPEStimestamp_to_asc(loginTs);
strcpy(outTimeLogin, loginStr);
PGTYPESchar_free(loginStr);
}
else
{
strcpy(outTimeLogin, "NULL");
}
}