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