diff --git a/go.sum b/go.sum index 5620650..2ebaa0c 100644 --- a/go.sum +++ b/go.sum @@ -58,18 +58,11 @@ github.com/whosonfirst/go-whosonfirst-uri v0.2.0/go.mod h1:8eaDVcc4v+HHHEDaRbApd github.com/whosonfirst/go-whosonfirst-uri v1.0.1/go.mod h1:8eaDVcc4v+HHHEDaRbApdmhPwM4/JQllw2PktvZcPVs= github.com/whosonfirst/go-whosonfirst-uri v1.1.0 h1:kNYOmKSm3u2asUOeq7yXL1Q8gFKkPIl8A0qinKrGV/8= github.com/whosonfirst/go-whosonfirst-uri v1.1.0/go.mod h1:8eaDVcc4v+HHHEDaRbApdmhPwM4/JQllw2PktvZcPVs= -github.com/whosonfirst/warning v0.1.0/go.mod h1:cAez7FpC/UEUrbiOXZO15v2JM8eijtFHQlN93AGFy1k= github.com/whosonfirst/warning v0.1.1/go.mod h1:/unEMzhB9YaMeEwTJpzLN3kM5LiSxdJhKEsf/OQhn6s= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/spr.go b/spr.go index 66c0907..e28af5d 100644 --- a/spr.go +++ b/spr.go @@ -2,6 +2,7 @@ package spr import ( "context" + "database/sql" "fmt" "github.com/aaronland/go-sqlite" sqlite_database "github.com/aaronland/go-sqlite/database" @@ -185,18 +186,46 @@ func RetrieveSPR(ctx context.Context, spr_db *sqlite_database.SQLiteDatabase, sp spr_q := fmt.Sprintf(`SELECT id, parent_id, name, placetype, - country, repo, inception, cessation, + country, repo, latitude, longitude, min_latitude, min_longitude, max_latitude, max_longitude, - is_current, is_deprecated, is_ceased, - is_superseded, is_superseding, + is_current, is_deprecated, is_ceased,is_superseded, is_superseding, supersedes, superseded_by, belongsto, + is_alt, alt_label, lastmodified FROM %s WHERE id = ? AND alt_label = ?`, spr_table.Name()) row := conn.QueryRowContext(ctx, spr_q, args...) + return RetrieveSPRWithRow(ctx, row) +} + +// See notes below + +func RetrieveSPRWithRow(ctx context.Context, row *sql.Row) (wof_spr.StandardPlacesResult, error) { + return retrieveSPRWithScanner(ctx, row) +} + +// See notes below + +func RetrieveSPRWithRows(ctx context.Context, rows *sql.Rows) (wof_spr.StandardPlacesResult, error) { + return retrieveSPRWithScanner(ctx, rows) +} + +// We go to the trouble of all this indirection because neither *sql.Row or *sql.Rows implement +// the sql.Scanner interface. +// The latter expects: Scan(src interface{}) error +// But the former pxpect: Scan(src ...interface{}) error + +func retrieveSPRWithScanner(ctx context.Context, scanner interface{}) (wof_spr.StandardPlacesResult, error) { + + switch scanner.(type) { + case *sql.Row, *sql.Rows: + // pass + default: + return nil, fmt.Errorf("Unsupported scanner") + } var spr_id string var parent_id string @@ -228,19 +257,51 @@ func RetrieveSPR(ctx context.Context, spr_db *sqlite_database.SQLiteDatabase, sp var str_superseded_by string var str_belongs_to string + var is_alt int64 + var alt_label string + var lastmodified int64 // supersedes and superseding need to be added here pending // https://github.com/whosonfirst/go-whosonfirst-sqlite-features/issues/14 - err = row.Scan( - &spr_id, &parent_id, &name, &placetype, &country, &repo, - &inception, &cessation, - &latitude, &longitude, &min_latitude, &max_latitude, &min_longitude, &max_longitude, - &is_current, &is_deprecated, &is_ceased, &is_superseded, &is_superseding, - &str_supersedes, &str_superseded_by, &str_belongs_to, - &lastmodified, - ) + var scanner_err error + + switch scanner.(type) { + case *sql.Rows: + + scanner_err = scanner.(*sql.Rows).Scan( + &spr_id, &parent_id, &name, &placetype, + &inception, &cessation, + &country, &repo, + &latitude, &longitude, + &min_latitude, &max_latitude, &min_longitude, &max_longitude, + &is_current, &is_deprecated, &is_ceased, &is_superseded, &is_superseding, + &str_supersedes, &str_superseded_by, &str_belongs_to, + &is_alt, &alt_label, + &lastmodified, + ) + + default: + + scanner_err = scanner.(*sql.Row).Scan( + &spr_id, &parent_id, &name, &placetype, + &inception, &cessation, + &country, &repo, + &latitude, &longitude, + &min_latitude, &max_latitude, &min_longitude, &max_longitude, + &is_current, &is_deprecated, &is_ceased, &is_superseded, &is_superseding, + &str_supersedes, &str_superseded_by, &str_belongs_to, + &is_alt, &alt_label, + &lastmodified, + ) + } + + if scanner_err != nil { + return nil, scanner_err + } + + id, err := strconv.ParseInt(spr_id, 10, 64) if err != nil { return nil, err