Implement zone management in levelDB driver: now fully implemented
This commit is contained in:
parent
53e6b315c7
commit
92896d8a84
|
@ -101,12 +101,12 @@ func apiAuthHandler(f func(*config.Options, *happydns.User, httprouter.Params, i
|
|||
err: err,
|
||||
status: http.StatusUnauthorized,
|
||||
}.WriteResponse(w)
|
||||
} else if session, err := storage.UsersStore.GetSession(sessionid); err != nil {
|
||||
} else if session, err := storage.MainStore.GetSession(sessionid); err != nil {
|
||||
APIErrorResponse{
|
||||
err: err,
|
||||
status: http.StatusUnauthorized,
|
||||
}.WriteResponse(w)
|
||||
} else if std, err := storage.UsersStore.GetUser(int(session.IdUser)); err != nil {
|
||||
} else if std, err := storage.MainStore.GetUser(int(session.IdUser)); err != nil {
|
||||
APIErrorResponse{
|
||||
err: err,
|
||||
status: http.StatusUnauthorized,
|
||||
|
|
|
@ -52,7 +52,7 @@ func dummyAuth(_ httprouter.Params, body io.Reader) Response {
|
|||
}
|
||||
}
|
||||
|
||||
if user, err := storage.UsersStore.GetUserByEmail(lf.Email); err != nil {
|
||||
if user, err := storage.MainStore.GetUserByEmail(lf.Email); err != nil {
|
||||
return APIErrorResponse{
|
||||
err: err,
|
||||
}
|
||||
|
@ -64,7 +64,7 @@ func dummyAuth(_ httprouter.Params, body io.Reader) Response {
|
|||
}
|
||||
}
|
||||
|
||||
if err := storage.UsersStore.CreateSession(session); err != nil {
|
||||
if err := storage.MainStore.CreateSession(session); err != nil {
|
||||
return APIErrorResponse{
|
||||
err: err,
|
||||
}
|
||||
|
@ -88,7 +88,7 @@ func checkAuth(_ httprouter.Params, body io.Reader) Response {
|
|||
}
|
||||
}
|
||||
|
||||
if user, err := storage.UsersStore.GetUserByEmail(lf.Email); err != nil {
|
||||
if user, err := storage.MainStore.GetUserByEmail(lf.Email); err != nil {
|
||||
return APIErrorResponse{
|
||||
err: err,
|
||||
}
|
||||
|
@ -105,7 +105,7 @@ func checkAuth(_ httprouter.Params, body io.Reader) Response {
|
|||
}
|
||||
}
|
||||
|
||||
if err := storage.UsersStore.CreateSession(session); err != nil {
|
||||
if err := storage.MainStore.CreateSession(session); err != nil {
|
||||
return APIErrorResponse{
|
||||
err: err,
|
||||
}
|
||||
|
|
|
@ -40,7 +40,7 @@ func registerUser(opts *config.Options, p httprouter.Params, body io.Reader) Res
|
|||
return APIErrorResponse{
|
||||
err: err,
|
||||
}
|
||||
} else if err := storage.UsersStore.CreateUser(user); err != nil {
|
||||
} else if err := storage.MainStore.CreateUser(user); err != nil {
|
||||
return APIErrorResponse{
|
||||
err: err,
|
||||
}
|
||||
|
|
15
main.go
15
main.go
|
@ -13,7 +13,6 @@ import (
|
|||
"git.happydns.org/happydns/config"
|
||||
"git.happydns.org/happydns/storage"
|
||||
leveldb "git.happydns.org/happydns/storage/leveldb"
|
||||
mysql "git.happydns.org/happydns/storage/mysql"
|
||||
)
|
||||
|
||||
type ResponseWriterPrefix struct {
|
||||
|
@ -71,27 +70,17 @@ func main() {
|
|||
|
||||
// Initialize contents
|
||||
log.Println("Opening database...")
|
||||
if store, err := mysql.NewMySQLStorage(opts.DSN); err != nil {
|
||||
log.Fatal("Cannot open the database: ", err)
|
||||
} else {
|
||||
storage.MainStore = store
|
||||
}
|
||||
defer storage.MainStore.Close()
|
||||
|
||||
if store, err := leveldb.NewLevelDBStorage("happydns.db"); err != nil {
|
||||
log.Fatal("Cannot open the database: ", err)
|
||||
} else {
|
||||
storage.UsersStore = store
|
||||
defer store.Close()
|
||||
storage.MainStore = store
|
||||
}
|
||||
defer storage.UsersStore.Close()
|
||||
|
||||
log.Println("Do database migrations...")
|
||||
if err = storage.MainStore.DoMigration(); err != nil {
|
||||
log.Fatal("Cannot migrate database: ", err)
|
||||
}
|
||||
if err = storage.UsersStore.DoMigration(); err != nil {
|
||||
log.Fatal("Cannot migrate users database: ", err)
|
||||
}
|
||||
|
||||
// Serve content
|
||||
log.Println("Ready, listening on", opts.Bind)
|
||||
|
|
|
@ -33,23 +33,3 @@ type Storage interface {
|
|||
DeleteZone(z *happydns.Zone) error
|
||||
ClearZones() error
|
||||
}
|
||||
|
||||
type UserStorage interface {
|
||||
DoMigration() error
|
||||
Close() error
|
||||
|
||||
GetSession(id []byte) (*happydns.Session, error)
|
||||
CreateSession(session *happydns.Session) error
|
||||
UpdateSession(session *happydns.Session) error
|
||||
DeleteSession(session *happydns.Session) error
|
||||
ClearSessions() error
|
||||
|
||||
GetUsers() (happydns.Users, error)
|
||||
GetUser(id int) (*happydns.User, error)
|
||||
GetUserByEmail(email string) (*happydns.User, error)
|
||||
UserExists(email string) bool
|
||||
CreateUser(user *happydns.User) error
|
||||
UpdateUser(user *happydns.User) error
|
||||
DeleteUser(user *happydns.User) error
|
||||
ClearUsers() error
|
||||
}
|
||||
|
|
|
@ -0,0 +1,127 @@
|
|||
package database
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"git.happydns.org/happydns/model"
|
||||
|
||||
"github.com/syndtr/goleveldb/leveldb"
|
||||
"github.com/syndtr/goleveldb/leveldb/util"
|
||||
)
|
||||
|
||||
func (s *LevelDBStorage) GetZones(u *happydns.User) (zones happydns.Zones, err error) {
|
||||
iter := s.search("zone-")
|
||||
defer iter.Release()
|
||||
|
||||
for iter.Next() {
|
||||
var z happydns.Zone
|
||||
|
||||
err = decodeData(iter.Value(), &z)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
if z.IdUser == u.Id {
|
||||
zones = append(zones, &z)
|
||||
}
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func (s *LevelDBStorage) GetZone(u *happydns.User, id int) (z *happydns.Zone, err error) {
|
||||
z = &happydns.Zone{}
|
||||
err = s.get(fmt.Sprintf("zone-%d", id), &z)
|
||||
|
||||
if z.IdUser != u.Id {
|
||||
z = nil
|
||||
err = leveldb.ErrNotFound
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func (s *LevelDBStorage) GetZoneByDN(u *happydns.User, dn string) (*happydns.Zone, error) {
|
||||
zones, err := s.GetZones(u)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, zone := range zones {
|
||||
if zone.DomainName == dn {
|
||||
return zone, nil
|
||||
}
|
||||
}
|
||||
|
||||
return nil, leveldb.ErrNotFound
|
||||
}
|
||||
|
||||
func (s *LevelDBStorage) ZoneExists(dn string) bool {
|
||||
iter := s.search("zone-")
|
||||
defer iter.Release()
|
||||
|
||||
for iter.Next() {
|
||||
var z happydns.Zone
|
||||
|
||||
err := decodeData(iter.Value(), &z)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
|
||||
if z.DomainName == dn {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
func (s *LevelDBStorage) CreateZone(u *happydns.User, z *happydns.Zone) error {
|
||||
key, id, err := s.findInt63Key("zone-")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
z.Id = id
|
||||
z.IdUser = u.Id
|
||||
return s.put(key, z)
|
||||
}
|
||||
|
||||
func (s *LevelDBStorage) UpdateZone(z *happydns.Zone) error {
|
||||
return s.put(fmt.Sprintf("zone-%d", z.Id), z)
|
||||
}
|
||||
|
||||
func (s *LevelDBStorage) UpdateZoneOwner(z *happydns.Zone, newOwner *happydns.User) error {
|
||||
z.IdUser = newOwner.Id
|
||||
return s.put(fmt.Sprintf("zone-%d", z.Id), z)
|
||||
}
|
||||
|
||||
func (s *LevelDBStorage) DeleteZone(z *happydns.Zone) error {
|
||||
return s.delete(fmt.Sprintf("zone-%d", z.Id))
|
||||
}
|
||||
|
||||
func (s *LevelDBStorage) ClearZones() error {
|
||||
tx, err := s.db.OpenTransaction()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
iter := tx.NewIterator(util.BytesPrefix([]byte("zone-")), nil)
|
||||
defer iter.Release()
|
||||
|
||||
for iter.Next() {
|
||||
err = tx.Delete(iter.Key(), nil)
|
||||
if err != nil {
|
||||
tx.Discard()
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
err = tx.Commit()
|
||||
if err != nil {
|
||||
tx.Discard()
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
|
@ -1,6 +1,3 @@
|
|||
package storage
|
||||
|
||||
var (
|
||||
MainStore Storage
|
||||
UsersStore UserStorage
|
||||
)
|
||||
var MainStore Storage
|
||||
|
|
Loading…
Reference in New Issue