Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
I
invinoveritas
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Deploy
Releases
Package Registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
gbe
invinoveritas
Commits
af82a63f
Commit
af82a63f
authored
3 years ago
by
gbe
Browse files
Options
Downloads
Patches
Plain Diff
Move DB stuff into separate file
parent
97bef402
No related branches found
No related tags found
No related merge requests found
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
db.go
+93
-0
93 additions, 0 deletions
db.go
main.go
+0
-85
0 additions, 85 deletions
main.go
migrations/0001-initial.sql
+6
-0
6 additions, 0 deletions
migrations/0001-initial.sql
with
99 additions
and
85 deletions
db.go
0 → 100644
+
93
−
0
View file @
af82a63f
package
main
import
(
"embed"
"errors"
"fmt"
"io/fs"
"log"
"sort"
"github.com/jmoiron/sqlx"
)
//go:embed migrations/*.sql
var
migrationFS
embed
.
FS
func
initDB
(
db
*
sqlx
.
DB
)
error
{
// Create table tracking migration state
const
query
=
`CREATE TABLE IF NOT EXISTS migrations (name TEXT UNIQUE);`
_
,
err
:=
db
.
Exec
(
query
)
if
err
!=
nil
{
return
err
}
entries
,
err
:=
migrationFS
.
ReadDir
(
"migrations"
)
if
err
!=
nil
{
return
err
}
sort
.
Slice
(
entries
,
func
(
i
,
j
int
)
bool
{
return
entries
[
i
]
.
Name
()
<
entries
[
j
]
.
Name
()
})
for
_
,
e
:=
range
entries
{
data
,
err
:=
fs
.
ReadFile
(
migrationFS
,
"migrations/"
+
e
.
Name
())
if
err
!=
nil
{
return
err
}
tx
,
err
:=
db
.
Begin
()
if
err
!=
nil
{
return
err
}
row
:=
tx
.
QueryRow
(
"SELECT count(*) FROM migrations WHERE name = ?"
,
e
.
Name
())
var
howMany
int
err
=
row
.
Scan
(
&
howMany
)
if
err
!=
nil
{
tx
.
Rollback
()
return
fmt
.
Errorf
(
"checking status for migration %s: %w"
,
e
.
Name
(),
err
)
}
switch
howMany
{
case
0
:
// not yet applied
case
1
:
// applied, no need to do anything
log
.
Printf
(
"skipping migration %s: already applied"
,
e
.
Name
())
tx
.
Rollback
()
continue
default
:
// very weird
tx
.
Rollback
()
return
fmt
.
Errorf
(
"unexpected migration count for %s: %d"
,
e
.
Name
(),
howMany
)
}
log
.
Println
(
"applying migration"
,
e
.
Name
())
_
,
err
=
tx
.
Exec
(
string
(
data
))
if
err
!=
nil
{
tx
.
Rollback
()
return
fmt
.
Errorf
(
"applying migration %s: %w"
,
e
.
Name
(),
err
)
}
// Record migration as applied
_
,
err
=
tx
.
Exec
(
"INSERT INTO migrations (name) VALUES (?)"
,
e
.
Name
())
if
err
!=
nil
{
tx
.
Rollback
()
return
fmt
.
Errorf
(
"recording migration %s: %w"
,
e
.
Name
(),
err
)
}
err
=
tx
.
Commit
()
if
err
!=
nil
{
return
err
}
log
.
Println
(
"it has"
,
len
(
data
),
"bytes"
)
}
return
errors
.
New
(
"here be dragons"
)
}
This diff is collapsed.
Click to expand it.
main.go
+
0
−
85
View file @
af82a63f
...
...
@@ -2,13 +2,9 @@ package main
import
(
"embed"
"errors"
"fmt"
"html/template"
"io/fs"
"log"
"net/http"
"sort"
"github.com/jmoiron/sqlx"
_
"modernc.org/sqlite"
// Imported for side effects: registers DB driver
...
...
@@ -21,87 +17,6 @@ var templates = template.Must(template.ParseFS(templateFS, "templates/*.tpl"))
//go:embed static/*
var
staticFS
embed
.
FS
//go:embed migrations/*.sql
var
migrationFS
embed
.
FS
func
initDB
(
db
*
sqlx
.
DB
)
error
{
// Create table tracking migration state
const
query
=
`CREATE TABLE IF NOT EXISTS migrations (name TEXT UNIQUE);`
_
,
err
:=
db
.
Exec
(
query
)
if
err
!=
nil
{
return
err
}
entries
,
err
:=
migrationFS
.
ReadDir
(
"migrations"
)
if
err
!=
nil
{
return
err
}
sort
.
Slice
(
entries
,
func
(
i
,
j
int
)
bool
{
return
entries
[
i
]
.
Name
()
<
entries
[
j
]
.
Name
()
})
for
_
,
e
:=
range
entries
{
data
,
err
:=
fs
.
ReadFile
(
migrationFS
,
"migrations/"
+
e
.
Name
())
if
err
!=
nil
{
return
err
}
tx
,
err
:=
db
.
Begin
()
if
err
!=
nil
{
return
err
}
row
:=
tx
.
QueryRow
(
"SELECT count(*) FROM migrations WHERE name = ?"
,
e
.
Name
())
var
howMany
int
err
=
row
.
Scan
(
&
howMany
)
if
err
!=
nil
{
tx
.
Rollback
()
return
fmt
.
Errorf
(
"checking status for migration %s: %w"
,
e
.
Name
(),
err
)
}
switch
howMany
{
case
0
:
// not yet applied
case
1
:
// applied, no need to do anything
log
.
Printf
(
"skipping migration %s: already applied"
,
e
.
Name
())
tx
.
Rollback
()
continue
default
:
// very weird
tx
.
Rollback
()
return
fmt
.
Errorf
(
"unexpected migration count for %s: %d"
,
e
.
Name
(),
howMany
)
}
log
.
Println
(
"applying migration"
,
e
.
Name
())
_
,
err
=
tx
.
Exec
(
string
(
data
))
if
err
!=
nil
{
tx
.
Rollback
()
return
fmt
.
Errorf
(
"applying migration %s: %w"
,
e
.
Name
(),
err
)
}
// Record migration as applied
_
,
err
=
tx
.
Exec
(
"INSERT INTO migrations (name) VALUES (?)"
,
e
.
Name
())
if
err
!=
nil
{
tx
.
Rollback
()
return
fmt
.
Errorf
(
"recording migration %s: %w"
,
e
.
Name
(),
err
)
}
err
=
tx
.
Commit
()
if
err
!=
nil
{
return
err
}
log
.
Println
(
"it has"
,
len
(
data
),
"bytes"
)
}
return
errors
.
New
(
"here be dragons"
)
}
func
main
()
{
db
,
err
:=
sqlx
.
Open
(
"sqlite"
,
"vino.sqlite"
)
if
err
!=
nil
{
...
...
This diff is collapsed.
Click to expand it.
migrations/0001-initial.sql
+
6
−
0
View file @
af82a63f
CREATE
TABLE
wines
(
name
TEXT
,
rating
INT
,
-- number of stars
picture
BINARY
,
-- jpeg/png image of the label on the bottle
UNIQUE
(
name
)
);
\ No newline at end of file
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment