212 lines
4.7 KiB
Go
212 lines
4.7 KiB
Go
package database
|
|
|
|
import (
|
|
"database/sql"
|
|
"git.kingpenguin.tk/chteufleur/go-xmpp4steam.git/logger"
|
|
_ "github.com/mattn/go-sqlite3"
|
|
)
|
|
|
|
const (
|
|
DatabaseFileName = "go_xmpp4steam.db"
|
|
|
|
createDatabaseStmt = "create table if not exists users (jid text not null primary key, steamLogin text, steamPwd text, debug int);"
|
|
insertDatabaseStmt = "insert into users (jid, steamLogin, steamPwd, debug) values(?, ?, ?, ?)"
|
|
deleteDatabaseStmt = "delete from users where jid=?"
|
|
selectDatabaseStmt = "select jid, steamLogin, steamPwd, debug from users where jid=?"
|
|
selectAllDatabaseStmt = "select jid, steamLogin, steamPwd, debug from users"
|
|
updateDatabaseStmt = "update users set steamLogin=?, steamPwd=?, debug=? where jid=?"
|
|
)
|
|
|
|
type DatabaseLine struct {
|
|
Jid string
|
|
SteamLogin string
|
|
SteamPwd string
|
|
Debug bool
|
|
}
|
|
|
|
var (
|
|
db = new(sql.DB)
|
|
DatabaseFile = ""
|
|
)
|
|
|
|
func init() {
|
|
}
|
|
|
|
func Init() {
|
|
logger.Info.Printf("Init database (file %s)", DatabaseFile)
|
|
d, err := sql.Open("sqlite3", DatabaseFile)
|
|
if err != nil {
|
|
logger.Error.Printf("Error on openning database : %v", err)
|
|
}
|
|
db = d
|
|
|
|
_, err = db.Exec(createDatabaseStmt)
|
|
if err != nil {
|
|
logger.Error.Printf("Failed to create table : %v", err)
|
|
}
|
|
}
|
|
|
|
func Close() {
|
|
db.Close()
|
|
}
|
|
|
|
func (newLine *DatabaseLine) AddLine() bool {
|
|
logger.Info.Printf("Add new line %v", newLine)
|
|
|
|
isUserRegistred := getLine(newLine.Jid) != nil
|
|
if isUserRegistred {
|
|
return newLine.UpdateLine()
|
|
}
|
|
|
|
stmt, err := db.Prepare(insertDatabaseStmt)
|
|
if err != nil {
|
|
logger.Error.Printf("Error on insert jid %s : %v", newLine.Jid, err)
|
|
return false
|
|
}
|
|
defer stmt.Close()
|
|
debug := 0
|
|
if newLine.Debug {
|
|
debug = 1
|
|
}
|
|
_, err = stmt.Exec(newLine.Jid, newLine.SteamLogin, newLine.SteamPwd, debug)
|
|
if err != nil {
|
|
logger.Error.Printf("Error on creating SQL statement : %v", err)
|
|
return false
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
func (newLine *DatabaseLine) UpdateLine() bool {
|
|
logger.Info.Printf("Update line %s", newLine.Jid)
|
|
stmt, err := db.Prepare(updateDatabaseStmt)
|
|
if err != nil {
|
|
logger.Error.Printf("Error on update : %v", err)
|
|
return false
|
|
}
|
|
defer stmt.Close()
|
|
debug := 0
|
|
if newLine.Debug {
|
|
debug = 1
|
|
}
|
|
if newLine.SteamPwd == "" {
|
|
oldLine := GetLine(newLine.Jid)
|
|
if oldLine != nil {
|
|
newLine.SteamPwd = oldLine.SteamPwd
|
|
}
|
|
}
|
|
_, err = stmt.Exec(newLine.SteamLogin, newLine.SteamPwd, debug, newLine.Jid)
|
|
if err != nil {
|
|
logger.Error.Printf("Error on updating SQL statement : %v", err)
|
|
return false
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
func (dbUser *DatabaseLine) UpdateUser() bool {
|
|
isUserRegistred := GetLine(dbUser.Jid) != nil
|
|
var isSqlSuccess bool
|
|
if isUserRegistred {
|
|
isSqlSuccess = dbUser.UpdateLine()
|
|
} else {
|
|
isSqlSuccess = dbUser.AddLine()
|
|
}
|
|
return isSqlSuccess
|
|
}
|
|
|
|
func RemoveLine(jid string) bool {
|
|
// Update Steam login and password to blank before deleting,
|
|
// because it is not really deleted in the SQLite file.
|
|
line := new(DatabaseLine)
|
|
line.Jid = jid
|
|
line.UpdateLine()
|
|
|
|
logger.Info.Printf("Remove line %s", jid)
|
|
stmt, err := db.Prepare(deleteDatabaseStmt)
|
|
if err != nil {
|
|
logger.Error.Printf("Error on delete jid %s : %v", jid, err)
|
|
return false
|
|
}
|
|
defer stmt.Close()
|
|
res, err := stmt.Exec(jid)
|
|
if err != nil {
|
|
logger.Error.Printf("Error on delete SQL statement : %v", err)
|
|
return false
|
|
}
|
|
|
|
affect, err := res.RowsAffected()
|
|
if err != nil {
|
|
logger.Error.Printf("Error on delete SQL statement : %v", err)
|
|
return false
|
|
}
|
|
if affect == 0 {
|
|
logger.Debug.Printf("No line affected")
|
|
return false
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
func GetLine(jid string) *DatabaseLine {
|
|
ret := getLine(jid)
|
|
|
|
if ret == nil || ret.SteamLogin == "" {
|
|
logger.Debug.Printf("Line empty")
|
|
return nil
|
|
}
|
|
|
|
return ret
|
|
}
|
|
|
|
func getLine(jid string) *DatabaseLine {
|
|
logger.Info.Printf("Get line %s", jid)
|
|
ret := new(DatabaseLine)
|
|
|
|
stmt, err := db.Prepare(selectDatabaseStmt)
|
|
if err != nil {
|
|
logger.Error.Printf("Error on select line : %v", err)
|
|
return nil
|
|
}
|
|
defer stmt.Close()
|
|
debug := 0
|
|
err = stmt.QueryRow(jid).Scan(&ret.Jid, &ret.SteamLogin, &ret.SteamPwd, &debug)
|
|
if err != nil {
|
|
logger.Error.Printf("Error on select scan : %v", err)
|
|
return nil
|
|
}
|
|
if debug == 1 {
|
|
ret.Debug = true
|
|
} else {
|
|
ret.Debug = false
|
|
}
|
|
|
|
return ret
|
|
}
|
|
|
|
func GetAllLines() []DatabaseLine {
|
|
logger.Info.Printf("Get all lines")
|
|
var ret []DatabaseLine
|
|
|
|
rows, err := db.Query(selectAllDatabaseStmt)
|
|
if err != nil {
|
|
logger.Error.Printf("Error on select query : %v", err)
|
|
}
|
|
defer rows.Close()
|
|
for rows.Next() {
|
|
user := new(DatabaseLine)
|
|
debug := 0
|
|
rows.Scan(&user.Jid, &user.SteamLogin, &user.SteamPwd, &debug)
|
|
if user.SteamLogin != "" {
|
|
if debug == 1 {
|
|
user.Debug = true
|
|
} else {
|
|
user.Debug = false
|
|
}
|
|
ret = append(ret, *user)
|
|
}
|
|
}
|
|
|
|
return ret
|
|
}
|