Skip to content

Commit

Permalink
go/clients/mongo,mysql: use url.Parse instead of regex
Browse files Browse the repository at this point in the history
  • Loading branch information
kndndrj committed Jul 8, 2023
1 parent 45f0a70 commit d461eb1
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 48 deletions.
49 changes: 10 additions & 39 deletions dbee/clients/mongo.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ import (
"encoding/json"
"errors"
"fmt"
"regexp"
"net/url"
"strings"
"time"

"github.com/kndndrj/nvim-dbee/dbee/clients/common"
Expand Down Expand Up @@ -44,55 +45,25 @@ func init() {
// gob.Register(primitive.Undefined{})
gob.Register(primitive.DBPointer{})
// gob.Register(primitive.Symbol)

}

func getDatabaseName(url string) (string, error) {
r, err := regexp.Compile(`mongo.*//(.*:[0-9]+,?)+/(?P<dbname>.*?)(\?|$)`)
if err != nil {
return "", err
}

// get submatch index
getSubmatchIndex := func(submatch []string, name string) (int, error) {
for i, n := range submatch {
if n == name {
return i, nil
}
}
return 0, errors.New("no submatch found")
}
i, err := getSubmatchIndex(r.SubexpNames(), "dbname")
if err != nil {
return "", err
}

// get database name from capture group (with index)
submatch := r.FindStringSubmatch(url)
if len(submatch) < 1 {
return "", errors.New("url doesn't comply to schema")
}
dbName := submatch[i]
if dbName == "" {
return "", errors.New("no dbname found")
}

return dbName, nil
}

type MongoClient struct {
c *mongo.Client
dbName string
}

func NewMongo(url string) (*MongoClient, error) {
func NewMongo(rawURL string) (*MongoClient, error) {
// get database name from url
dbName, err := getDatabaseName(url)
u, err := url.Parse(rawURL)
if err != nil {
return nil, fmt.Errorf("mongo: invalid url: %v", err)
return nil, fmt.Errorf("mongo: invalid url: %w", err)
}
dbName := strings.TrimPrefix(u.Path, "/")
if dbName == "" {
return nil, fmt.Errorf("mongo: url doesn't comply to schema: database name must be set")
}

opts := options.Client().ApplyURI(url)
opts := options.Client().ApplyURI(rawURL)
client, err := mongo.Connect(context.TODO(), opts)
if err != nil {
return nil, err
Expand Down
18 changes: 9 additions & 9 deletions dbee/clients/mysql.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package clients
import (
"database/sql"
"fmt"
"regexp"
"net/url"

_ "github.com/go-sql-driver/mysql"
"github.com/kndndrj/nvim-dbee/dbee/clients/common"
Expand All @@ -23,19 +23,19 @@ type MysqlClient struct {
sql *common.Client
}

func NewMysql(url string) (*MysqlClient, error) {
func NewMysql(rawURL string) (*MysqlClient, error) {
// add multiple statements support parameter
match, err := regexp.MatchString(`[\?][\w]+=[\w-]+`, url)
u, err := url.Parse(rawURL)
if err != nil {
return nil, err
return nil, fmt.Errorf("mysql: invalid url: %w", err)
}
if match {
url = url + "&multiStatements=true"
} else {
url = url + "?multiStatements=true"
q := u.Query()
if !q.Has("multiStatements") {
q.Add("multiStatements", "true")
}
u.RawQuery = q.Encode()

db, err := sql.Open("mysql", url)
db, err := sql.Open("mysql", rawURL)
if err != nil {
return nil, fmt.Errorf("unable to connect to mysql database: %v", err)
}
Expand Down

0 comments on commit d461eb1

Please sign in to comment.