6 changed files with 15 additions and 119 deletions
-
22database.go
-
3go.mod
-
4go.sum
-
96helpers/packrSource.go
-
1migrations/1_Init_Database.down.sql
-
8migrations/1_Init_Database.sql
@ -1,96 +0,0 @@ |
|||
package helpers |
|||
|
|||
// This is a quick hack to get Packr working with golang-migrate
|
|||
|
|||
import ( |
|||
"bytes" |
|||
"github.com/gobuffalo/packr/v2" |
|||
"github.com/golang-migrate/migrate/v4" |
|||
"github.com/golang-migrate/migrate/v4/source" |
|||
"io" |
|||
"io/ioutil" |
|||
"os" |
|||
"sync" |
|||
) |
|||
|
|||
type PackrSource struct { |
|||
lock sync.Mutex |
|||
Box *packr.Box |
|||
migrations *source.Migrations |
|||
} |
|||
|
|||
func (s *PackrSource) loadMigrations() (*source.Migrations, error) { |
|||
migrations := source.NewMigrations() |
|||
for _, filename := range s.Box.List() { |
|||
migration, err := source.Parse(filename) |
|||
if err != nil { |
|||
return nil, err |
|||
} |
|||
migrations.Append(migration) |
|||
} |
|||
return migrations, nil |
|||
} |
|||
|
|||
func (s *PackrSource) Open(url string) (source.Driver, error) { |
|||
s.lock.Lock() |
|||
defer s.lock.Unlock() |
|||
if migrations, err := s.loadMigrations(); err != nil { |
|||
return nil, err |
|||
} else { |
|||
s.migrations = migrations |
|||
return s, nil |
|||
} |
|||
} |
|||
|
|||
func (s *PackrSource) Close() error { |
|||
s.lock.Lock() |
|||
defer s.lock.Unlock() |
|||
s.migrations = nil |
|||
return nil |
|||
} |
|||
|
|||
func (s *PackrSource) First() (version uint, err error) { |
|||
if v, ok := s.migrations.First(); !ok { |
|||
return 0, os.ErrNotExist |
|||
} else { |
|||
return v, nil |
|||
} |
|||
} |
|||
|
|||
func (s *PackrSource) Prev(version uint) (prevVersion uint, err error) { |
|||
if v, ok := s.migrations.Prev(version); !ok { |
|||
return 0, os.ErrNotExist |
|||
} else { |
|||
return v, nil |
|||
} |
|||
} |
|||
|
|||
func (s *PackrSource) Next(version uint) (nextVersion uint, err error) { |
|||
if v, ok := s.migrations.Next(version); !ok { |
|||
return 0, os.ErrNotExist |
|||
} else { |
|||
return v, nil |
|||
} |
|||
} |
|||
|
|||
func (s *PackrSource) ReadUp(version uint) (r io.ReadCloser, identifier string, err error) { |
|||
if migration, ok := s.migrations.Up(version); !ok { |
|||
return nil, "", os.ErrNotExist |
|||
} else { |
|||
b, _ := s.Box.Find(migration.Raw) |
|||
return ioutil.NopCloser(bytes.NewBuffer(b)), |
|||
migration.Identifier, |
|||
nil |
|||
} |
|||
} |
|||
|
|||
func (s *PackrSource) ReadDown(version uint) (r io.ReadCloser, identifier string, err error) { |
|||
if migration, ok := s.migrations.Down(version); !ok { |
|||
return nil, "", migrate.ErrNilVersion |
|||
} else { |
|||
b := s.Box.Bytes(migration.Raw) |
|||
return ioutil.NopCloser(bytes.NewBuffer(b)), |
|||
migration.Identifier, |
|||
nil |
|||
} |
|||
} |
@ -1 +0,0 @@ |
|||
DROP TABLE `views`; |
@ -1,6 +1,10 @@ |
|||
CREATE TABLE `views` |
|||
-- +migrate Up |
|||
CREATE TABLE IF NOT EXISTS `views` |
|||
( |
|||
`url` TEXT NOT NULL, |
|||
`time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, |
|||
`ref` TEXT DEFAULT '' NOT NULL |
|||
); |
|||
); |
|||
|
|||
-- +migrate Down |
|||
DROP TABLE `views`; |
Write
Preview
Loading…
Cancel
Save
Reference in new issue