Skip to content

Commit b4b2014

Browse files
authored
Use cgo build flag for enabling sqlite3 driver (#18)
1 parent cd61a03 commit b4b2014

11 files changed

+62
-47
lines changed

gtdb/adapter.go

+13-8
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,26 @@
11
package gtdb
22

33
import (
4-
"strings"
4+
"net/url"
55

66
sq "github.com/Masterminds/squirrel"
77
"github.com/interline-io/gotransit"
88
"github.com/jmoiron/sqlx"
99
)
1010

11-
// NewAdapter returns a Adapter for the given dburl.
12-
func NewAdapter(dburl string) Adapter {
13-
if strings.HasPrefix(dburl, "postgres://") {
14-
return &PostgresAdapter{DBURL: dburl}
15-
} else if strings.HasPrefix(dburl, "sqlite3://") {
16-
return &SpatiaLiteAdapter{DBURL: dburl}
11+
var adapters = map[string]func(string) Adapter{}
12+
13+
// newAdapter returns a Adapter for the given dburl.
14+
func newAdapter(dburl string) Adapter {
15+
u, err := url.Parse(dburl)
16+
if err != nil {
17+
return nil
18+
}
19+
fn, ok := adapters[u.Scheme]
20+
if !ok {
21+
return nil
1722
}
18-
return nil
23+
return fn(dburl)
1924
}
2025

2126
// Adapter implements details specific to each backend.

gtdb/adapter_benchmark_test.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import (
1010

1111
// Tests adapter Insert performance.
1212
func Benchmark_Adapter_Insert(b *testing.B) {
13-
for k, v := range getTestAdapters() {
13+
for k, v := range testAdapters {
1414
b.Run(k, func(b *testing.B) {
1515
adapter := v()
1616
if err := adapter.Open(); err != nil {
@@ -33,7 +33,7 @@ func Benchmark_Adapter_Insert(b *testing.B) {
3333

3434
// Tests raw database performance.
3535
func Benchmark_Adapter_InsertRaw(b *testing.B) {
36-
for k, v := range getTestAdapters() {
36+
for k, v := range testAdapters {
3737
b.Run(k, func(b *testing.B) {
3838
adapter := v()
3939
if err := adapter.Open(); err != nil {
@@ -70,7 +70,7 @@ func Benchmark_Adapter_InsertRaw(b *testing.B) {
7070
// Tests multiple insert performance
7171
// There is a lot of setup in this test because we need a FeedVersion, Trip, and Stop
7272
func Benchmark_Adapter_BatchInsert(b *testing.B) {
73-
for k, v := range getTestAdapters() {
73+
for k, v := range testAdapters {
7474
b.Run(k, func(b *testing.B) {
7575
adapter := v()
7676
if err := adapter.Open(); err != nil {

gtdb/adapter_test.go

+1-12
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,14 @@ package gtdb
22

33
import (
44
"errors"
5-
"os"
65
"strconv"
76
"testing"
87
"time"
98

109
"github.com/interline-io/gotransit"
1110
)
1211

13-
func getTestAdapters() map[string]func() Adapter {
14-
adapters := map[string]func() Adapter{
15-
"SpatiaLiteAdapter-Memory": func() Adapter { return &SpatiaLiteAdapter{DBURL: "sqlite3://:memory:"} },
16-
"SpatiaLiteAdapter-Disk": func() Adapter { return &SpatiaLiteAdapter{DBURL: "sqlite3://test.db"} },
17-
}
18-
dburl := os.Getenv("GOTRANSIT_TEST_POSTGRES_URL")
19-
if dburl != "" {
20-
adapters["PostgresAdapter"] = func() Adapter { return &PostgresAdapter{DBURL: dburl} }
21-
}
22-
return adapters
23-
}
12+
var testAdapters = map[string]func() Adapter{}
2413

2514
// Interface tests for Adapter
2615
func testAdapter(t *testing.T, adapter Adapter) {

gtdb/db.go

-12
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,8 @@
11
package gtdb
22

33
import (
4-
"github.com/interline-io/gotransit"
5-
64
// Driver
75
_ "github.com/lib/pq"
86
)
97

108
var bufferSize = 1000
11-
12-
func init() {
13-
// Register readers and writers
14-
r := func(url string) (gotransit.Reader, error) { return NewReader(url) }
15-
gotransit.RegisterReader("sqlite3", r)
16-
gotransit.RegisterReader("postgres", r)
17-
w := func(url string) (gotransit.Writer, error) { return NewWriter(url) }
18-
gotransit.RegisterWriter("sqlite3", w)
19-
gotransit.RegisterWriter("postgres", w)
20-
}

gtdb/postgres.go

+10
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,16 @@ import (
88
"github.com/jmoiron/sqlx"
99
)
1010

11+
func init() {
12+
// Register driver
13+
adapters["postgres"] = func(dburl string) Adapter { return &PostgresAdapter{DBURL: dburl} }
14+
// Register readers and writers
15+
r := func(url string) (gotransit.Reader, error) { return NewReader(url) }
16+
gotransit.RegisterReader("postgres", r)
17+
w := func(url string) (gotransit.Writer, error) { return NewWriter(url) }
18+
gotransit.RegisterWriter("postgres", w)
19+
}
20+
1121
// PostgresAdapter connects to a Postgres/PostGIS database.
1222
type PostgresAdapter struct {
1323
DBURL string

gtdb/postgres_test.go

+14-4
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,23 @@
11
package gtdb
22

33
import (
4+
"os"
45
"testing"
56
)
67

8+
func init() {
9+
dburl := os.Getenv("GOTRANSIT_TEST_POSTGRES_URL")
10+
if dburl != "" {
11+
testAdapters["PostgresAdapter"] = func() Adapter { return &PostgresAdapter{DBURL: dburl} }
12+
}
13+
}
14+
715
func TestPostgresAdapter(t *testing.T) {
8-
if adapter, ok := getTestAdapters()["PostgresAdapter"]; ok {
9-
testAdapter(t, adapter())
10-
} else {
11-
t.Skip("no test url for PostgresAdapter")
16+
dburl := os.Getenv("GOTRANSIT_TEST_POSTGRES_URL")
17+
if dburl == "" {
18+
t.Skip("GOTRANSIT_TEST_POSTGRES_URL is not set")
19+
return
1220
}
21+
adapter := &PostgresAdapter{DBURL: dburl}
22+
testAdapter(t, adapter)
1323
}

gtdb/reader.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ type Reader struct {
2424

2525
// NewReader returns an initialized Reader.
2626
func NewReader(dburl string) (*Reader, error) {
27-
return &Reader{Adapter: NewAdapter(dburl), PageSize: 1000}, nil
27+
return &Reader{Adapter: newAdapter(dburl), PageSize: 1000}, nil
2828
}
2929

3030
// ValidateStructure returns if all the necessary tables are present. Not implemented.

gtdb/spatialite.go

+9
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
// +build cgo
2+
13
package gtdb
24

35
import (
@@ -13,7 +15,14 @@ import (
1315

1416
// Register.
1517
func init() {
18+
// Register driver and extension
19+
adapters["sqlite3"] = func(dburl string) Adapter { return &SpatiaLiteAdapter{DBURL: dburl} }
1620
sql.Register("spatialite", &sqlite3.SQLiteDriver{Extensions: []string{"mod_spatialite"}})
21+
// Register readers and writers
22+
r := func(url string) (gotransit.Reader, error) { return NewReader(url) }
23+
gotransit.RegisterReader("sqlite3", r)
24+
w := func(url string) (gotransit.Writer, error) { return NewWriter(url) }
25+
gotransit.RegisterWriter("sqlite3", w)
1726
}
1827

1928
// SpatiaLiteAdapter provides support for SpatiaLite.

gtdb/spatialite_test.go

+9-5
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
1+
// +build cgo
2+
13
package gtdb
24

35
import (
46
"testing"
57
)
68

9+
func init() {
10+
testAdapters["SpatiaLiteAdapter-Memory"] = func() Adapter { return &SpatiaLiteAdapter{DBURL: "sqlite3://:memory:"} }
11+
testAdapters["SpatiaLiteAdapter-Disk"] = func() Adapter { return &SpatiaLiteAdapter{DBURL: "sqlite3://test.db"} }
12+
}
13+
714
func TestSpatiaLiteAdapter(t *testing.T) {
8-
if adapter, ok := getTestAdapters()["SpatiaLiteAdapter-Memory"]; ok {
9-
testAdapter(t, adapter())
10-
} else {
11-
t.Skip("skipping SpatiaLiteAdapter-Memory adapter tests")
12-
}
15+
adapter := &SpatiaLiteAdapter{DBURL: "sqlite3://:memory:"}
16+
testAdapter(t, adapter)
1317
}

gtdb/writer.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ type Writer struct {
1515

1616
// NewWriter returns a Writer appropriate for the given connection url.
1717
func NewWriter(dburl string) (*Writer, error) {
18-
return &Writer{Adapter: NewAdapter(dburl)}, nil
18+
return &Writer{Adapter: newAdapter(dburl)}, nil
1919
}
2020

2121
// Open the database.

gtdb/writer_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99

1010
// Writer interface tests.
1111
func TestWriter(t *testing.T) {
12-
for k, adapter := range getTestAdapters() {
12+
for k, adapter := range testAdapters {
1313
fe, reader := testutil.NewMinimalTestFeed()
1414
t.Run(k, func(t *testing.T) {
1515
testutil.TestWriter(t, *fe, func() gotransit.Reader { return reader }, func() gotransit.Writer { return &Writer{Adapter: adapter()} })

0 commit comments

Comments
 (0)