93 lines
1.7 KiB
Go
93 lines
1.7 KiB
Go
package database
|
|
|
|
import (
|
|
"database/sql"
|
|
|
|
"github.com/ngn13/website/api/util"
|
|
)
|
|
|
|
type Project struct {
|
|
Name string `json:"name"` // name of the project
|
|
desc string `json:"-"` // description of the project (string)
|
|
Desc Multilang `json:"desc"` // description of the project
|
|
URL string `json:"url"` // URL of the project's homepage/source
|
|
License string `json:"license"` // name of project's license
|
|
}
|
|
|
|
func (p *Project) Load() error {
|
|
return p.Desc.Load(p.desc)
|
|
}
|
|
|
|
func (p *Project) Dump() (err error) {
|
|
p.desc, err = p.Desc.Dump()
|
|
return
|
|
}
|
|
|
|
func (p *Project) Scan(rows *sql.Rows) (err error) {
|
|
if err = rows.Scan(
|
|
&p.Name, &p.desc,
|
|
&p.URL, &p.License); err != nil {
|
|
return err
|
|
}
|
|
|
|
return p.Load()
|
|
}
|
|
|
|
func (p *Project) IsValid() bool {
|
|
return p.Name != "" && p.URL != "" && !p.Desc.Empty()
|
|
}
|
|
|
|
func (db *Type) ProjectNext(p *Project) bool {
|
|
var err error
|
|
|
|
if nil == db.rows {
|
|
if db.rows, err = db.sql.Query("SELECT * FROM " + TABLE_PROJECTS); err != nil {
|
|
util.Fail("failed to query table: %s", err.Error())
|
|
goto fail
|
|
}
|
|
}
|
|
|
|
if !db.rows.Next() {
|
|
goto fail
|
|
}
|
|
|
|
if err = p.Scan(db.rows); err != nil {
|
|
util.Fail("failed to scan the table: %s", err.Error())
|
|
goto fail
|
|
}
|
|
|
|
return true
|
|
|
|
fail:
|
|
if db.rows != nil {
|
|
db.rows.Close()
|
|
}
|
|
db.rows = nil
|
|
|
|
return false
|
|
}
|
|
|
|
func (db *Type) ProjectRemove(name string) error {
|
|
_, err := db.sql.Exec(
|
|
"DELETE FROM "+TABLE_PROJECTS+" WHERE name = ?",
|
|
name,
|
|
)
|
|
|
|
return err
|
|
}
|
|
|
|
func (db *Type) ProjectAdd(p *Project) (err error) {
|
|
if err = p.Dump(); err != nil {
|
|
return err
|
|
}
|
|
|
|
_, err = db.sql.Exec(
|
|
"INSERT OR REPLACE INTO "+TABLE_PROJECTS+`(
|
|
name, desc, url, license
|
|
) values(?, ?, ?, ?)`,
|
|
p.Name, p.desc, p.URL, p.License,
|
|
)
|
|
|
|
return err
|
|
}
|