|
|
|
package shrty
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"encoding/json"
|
|
|
|
"errors"
|
|
|
|
"io"
|
|
|
|
"os"
|
|
|
|
)
|
|
|
|
|
|
|
|
type DB struct {
|
|
|
|
Path string
|
|
|
|
Store *Store
|
|
|
|
}
|
|
|
|
|
|
|
|
type Store struct {
|
|
|
|
Token map[string]*Data `json:"token"` // [token]*Data
|
|
|
|
Url map[string]string `json:"url"` // [hash]token
|
|
|
|
}
|
|
|
|
|
|
|
|
var (
|
|
|
|
ErrNotFound = errors.New("Url not Found")
|
|
|
|
ErrCreateToken = errors.New("There are some problems while creating Token")
|
|
|
|
ErrNoUrl = errors.New("String is no Url!")
|
|
|
|
)
|
|
|
|
|
|
|
|
// Open up
|
|
|
|
func Open(path string) (*DB, error) {
|
|
|
|
s := DB{Path: path,
|
|
|
|
Store: &Store{
|
|
|
|
Token: make(map[string]*Data),
|
|
|
|
Url: make(map[string]string)},
|
|
|
|
}
|
|
|
|
|
|
|
|
// Open db ore create if not exist!
|
|
|
|
if db, err := os.OpenFile(s.Path, os.O_RDWR|os.O_CREATE, 0644); err == nil {
|
|
|
|
json.Unmarshal(StreamToByte(db), &s.Store)
|
|
|
|
db.Close()
|
|
|
|
return &s, nil
|
|
|
|
} else {
|
|
|
|
return &s, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *DB) Remove(URL string) error {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *DB) Save() error {
|
|
|
|
if db, err := os.OpenFile(s.Path, os.O_RDWR|os.O_CREATE, 0644); err == nil {
|
|
|
|
b, err := json.Marshal(s.Store)
|
|
|
|
db.Write(b)
|
|
|
|
db.Close()
|
|
|
|
return err
|
|
|
|
} else {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func StreamToByte(stream io.Reader) []byte {
|
|
|
|
buf := new(bytes.Buffer)
|
|
|
|
buf.ReadFrom(stream)
|
|
|
|
return buf.Bytes()
|
|
|
|
}
|