Skip to content

Commit b9ae7c3

Browse files
committed
v0.2: Discontinue core/core116 seperation. Upgrade to Go 1.21+ for log/slog support in favor of harwoeck/liblog
1 parent d6ee3bd commit b9ae7c3

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+372
-386
lines changed

README.md

+16-15
Original file line numberDiff line numberDiff line change
@@ -19,33 +19,33 @@
1919
- **Embed migration folders** containing your SQL scripts
2020
- Hardcoded SQL statements
2121
- 🟢 **Branching and merging compatible:** _adapt_ automatically catches up with missing migrations ("holes")
22-
- 🟢 **Zero** external dependencies*
23-
24-
<sub>* <i>adapt</i> includes <a href="https://pkg.go.dev/github.com/harwoeck/liblog/contract">liblog/contract</a> (a public contract - Go <code>interface</code> - for logging backends, so you can provide your own structured, leveled logging)
22+
- 🟢 **Zero** external dependencies
23+
- 🟢 **Customizable Logging:** _adapt_ uses [`slog`](https://pkg.go.dev/log/slog) [included with Go 1.21+](https://go.dev/blog/slog) so that you can provide your own logging backend.
2524

2625
#### Supported Storage `Driver`
2726

28-
- [File](https://pkg.go.dev/github.com/harwoeck/adapt/core#NewFileDriver) - Basic driver that stores migration meta-data in a local JSON file (demonstrates how a `Driver` without any reliance or dependency on `database/sql` can be written.)
29-
- [MySQL / MariaDB](https://pkg.go.dev/github.com/harwoeck/adapt/core#NewMySQLDriver)
30-
- [SQLite](https://pkg.go.dev/github.com/harwoeck/adapt/core#NewSQLiteDriver)
31-
- [PostgreSQL](https://pkg.go.dev/github.com/harwoeck/adapt/core#NewPostgresDriver)
27+
- [File](https://pkg.go.dev/github.com/harwoeck/adapt#NewFileDriver) - Basic driver that stores migration meta-data in a local JSON file (demonstrates how a `Driver` without any reliance or dependency on `database/sql` can be written.)
28+
- [MySQL / MariaDB](https://pkg.go.dev/github.com/harwoeck/adapt#NewMySQLDriver)
29+
- [SQLite](https://pkg.go.dev/github.com/harwoeck/adapt#NewSQLiteDriver)
30+
- [PostgreSQL](https://pkg.go.dev/github.com/harwoeck/adapt#NewPostgresDriver)
3231
- [Add driver ?](https://github.com/harwoeck/adapt/issues/new)
3332

34-
**Any other storage backend** by providing your own [`Driver`](https://pkg.go.dev/github.com/harwoeck/adapt/core#Driver), [`DatabaseDriver`](https://pkg.go.dev/github.com/harwoeck/adapt/core#DatabaseDriver) or [`SqlStatementsDriver`](https://pkg.go.dev/github.com/harwoeck/adapt/core#SqlStatementsDriver). Unlike most other migration tools, with _adapt_ there is no reliance on `database/sql` (such a case can be seen with the included `FileDriver`)
33+
**Any other storage backend** by providing your own [`Driver`](https://pkg.go.dev/github.com/harwoeck/adapt#Driver), [`DatabaseDriver`](https://pkg.go.dev/github.com/harwoeck/adapt#DatabaseDriver) or [`SqlStatementsDriver`](https://pkg.go.dev/github.com/harwoeck/adapt#SqlStatementsDriver). Unlike most other migration tools, with _adapt_ there is no reliance on `database/sql` (such a case can be seen with the included `FileDriver`)
3534

3635
#### Supported Migrations
3736

38-
- [Go Code](https://pkg.go.dev/github.com/harwoeck/adapt/core#NewCodePackageSource)
39-
- [Filesystem](https://pkg.go.dev/github.com/harwoeck/adapt/core#NewFilesystemSource)
40-
- [In-memory](https://pkg.go.dev/github.com/harwoeck/adapt/core#NewMemoryFSSource)
41-
- [Embedded Filesystem](https://pkg.go.dev/github.com/harwoeck/adapt/core116#NewEmbedFSSource) - Using Go 1.16+ [go:embed](https://pkg.go.dev/embed)
37+
- [Go Code](https://pkg.go.dev/github.com/harwoeck/adapt#NewCodePackageSource)
38+
- [Filesystem](https://pkg.go.dev/github.com/harwoeck/adapt#NewFilesystemSource)
39+
- [In-memory](https://pkg.go.dev/github.com/harwoeck/adapt#NewMemoryFSSource)
40+
- [Embedded Filesystem](https://pkg.go.dev/github.com/harwoeck/adapt#NewEmbedFSSource) - Using Go 1.16+ [go:embed](https://pkg.go.dev/embed)
4241

42+
> [!NOTE]
4343
> Please support this project and provide additional sources that could be useful for other people
4444
4545
### Install
4646

4747
```bash
48-
$ go get github.com/harwoeck/adapt/core
48+
$ go get github.com/harwoeck/adapt
4949
```
5050

5151
## Usage
@@ -61,13 +61,14 @@ err := adapt.Migrate(
6161
})
6262
```
6363

64-
**Next example:** Due to compliance rules you decide encrypt the email address of your users inside your database. Using _adapt_ you simply provide one of [`adapt.Hook`](https://pkg.go.dev/github.com/harwoeck/adapt/core#Hook)'s callback functions and during your next deployment _adapt_ will notice that this migration hasn't been applied and therefore call your migration hook. When no error is returned _adapt_ will commit the transaction and update the schema table with the relevant meta information.
64+
> [!NOTE]
65+
> **Next example:** Due to compliance rules you decide to encrypt your users email addresses inside your database. Since this requires actual Go code (and not just SQL statements), you could implement one of the [`adapt.Hook`](https://pkg.go.dev/github.com/harwoeck/adapt#Hook) functions and during your next deployment _adapt_ will notice this new unapplied migration and execute your hook. When no error is returned _adapt_ will commit the transaction and update the schema table with the relevant meta information.
6566
6667
```go
6768
err := adapt.Migrate(
6869
"[email protected]", // <name> of executor
6970
adapt.NewMySQLDriver(db), // Database driver
70-
adapt.SourceCollection{
71+
adapt.SourceCollection{ // adapt will automatically merge and sort all provided sources for you
7172
adapt.NewFilesystemSource("./sql"), // SQL-Migration-Scripts from filesystem
7273
adapt.NewCodeSource("2020-04-17_1104_encrypt-user-email", adapt.Hook{
7374
MigrateUpTx: func(tx *sql.Tx) error {

core/adapt.go renamed to adapt.go

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
1-
package core
1+
package adapt
22

33
const (
44
// Version is the package's version string used to store in meta tables
5-
Version = "adapt@v0.1.0"
5+
Version = "adapt@v0.2.0"
66
)
77

88
/*
99
Migrate migrates all available migrations in your SourceCollection against the
10-
Driver, when they weren't already run before.
10+
Driver, when they weren't already applied before.
1111
1212
Example:
13+
1314
var db *sql.DB = getDB()
1415
1516
err := adapt.Migrate(
@@ -19,7 +20,7 @@ Example:
1920
adapt.MySQLDriverOptionDisableTx,
2021
),
2122
adapt.SourceCollection{
22-
adapt116.NewEmbedFSSource(nil, ""),
23+
adapt.NewEmbedFSSource(embedFS, "foo/bar/directory"),
2324
adapt.NewMemoryFSSource(map[string]string{}),
2425
adapt.NewCodeSource("x", adapt.Hook{
2526
MigrateUpTx: func(tx *sql.Tx) error {

core/adapt_test.go renamed to adapt_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package core
1+
package adapt
22

33
import (
44
"os"

core/exec_init.go

-30
This file was deleted.

core/go.mod

-5
This file was deleted.

core/go.sum

-2
This file was deleted.

core/logfield.go

-20
This file was deleted.

core116/go.mod

-5
This file was deleted.

core116/go.sum

-4
This file was deleted.

core116/source_embedfs.go

-32
This file was deleted.

core/dialect_mysql.go renamed to dialect_mysql.go

+23-21
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
1-
package core
1+
package adapt
22

33
import (
44
"context"
55
"database/sql"
66
"fmt"
7+
"log/slog"
78
"strings"
89
"time"
9-
10-
logger "github.com/harwoeck/liblog/contract"
1110
)
1211

1312
// MySQLOption provides configuration values for a DatabaseDriver implementing the
@@ -22,7 +21,7 @@ func MySQLDBName(dbName string) MySQLOption {
2221
return func(driver *mysqlDriver) error {
2322
dbName = strings.TrimSpace(dbName)
2423
if len(dbName) == 0 {
25-
return fmt.Errorf("adapt/core.mysqlDriver: dbName cannot be empty")
24+
return fmt.Errorf("adapt.mysqlDriver: dbName cannot be empty")
2625
}
2726

2827
driver.dbName = dbName
@@ -36,12 +35,13 @@ func MySQLDBName(dbName string) MySQLOption {
3635
// by default.
3736
//
3837
// The default script used is:
39-
// CREATE DATABASE IF NOT EXISTS %s CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
38+
//
39+
// CREATE DATABASE IF NOT EXISTS %s CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
4040
func MySQLDBCreateStatement(stmt string) MySQLOption {
4141
return func(driver *mysqlDriver) error {
4242
stmt = strings.TrimSpace(stmt)
4343
if len(stmt) == 0 {
44-
return fmt.Errorf("adapt/core.mysqlDriver: stmt cannot be empty")
44+
return fmt.Errorf("adapt.mysqlDriver: stmt cannot be empty")
4545
}
4646

4747
driver.dbCreateStmt = stmt
@@ -55,7 +55,7 @@ func MySQLTableName(tableName string) MySQLOption {
5555
return func(driver *mysqlDriver) error {
5656
tn := strings.TrimSpace(tableName)
5757
if len(tn) == 0 {
58-
return fmt.Errorf("adapt/core.mysqlDriver: tableName cannot be empty")
58+
return fmt.Errorf("adapt.mysqlDriver: tableName cannot be empty")
5959
}
6060

6161
driver.tableName = tn
@@ -109,12 +109,12 @@ func NewMySQLDriver(db *sql.DB, opts ...MySQLOption) DatabaseDriver {
109109
}
110110

111111
type mysqlDriver struct {
112+
log *slog.Logger
112113
db *sql.DB
113114
opts []MySQLOption
114115
dbName string
115116
dbCreateStmt string
116117
tableName string
117-
log logger.Logger
118118
txBeginOptsFactory func() (context.Context, *sql.TxOptions)
119119
txDisabled bool
120120
optDisableDBClose bool
@@ -124,13 +124,14 @@ func (d *mysqlDriver) Name() string {
124124
return "driver_mysql"
125125
}
126126

127-
func (d *mysqlDriver) Init(log logger.Logger) error {
128-
d.log = log.Named(d.Name())
127+
func (d *mysqlDriver) Init(log *slog.Logger) error {
128+
d.log = log
129129

130130
for _, opt := range d.opts {
131131
err := opt(d)
132132
if err != nil {
133-
return d.log.ErrorReturn("init failed due to option error", field("error", err))
133+
d.log.Error("init failed due to option error", "error", err)
134+
return err
134135
}
135136
}
136137

@@ -141,17 +142,18 @@ func (d *mysqlDriver) Init(log logger.Logger) error {
141142

142143
func (d *mysqlDriver) Healthy() error {
143144
if d.db == nil {
144-
return d.log.ErrorReturn("not healthy: provided db is nil")
145+
return fmt.Errorf("adapt.mysqlDriver: not healthy: provided db is nil")
145146
}
146147
if err := d.db.Ping(); err != nil {
147-
return d.log.ErrorReturn("not healthy: pinging db errors", field("error", err))
148+
d.log.Error("not healthy: pinging db errors", "error", err)
149+
return err
148150
}
149151

150152
createDB := fmt.Sprintf(d.dbCreateStmt, d.dbName)
151153
_, err := d.DB().Exec(createDB)
152154
if err != nil {
153-
return d.log.ErrorReturn("failed to create or check if database exists",
154-
field("error", err))
155+
d.log.Error("failed to create or check if database exists", "error", err)
156+
return err
155157
}
156158

157159
createTable := fmt.Sprintf(`CREATE TABLE IF NOT EXISTS %s
@@ -170,8 +172,8 @@ func (d *mysqlDriver) Healthy() error {
170172
);`, d.tableName)
171173
_, err = d.DB().Exec(createTable)
172174
if err != nil {
173-
return d.log.ErrorReturn("failed to create or check if table exists",
174-
field("error", err))
175+
d.log.Error("failed to create or check if table exists", "error", err)
176+
return err
175177
}
176178

177179
return nil
@@ -182,13 +184,13 @@ func (d *mysqlDriver) SupportsLocks() bool {
182184
}
183185

184186
func (d *mysqlDriver) AcquireLock() (query string) {
185-
d.log.DPanic("not supported")
186-
return ""
187+
d.log.Error("not supported")
188+
panic("not supported")
187189
}
188190

189191
func (d *mysqlDriver) ReleaseLock() (query string) {
190-
d.log.DPanic("not supported")
191-
return ""
192+
d.log.Error("not supported")
193+
panic("not supported")
192194
}
193195

194196
func (d *mysqlDriver) ListMigrations() (query string) {

0 commit comments

Comments
 (0)