💾 Archived View for gemini.rmf-dev.com › repo › Vaati › Gemigit › files › 4d01721d2fac7ad71c25901591… captured on 2023-04-19 at 23:33:04. Gemini links have been rewritten to link to archived content
-=-=-=-=-=-=-
0 package db
1
2 import (
3 "database/sql"
4 "log"
5 "os"
6 "time"
7
8 _ "github.com/mattn/go-sqlite3"
9 _ "modernc.org/sqlite"
10 _ "github.com/go-sql-driver/mysql"
11 )
12
13 type Repo struct {
14 RepoID int
15 UserID int
16 Username string
17 Name string
18 Date int
19 IsPublic bool
20 Description string
21 }
22
23 type User struct {
24 ID int
25 Name string
26 Description string
27 Registration int
28 Connection time.Time
29 Signature string
30 Secret string
31 SecureGit bool
32 }
33
34 type Group struct {
35 GroupID int
36 Name string
37 Description string
38 }
39
40 type Member struct {
41 Name string
42 UserID int
43 }
44
45 type Access struct {
46 RepoID int
47 GroupID int
48 UserID int
49 Name string
50 Privilege int
51 }
52
53 type Token struct {
54 Hint string
55 Expiration int64
56 ExpirationFormat string
57 UserID int
58 ID int
59 }
60
61 var unixTime string
62
63 var db *sql.DB
64
65 func Init(dbType string, path string, create bool) error {
66
67 isSqlite := dbType == "sqlite3" || dbType == "sqlite"
68
69 if !create && isSqlite {
70 file, err := os.Open(path)
71 if os.IsNotExist(err) {
72 file, err := os.Create(path)
73 if err != nil {
74 return err
75 }
76 file.Close()
77 log.Println("Creating database " + path)
78 create = true
79 } else {
80 file.Close()
81 log.Println("Loading database " + path)
82 }
83 }
84
85 var err error
86 db, err = sql.Open(dbType, path)
87 if err != nil {
88 return err
89 }
90 err = db.Ping()
91 if err != nil {
92 return err
93 }
94 unixTime = "UNIX_TIMESTAMP()"
95 if isSqlite {
96 unixTime = "strftime('%s', 'now')"
97 }
98 if create {
99 return createTable(db, isSqlite)
100 }
101 return nil
102 }
103
104 func Close() error {
105 return db.Close()
106 }
107
108 func createTable(db *sql.DB, isSqlite bool) error {
109 autoincrement := "AUTO_INCREMENT"
110
111 if isSqlite {
112 autoincrement = "AUTOINCREMENT"
113 }
114
115 userTable := `CREATE TABLE user (
116 userID INTEGER NOT NULL PRIMARY KEY ` + autoincrement + `,
117 name TEXT UNIQUE NOT NULL,
118 password TEXT NOT NULL,
119 description TEXT DEFAULT "" NOT NULL,
120 secret TEXT DEFAULT "" NOT NULL,
121 creation INTEGER NOT NULL,
122 securegit INTEGER DEFAULT 0 NOT NULL
123 );`
124
125 groupTable := `CREATE TABLE groups (
126 groupID INTEGER NOT NULL PRIMARY KEY ` + autoincrement + `,
127 owner INTEGER NOT NULL,
128 name TEXT UNIQUE NOT NULL,
129 description TEXT DEFAULT "",
130 creation INTEGER NOT NULL
131 );`
132
133 memberTable := `CREATE TABLE member (
134 groupID INTEGER NOT NULL,
135 userID INTEGER NOT NULL
136 );`
137
138 certificateTable := `CREATE TABLE certificate (
139 userID INTEGER NOT NULL,
140 hash TEXT UNIQUE NOT NULL,
141 creation INTEGER NOT NULL
142 );`
143
144 accessTable := `CREATE TABLE access (
145 repoID INTEGER NOT NULL,
146 groupID INTEGER,
147 userID INTEGER,
148 privilege INTEGER NOT NULL
149 );`
150
151 repoTable := `CREATE TABLE repo (
152 repoID INTEGER NOT NULL PRIMARY KEY ` + autoincrement + `,
153 userID INTEGER NOT NULL,
154 name TEXT NOT NULL,
155 description TEXT DEFAULT "",
156 creation INTEGER NOT NULL,
157 public INTEGER DEFAULT 0,
158 securegit INTEGER DEFAULT 0 NOT NULL
159 );`
160
161 tokenTable := `CREATE TABLE token (
162 tokenID INTEGER NOT NULL PRIMARY KEY ` + autoincrement + `,
163 userID INTEGER NOT NULL,
164 token TEXT NOT NULL,
165 hint TEXT NOT NULL,
166 expiration INTEGER NOT NULL
167 );`
168
169 userConstraint := `CREATE UNIQUE INDEX username_upper ON user (
170 UPPER(name), UPPER(name)
171 );`
172
173 _, err := db.Exec(userTable)
174 if err != nil {
175 return err
176 }
177 log.Println("Users table created")
178
179 _, err = db.Exec(groupTable)
180 if err != nil {
181 return err
182 }
183 log.Println("Groups table created")
184
185 _, err = db.Exec(memberTable)
186 if err != nil {
187 return err
188 }
189 log.Println("Members table created")
190
191 _, err = db.Exec(certificateTable)
192 if err != nil {
193 return err
194 }
195 log.Println("Certificates table created")
196
197 _, err = db.Exec(accessTable)
198 if err != nil {
199 return err
200 }
201 log.Println("Access table created")
202
203 _, err = db.Exec(repoTable)
204 if err != nil {
205 return err
206 }
207 log.Println("Repositories table created")
208
209 _, err = db.Exec(tokenTable)
210 if err != nil {
211 return err
212 }
213 log.Println("Tokens table created")
214
215 _, err = db.Exec(userConstraint)
216 if err != nil {
217 return err
218 }
219 log.Println("Users constraint created")
220
221 return nil
222 }
223