-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDatabase.cs
130 lines (112 loc) · 4.15 KB
/
Database.cs
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
using System.Data;
using Microsoft.Data.Sqlite;
namespace LionsBlog;
public class Database
{
private SqliteConnection _connection;
private readonly Configuration _configuration;
public Database()
{
_configuration = ConfigurationProvider.GetConfiguration();
var createTheTables = !File.Exists(Path.Combine(Directory.GetCurrentDirectory(), _configuration.DatabaseFilename));
_connection = getConnection();
SetBehavior();
if (createTheTables)
createTables();
}
~Database()
{
_connection.Close();
}
public void SetBehavior()
{
using var connection = getConnection();
var cmd = new SqliteCommand("PRAGMA synchronous = Full", connection);
cmd.ExecuteNonQuery();
}
public SqliteConnection getConnection()
{
if (_connection == null || _connection.State != ConnectionState.Open)
{
_connection = new SqliteConnection($"Data Source={_configuration.DatabaseFilename}; Pooling=True;");
_connection.Open();
}
return _connection;
}
private void createTables()
{
using var connection = getConnection();
// TABLE posts
var cmd = new SqliteCommand(
@"CREATE TABLE ""posts"" (
""id"" INTEGER,
""topic"" TEXT NOT NULL DEFAULT '',
""post"" TEXT NOT NULL DEFAULT '',
""author"" INT NOT NULL DEFAULT 1,
""published"" TEXT NOT NULL DEFAULT (DATETIME('now')),
""lastedit"" TEXT NOT NULL DEFAULT (DATETIME('now')),
""isactive"" INT NOT NULL DEFAULT 0,
""tags"" TEXT NOT NULL DEFAULT '',
PRIMARY KEY(""id"" AUTOINCREMENT)
);"
, connection);
cmd.ExecuteNonQuery();
// TABLE users
cmd = new SqliteCommand(
@"CREATE TABLE ""users"" (
""id"" INTEGER,
""name"" TEXT NOT NULL DEFAULT '',
""screenname"" TEXT NOT NULL DEFAULT '',
""email"" TEXT NOT NULL DEFAULT '',
""enabled"" INT NOT NULL DEFAULT 1,
""passwordhashed"" TEXT NOT NULL DEFAULT '',
PRIMARY KEY(""id"")
);"
, connection);
cmd.ExecuteNonQuery();
cmd = new SqliteCommand(
@"CREATE UNIQUE INDEX ""idx_users_name"" ON ""users"" (
""name""
);"
, connection
);
cmd.ExecuteNonQuery();
// TABLE cookies
cmd = new SqliteCommand(
@"CREATE TABLE ""cookies"" (
""cookiekey"" TEXT NOT NULL,
""name"" TEXT NOT NULL,
""lastused"" TEXT DEFAULT (DATETIME('now')),
""ip"" TEXT NOT NULL,
PRIMARY KEY(""cookiekey"")
);"
, connection);
cmd.ExecuteNonQuery();
cmd = new SqliteCommand(
@"CREATE UNIQUE INDEX ""idx_cookies_token"" ON ""cookies"" (
""cookiekey""
);"
, connection
);
cmd.ExecuteNonQuery();
}
public void createAdminUser()
{
var users = new Users();
// Check if we are recovering or creating a new admin user
var user = users.GetUser(_configuration.DefaultUser);
if (user == null)
{
user = new UserStruct
{
id = 0,
name = _configuration.DefaultUser,
screenname = _configuration.DefaultScreenname,
email = _configuration.DefaultEMail,
enabled = 1,
passwordhashed = ""
};
}
users.AddOrEditUser(user, _configuration.DefaultPassword);
}
}