mirror of https://github.com/VinGarcia/ksql.git
Improve the names of some public types *breaking change*
parent
682f99b495
commit
b6e6667a3f
16
README.md
16
README.md
|
@ -68,8 +68,8 @@ The current interface is as follows and we plan on keeping
|
||||||
it with as little functions as possible, so don't expect many additions:
|
it with as little functions as possible, so don't expect many additions:
|
||||||
|
|
||||||
```go
|
```go
|
||||||
// SQLProvider describes the public behavior of this ORM
|
// Provider describes the public behavior of this ORM
|
||||||
type SQLProvider interface {
|
type Provider interface {
|
||||||
Insert(ctx context.Context, table Table, record interface{}) error
|
Insert(ctx context.Context, table Table, record interface{}) error
|
||||||
Update(ctx context.Context, table Table, record interface{}) error
|
Update(ctx context.Context, table Table, record interface{}) error
|
||||||
Delete(ctx context.Context, table Table, idsOrRecords ...interface{}) error
|
Delete(ctx context.Context, table Table, idsOrRecords ...interface{}) error
|
||||||
|
@ -79,7 +79,7 @@ type SQLProvider interface {
|
||||||
QueryChunks(ctx context.Context, parser ChunkParser) error
|
QueryChunks(ctx context.Context, parser ChunkParser) error
|
||||||
|
|
||||||
Exec(ctx context.Context, query string, params ...interface{}) error
|
Exec(ctx context.Context, query string, params ...interface{}) error
|
||||||
Transaction(ctx context.Context, fn func(SQLProvider) error) error
|
Transaction(ctx context.Context, fn func(Provider) error) error
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -232,7 +232,7 @@ func main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Making transactions:
|
// Making transactions:
|
||||||
err = db.Transaction(ctx, func(db ksql.SQLProvider) error {
|
err = db.Transaction(ctx, func(db ksql.Provider) error {
|
||||||
var cris2 User
|
var cris2 User
|
||||||
err = db.QueryOne(ctx, &cris2, "SELECT * FROM users WHERE id = ?", cris.ID)
|
err = db.QueryOne(ctx, &cris2, "SELECT * FROM users WHERE id = ?", cris.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -372,10 +372,10 @@ Querying a single joined row:
|
||||||
|
|
||||||
```golang
|
```golang
|
||||||
var row struct{
|
var row struct{
|
||||||
User User `tablename:"u"` // (here the tablename must match the aliased tablename in the query)
|
User User `tablename:"u"` // (here the tablename must match the aliased tablename in the query)
|
||||||
Post Post `tablename:"p"` // (if no alias is used you should use the actual name of the table)
|
Post Post `tablename:"posts"` // (if no alias is used you should use the actual name of the table)
|
||||||
}
|
}
|
||||||
err = db.QueryOne(ctx, &row, "FROM users as u JOIN posts as p ON u.id = p.user_id WHERE u.id = ?", userID)
|
err = db.QueryOne(ctx, &row, "FROM users as u JOIN posts ON u.id = posts.user_id WHERE u.id = ?", userID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err.Error())
|
panic(err.Error())
|
||||||
}
|
}
|
||||||
|
@ -521,13 +521,13 @@ make test
|
||||||
|
|
||||||
### TODO List
|
### TODO List
|
||||||
|
|
||||||
- Improve error messages
|
|
||||||
- Add tests for tables using composite keys
|
- Add tests for tables using composite keys
|
||||||
- Add support for serializing structs as other formats such as YAML
|
- Add support for serializing structs as other formats such as YAML
|
||||||
- Update `kstructs.FillStructWith` to work with `json` tagged attributes
|
- Update `kstructs.FillStructWith` to work with `json` tagged attributes
|
||||||
- Make testing easier by exposing the connection strings in an .env file
|
- Make testing easier by exposing the connection strings in an .env file
|
||||||
- Make testing easier by automatically creating the `ksql` database
|
- Make testing easier by automatically creating the `ksql` database
|
||||||
- Create a way for users to submit user defined dialects
|
- Create a way for users to submit user defined dialects
|
||||||
|
- Improve error messages
|
||||||
|
|
||||||
### Optimization Oportunities
|
### Optimization Oportunities
|
||||||
|
|
||||||
|
|
|
@ -14,8 +14,8 @@ var ErrRecordNotFound error = errors.Wrap(sql.ErrNoRows, "ksql: the query return
|
||||||
// ErrAbortIteration ...
|
// ErrAbortIteration ...
|
||||||
var ErrAbortIteration error = fmt.Errorf("ksql: abort iteration, should only be used inside QueryChunks function")
|
var ErrAbortIteration error = fmt.Errorf("ksql: abort iteration, should only be used inside QueryChunks function")
|
||||||
|
|
||||||
// SQLProvider describes the public behavior of this ORM
|
// Provider describes the public behavior of this ORM
|
||||||
type SQLProvider interface {
|
type Provider interface {
|
||||||
Insert(ctx context.Context, table Table, record interface{}) error
|
Insert(ctx context.Context, table Table, record interface{}) error
|
||||||
Update(ctx context.Context, table Table, record interface{}) error
|
Update(ctx context.Context, table Table, record interface{}) error
|
||||||
Delete(ctx context.Context, table Table, idsOrRecords ...interface{}) error
|
Delete(ctx context.Context, table Table, idsOrRecords ...interface{}) error
|
||||||
|
@ -25,7 +25,7 @@ type SQLProvider interface {
|
||||||
QueryChunks(ctx context.Context, parser ChunkParser) error
|
QueryChunks(ctx context.Context, parser ChunkParser) error
|
||||||
|
|
||||||
Exec(ctx context.Context, query string, params ...interface{}) error
|
Exec(ctx context.Context, query string, params ...interface{}) error
|
||||||
Transaction(ctx context.Context, fn func(SQLProvider) error) error
|
Transaction(ctx context.Context, fn func(Provider) error) error
|
||||||
}
|
}
|
||||||
|
|
||||||
// Table describes the required information for inserting, updating and
|
// Table describes the required information for inserting, updating and
|
||||||
|
|
|
@ -137,7 +137,7 @@ func main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Making transactions:
|
// Making transactions:
|
||||||
err = db.Transaction(ctx, func(db ksql.SQLProvider) error {
|
err = db.Transaction(ctx, func(db ksql.Provider) error {
|
||||||
var cris2 User
|
var cris2 User
|
||||||
err = db.QueryOne(ctx, &cris2, "SELECT * FROM users WHERE id = ?", cris.ID)
|
err = db.QueryOne(ctx, &cris2, "SELECT * FROM users WHERE id = ?", cris.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -40,12 +40,12 @@ type Address struct {
|
||||||
|
|
||||||
// Service ...
|
// Service ...
|
||||||
type Service struct {
|
type Service struct {
|
||||||
db ksql.SQLProvider
|
db ksql.Provider
|
||||||
streamChunkSize int
|
streamChunkSize int
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewUserService ...
|
// NewUserService ...
|
||||||
func NewUserService(db ksql.SQLProvider) Service {
|
func NewUserService(db ksql.Provider) Service {
|
||||||
return Service{
|
return Service{
|
||||||
db: db,
|
db: db,
|
||||||
streamChunkSize: 100,
|
streamChunkSize: 100,
|
||||||
|
|
|
@ -7,8 +7,8 @@ import (
|
||||||
gomock "github.com/golang/mock/gomock"
|
gomock "github.com/golang/mock/gomock"
|
||||||
"github.com/tj/assert"
|
"github.com/tj/assert"
|
||||||
"github.com/vingarcia/ksql"
|
"github.com/vingarcia/ksql"
|
||||||
"github.com/vingarcia/ksql/nullable"
|
|
||||||
"github.com/vingarcia/ksql/kstructs"
|
"github.com/vingarcia/ksql/kstructs"
|
||||||
|
"github.com/vingarcia/ksql/nullable"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestCreateUser(t *testing.T) {
|
func TestCreateUser(t *testing.T) {
|
||||||
|
@ -16,7 +16,7 @@ func TestCreateUser(t *testing.T) {
|
||||||
controller := gomock.NewController(t)
|
controller := gomock.NewController(t)
|
||||||
defer controller.Finish()
|
defer controller.Finish()
|
||||||
|
|
||||||
mockDB := NewMockSQLProvider(controller)
|
mockDB := NewMockProvider(controller)
|
||||||
|
|
||||||
s := Service{
|
s := Service{
|
||||||
db: mockDB,
|
db: mockDB,
|
||||||
|
@ -42,7 +42,7 @@ func TestCreateUser(t *testing.T) {
|
||||||
controller := gomock.NewController(t)
|
controller := gomock.NewController(t)
|
||||||
defer controller.Finish()
|
defer controller.Finish()
|
||||||
|
|
||||||
mockDB := NewMockSQLProvider(controller)
|
mockDB := NewMockProvider(controller)
|
||||||
|
|
||||||
s := Service{
|
s := Service{
|
||||||
db: mockDB,
|
db: mockDB,
|
||||||
|
@ -82,7 +82,7 @@ func TestUpdateUserScore(t *testing.T) {
|
||||||
controller := gomock.NewController(t)
|
controller := gomock.NewController(t)
|
||||||
defer controller.Finish()
|
defer controller.Finish()
|
||||||
|
|
||||||
mockDB := NewMockSQLProvider(controller)
|
mockDB := NewMockProvider(controller)
|
||||||
|
|
||||||
s := Service{
|
s := Service{
|
||||||
db: mockDB,
|
db: mockDB,
|
||||||
|
@ -126,7 +126,7 @@ func TestListUsers(t *testing.T) {
|
||||||
controller := gomock.NewController(t)
|
controller := gomock.NewController(t)
|
||||||
defer controller.Finish()
|
defer controller.Finish()
|
||||||
|
|
||||||
mockDB := NewMockSQLProvider(controller)
|
mockDB := NewMockProvider(controller)
|
||||||
|
|
||||||
s := Service{
|
s := Service{
|
||||||
db: mockDB,
|
db: mockDB,
|
||||||
|
@ -188,7 +188,7 @@ func TestStreamAllUsers(t *testing.T) {
|
||||||
controller := gomock.NewController(t)
|
controller := gomock.NewController(t)
|
||||||
defer controller.Finish()
|
defer controller.Finish()
|
||||||
|
|
||||||
mockDB := NewMockSQLProvider(controller)
|
mockDB := NewMockProvider(controller)
|
||||||
|
|
||||||
s := Service{
|
s := Service{
|
||||||
db: mockDB,
|
db: mockDB,
|
||||||
|
@ -260,7 +260,7 @@ func TestDeleteUser(t *testing.T) {
|
||||||
controller := gomock.NewController(t)
|
controller := gomock.NewController(t)
|
||||||
defer controller.Finish()
|
defer controller.Finish()
|
||||||
|
|
||||||
mockDB := NewMockSQLProvider(controller)
|
mockDB := NewMockProvider(controller)
|
||||||
|
|
||||||
s := Service{
|
s := Service{
|
||||||
db: mockDB,
|
db: mockDB,
|
||||||
|
|
|
@ -12,31 +12,31 @@ import (
|
||||||
ksql "github.com/vingarcia/ksql"
|
ksql "github.com/vingarcia/ksql"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MockSQLProvider is a mock of SQLProvider interface.
|
// MockProvider is a mock of Provider interface.
|
||||||
type MockSQLProvider struct {
|
type MockProvider struct {
|
||||||
ctrl *gomock.Controller
|
ctrl *gomock.Controller
|
||||||
recorder *MockSQLProviderMockRecorder
|
recorder *MockProviderMockRecorder
|
||||||
}
|
}
|
||||||
|
|
||||||
// MockSQLProviderMockRecorder is the mock recorder for MockSQLProvider.
|
// MockProviderMockRecorder is the mock recorder for MockProvider.
|
||||||
type MockSQLProviderMockRecorder struct {
|
type MockProviderMockRecorder struct {
|
||||||
mock *MockSQLProvider
|
mock *MockProvider
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewMockSQLProvider creates a new mock instance.
|
// NewMockProvider creates a new mock instance.
|
||||||
func NewMockSQLProvider(ctrl *gomock.Controller) *MockSQLProvider {
|
func NewMockProvider(ctrl *gomock.Controller) *MockProvider {
|
||||||
mock := &MockSQLProvider{ctrl: ctrl}
|
mock := &MockProvider{ctrl: ctrl}
|
||||||
mock.recorder = &MockSQLProviderMockRecorder{mock}
|
mock.recorder = &MockProviderMockRecorder{mock}
|
||||||
return mock
|
return mock
|
||||||
}
|
}
|
||||||
|
|
||||||
// EXPECT returns an object that allows the caller to indicate expected use.
|
// EXPECT returns an object that allows the caller to indicate expected use.
|
||||||
func (m *MockSQLProvider) EXPECT() *MockSQLProviderMockRecorder {
|
func (m *MockProvider) EXPECT() *MockProviderMockRecorder {
|
||||||
return m.recorder
|
return m.recorder
|
||||||
}
|
}
|
||||||
|
|
||||||
// Delete mocks base method.
|
// Delete mocks base method.
|
||||||
func (m *MockSQLProvider) Delete(ctx context.Context, table ksql.Table, idsOrRecords ...interface{}) error {
|
func (m *MockProvider) Delete(ctx context.Context, table ksql.Table, idsOrRecords ...interface{}) error {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
varargs := []interface{}{ctx, table}
|
varargs := []interface{}{ctx, table}
|
||||||
for _, a := range idsOrRecords {
|
for _, a := range idsOrRecords {
|
||||||
|
@ -48,14 +48,14 @@ func (m *MockSQLProvider) Delete(ctx context.Context, table ksql.Table, idsOrRec
|
||||||
}
|
}
|
||||||
|
|
||||||
// Delete indicates an expected call of Delete.
|
// Delete indicates an expected call of Delete.
|
||||||
func (mr *MockSQLProviderMockRecorder) Delete(ctx, table interface{}, idsOrRecords ...interface{}) *gomock.Call {
|
func (mr *MockProviderMockRecorder) Delete(ctx, table interface{}, idsOrRecords ...interface{}) *gomock.Call {
|
||||||
mr.mock.ctrl.T.Helper()
|
mr.mock.ctrl.T.Helper()
|
||||||
varargs := append([]interface{}{ctx, table}, idsOrRecords...)
|
varargs := append([]interface{}{ctx, table}, idsOrRecords...)
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockSQLProvider)(nil).Delete), varargs...)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockProvider)(nil).Delete), varargs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Exec mocks base method.
|
// Exec mocks base method.
|
||||||
func (m *MockSQLProvider) Exec(ctx context.Context, query string, params ...interface{}) error {
|
func (m *MockProvider) Exec(ctx context.Context, query string, params ...interface{}) error {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
varargs := []interface{}{ctx, query}
|
varargs := []interface{}{ctx, query}
|
||||||
for _, a := range params {
|
for _, a := range params {
|
||||||
|
@ -67,14 +67,14 @@ func (m *MockSQLProvider) Exec(ctx context.Context, query string, params ...inte
|
||||||
}
|
}
|
||||||
|
|
||||||
// Exec indicates an expected call of Exec.
|
// Exec indicates an expected call of Exec.
|
||||||
func (mr *MockSQLProviderMockRecorder) Exec(ctx, query interface{}, params ...interface{}) *gomock.Call {
|
func (mr *MockProviderMockRecorder) Exec(ctx, query interface{}, params ...interface{}) *gomock.Call {
|
||||||
mr.mock.ctrl.T.Helper()
|
mr.mock.ctrl.T.Helper()
|
||||||
varargs := append([]interface{}{ctx, query}, params...)
|
varargs := append([]interface{}{ctx, query}, params...)
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Exec", reflect.TypeOf((*MockSQLProvider)(nil).Exec), varargs...)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Exec", reflect.TypeOf((*MockProvider)(nil).Exec), varargs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Insert mocks base method.
|
// Insert mocks base method.
|
||||||
func (m *MockSQLProvider) Insert(ctx context.Context, table ksql.Table, record interface{}) error {
|
func (m *MockProvider) Insert(ctx context.Context, table ksql.Table, record interface{}) error {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
ret := m.ctrl.Call(m, "Insert", ctx, table, record)
|
ret := m.ctrl.Call(m, "Insert", ctx, table, record)
|
||||||
ret0, _ := ret[0].(error)
|
ret0, _ := ret[0].(error)
|
||||||
|
@ -82,13 +82,13 @@ func (m *MockSQLProvider) Insert(ctx context.Context, table ksql.Table, record i
|
||||||
}
|
}
|
||||||
|
|
||||||
// Insert indicates an expected call of Insert.
|
// Insert indicates an expected call of Insert.
|
||||||
func (mr *MockSQLProviderMockRecorder) Insert(ctx, table, record interface{}) *gomock.Call {
|
func (mr *MockProviderMockRecorder) Insert(ctx, table, record interface{}) *gomock.Call {
|
||||||
mr.mock.ctrl.T.Helper()
|
mr.mock.ctrl.T.Helper()
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Insert", reflect.TypeOf((*MockSQLProvider)(nil).Insert), ctx, table, record)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Insert", reflect.TypeOf((*MockProvider)(nil).Insert), ctx, table, record)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Query mocks base method.
|
// Query mocks base method.
|
||||||
func (m *MockSQLProvider) Query(ctx context.Context, records interface{}, query string, params ...interface{}) error {
|
func (m *MockProvider) Query(ctx context.Context, records interface{}, query string, params ...interface{}) error {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
varargs := []interface{}{ctx, records, query}
|
varargs := []interface{}{ctx, records, query}
|
||||||
for _, a := range params {
|
for _, a := range params {
|
||||||
|
@ -100,14 +100,14 @@ func (m *MockSQLProvider) Query(ctx context.Context, records interface{}, query
|
||||||
}
|
}
|
||||||
|
|
||||||
// Query indicates an expected call of Query.
|
// Query indicates an expected call of Query.
|
||||||
func (mr *MockSQLProviderMockRecorder) Query(ctx, records, query interface{}, params ...interface{}) *gomock.Call {
|
func (mr *MockProviderMockRecorder) Query(ctx, records, query interface{}, params ...interface{}) *gomock.Call {
|
||||||
mr.mock.ctrl.T.Helper()
|
mr.mock.ctrl.T.Helper()
|
||||||
varargs := append([]interface{}{ctx, records, query}, params...)
|
varargs := append([]interface{}{ctx, records, query}, params...)
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Query", reflect.TypeOf((*MockSQLProvider)(nil).Query), varargs...)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Query", reflect.TypeOf((*MockProvider)(nil).Query), varargs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// QueryChunks mocks base method.
|
// QueryChunks mocks base method.
|
||||||
func (m *MockSQLProvider) QueryChunks(ctx context.Context, parser ksql.ChunkParser) error {
|
func (m *MockProvider) QueryChunks(ctx context.Context, parser ksql.ChunkParser) error {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
ret := m.ctrl.Call(m, "QueryChunks", ctx, parser)
|
ret := m.ctrl.Call(m, "QueryChunks", ctx, parser)
|
||||||
ret0, _ := ret[0].(error)
|
ret0, _ := ret[0].(error)
|
||||||
|
@ -115,13 +115,13 @@ func (m *MockSQLProvider) QueryChunks(ctx context.Context, parser ksql.ChunkPars
|
||||||
}
|
}
|
||||||
|
|
||||||
// QueryChunks indicates an expected call of QueryChunks.
|
// QueryChunks indicates an expected call of QueryChunks.
|
||||||
func (mr *MockSQLProviderMockRecorder) QueryChunks(ctx, parser interface{}) *gomock.Call {
|
func (mr *MockProviderMockRecorder) QueryChunks(ctx, parser interface{}) *gomock.Call {
|
||||||
mr.mock.ctrl.T.Helper()
|
mr.mock.ctrl.T.Helper()
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "QueryChunks", reflect.TypeOf((*MockSQLProvider)(nil).QueryChunks), ctx, parser)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "QueryChunks", reflect.TypeOf((*MockProvider)(nil).QueryChunks), ctx, parser)
|
||||||
}
|
}
|
||||||
|
|
||||||
// QueryOne mocks base method.
|
// QueryOne mocks base method.
|
||||||
func (m *MockSQLProvider) QueryOne(ctx context.Context, record interface{}, query string, params ...interface{}) error {
|
func (m *MockProvider) QueryOne(ctx context.Context, record interface{}, query string, params ...interface{}) error {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
varargs := []interface{}{ctx, record, query}
|
varargs := []interface{}{ctx, record, query}
|
||||||
for _, a := range params {
|
for _, a := range params {
|
||||||
|
@ -133,14 +133,14 @@ func (m *MockSQLProvider) QueryOne(ctx context.Context, record interface{}, quer
|
||||||
}
|
}
|
||||||
|
|
||||||
// QueryOne indicates an expected call of QueryOne.
|
// QueryOne indicates an expected call of QueryOne.
|
||||||
func (mr *MockSQLProviderMockRecorder) QueryOne(ctx, record, query interface{}, params ...interface{}) *gomock.Call {
|
func (mr *MockProviderMockRecorder) QueryOne(ctx, record, query interface{}, params ...interface{}) *gomock.Call {
|
||||||
mr.mock.ctrl.T.Helper()
|
mr.mock.ctrl.T.Helper()
|
||||||
varargs := append([]interface{}{ctx, record, query}, params...)
|
varargs := append([]interface{}{ctx, record, query}, params...)
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "QueryOne", reflect.TypeOf((*MockSQLProvider)(nil).QueryOne), varargs...)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "QueryOne", reflect.TypeOf((*MockProvider)(nil).QueryOne), varargs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Transaction mocks base method.
|
// Transaction mocks base method.
|
||||||
func (m *MockSQLProvider) Transaction(ctx context.Context, fn func(ksql.SQLProvider) error) error {
|
func (m *MockProvider) Transaction(ctx context.Context, fn func(ksql.Provider) error) error {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
ret := m.ctrl.Call(m, "Transaction", ctx, fn)
|
ret := m.ctrl.Call(m, "Transaction", ctx, fn)
|
||||||
ret0, _ := ret[0].(error)
|
ret0, _ := ret[0].(error)
|
||||||
|
@ -148,13 +148,13 @@ func (m *MockSQLProvider) Transaction(ctx context.Context, fn func(ksql.SQLProvi
|
||||||
}
|
}
|
||||||
|
|
||||||
// Transaction indicates an expected call of Transaction.
|
// Transaction indicates an expected call of Transaction.
|
||||||
func (mr *MockSQLProviderMockRecorder) Transaction(ctx, fn interface{}) *gomock.Call {
|
func (mr *MockProviderMockRecorder) Transaction(ctx, fn interface{}) *gomock.Call {
|
||||||
mr.mock.ctrl.T.Helper()
|
mr.mock.ctrl.T.Helper()
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Transaction", reflect.TypeOf((*MockSQLProvider)(nil).Transaction), ctx, fn)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Transaction", reflect.TypeOf((*MockProvider)(nil).Transaction), ctx, fn)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update mocks base method.
|
// Update mocks base method.
|
||||||
func (m *MockSQLProvider) Update(ctx context.Context, table ksql.Table, record interface{}) error {
|
func (m *MockProvider) Update(ctx context.Context, table ksql.Table, record interface{}) error {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
ret := m.ctrl.Call(m, "Update", ctx, table, record)
|
ret := m.ctrl.Call(m, "Update", ctx, table, record)
|
||||||
ret0, _ := ret[0].(error)
|
ret0, _ := ret[0].(error)
|
||||||
|
@ -162,7 +162,7 @@ func (m *MockSQLProvider) Update(ctx context.Context, table ksql.Table, record i
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update indicates an expected call of Update.
|
// Update indicates an expected call of Update.
|
||||||
func (mr *MockSQLProviderMockRecorder) Update(ctx, table, record interface{}) *gomock.Call {
|
func (mr *MockProviderMockRecorder) Update(ctx, table, record interface{}) *gomock.Call {
|
||||||
mr.mock.ctrl.T.Helper()
|
mr.mock.ctrl.T.Helper()
|
||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Update", reflect.TypeOf((*MockSQLProvider)(nil).Update), ctx, table, record)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Update", reflect.TypeOf((*MockProvider)(nil).Update), ctx, table, record)
|
||||||
}
|
}
|
||||||
|
|
23
ksql.go
23
ksql.go
|
@ -22,14 +22,19 @@ func init() {
|
||||||
|
|
||||||
// DB represents the ksql client responsible for
|
// DB represents the ksql client responsible for
|
||||||
// interfacing with the "database/sql" package implementing
|
// interfacing with the "database/sql" package implementing
|
||||||
// the KissSQL interface `SQLProvider`.
|
// the KissSQL interface `ksql.Provider`.
|
||||||
type DB struct {
|
type DB struct {
|
||||||
driver string
|
driver string
|
||||||
dialect dialect
|
dialect dialect
|
||||||
db sqlProvider
|
db DBAdapter
|
||||||
}
|
}
|
||||||
|
|
||||||
type sqlProvider interface {
|
// DBAdapter is minimalistic interface to decouple our implementation
|
||||||
|
// from database/sql, i.e. if any struct implements the functions below
|
||||||
|
// with the exact same semantic as the sql package it will work with ksql.
|
||||||
|
//
|
||||||
|
// To create a new client using this adapter use ksql.NewWithDB()
|
||||||
|
type DBAdapter interface {
|
||||||
ExecContext(ctx context.Context, query string, args ...interface{}) (sql.Result, error)
|
ExecContext(ctx context.Context, query string, args ...interface{}) (sql.Result, error)
|
||||||
QueryContext(ctx context.Context, query string, args ...interface{}) (*sql.Rows, error)
|
QueryContext(ctx context.Context, query string, args ...interface{}) (*sql.Rows, error)
|
||||||
}
|
}
|
||||||
|
@ -61,6 +66,16 @@ func New(
|
||||||
|
|
||||||
db.SetMaxOpenConns(config.MaxOpenConns)
|
db.SetMaxOpenConns(config.MaxOpenConns)
|
||||||
|
|
||||||
|
return newWithDB(db, dbDriver, connectionString)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewWithDB allows the user to insert a custom implementation
|
||||||
|
// of the DBAdapter interface
|
||||||
|
func newWithDB(
|
||||||
|
db DBAdapter,
|
||||||
|
dbDriver string,
|
||||||
|
connectionString string,
|
||||||
|
) (DB, error) {
|
||||||
dialect := supportedDialects[dbDriver]
|
dialect := supportedDialects[dbDriver]
|
||||||
if dialect == nil {
|
if dialect == nil {
|
||||||
return DB{}, fmt.Errorf("unsupported driver `%s`", dbDriver)
|
return DB{}, fmt.Errorf("unsupported driver `%s`", dbDriver)
|
||||||
|
@ -731,7 +746,7 @@ func (c DB) Exec(ctx context.Context, query string, params ...interface{}) error
|
||||||
}
|
}
|
||||||
|
|
||||||
// Transaction just runs an SQL command on the database returning no rows.
|
// Transaction just runs an SQL command on the database returning no rows.
|
||||||
func (c DB) Transaction(ctx context.Context, fn func(SQLProvider) error) error {
|
func (c DB) Transaction(ctx context.Context, fn func(Provider) error) error {
|
||||||
switch db := c.db.(type) {
|
switch db := c.db.(type) {
|
||||||
case *sql.Tx:
|
case *sql.Tx:
|
||||||
return fn(c)
|
return fn(c)
|
||||||
|
|
10
ksql_test.go
10
ksql_test.go
|
@ -1588,7 +1588,7 @@ func TestTransaction(t *testing.T) {
|
||||||
_ = c.Insert(ctx, UsersTable, &User{Name: "User2"})
|
_ = c.Insert(ctx, UsersTable, &User{Name: "User2"})
|
||||||
|
|
||||||
var users []User
|
var users []User
|
||||||
err = c.Transaction(ctx, func(db SQLProvider) error {
|
err = c.Transaction(ctx, func(db Provider) error {
|
||||||
db.Query(ctx, &users, "SELECT * FROM users ORDER BY id ASC")
|
db.Query(ctx, &users, "SELECT * FROM users ORDER BY id ASC")
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
@ -1616,7 +1616,7 @@ func TestTransaction(t *testing.T) {
|
||||||
_ = c.Insert(ctx, UsersTable, &u1)
|
_ = c.Insert(ctx, UsersTable, &u1)
|
||||||
_ = c.Insert(ctx, UsersTable, &u2)
|
_ = c.Insert(ctx, UsersTable, &u2)
|
||||||
|
|
||||||
err = c.Transaction(ctx, func(db SQLProvider) error {
|
err = c.Transaction(ctx, func(db Provider) error {
|
||||||
err = db.Insert(ctx, UsersTable, &User{Name: "User3"})
|
err = db.Insert(ctx, UsersTable, &User{Name: "User3"})
|
||||||
assert.Equal(t, nil, err)
|
assert.Equal(t, nil, err)
|
||||||
err = db.Insert(ctx, UsersTable, &User{Name: "User4"})
|
err = db.Insert(ctx, UsersTable, &User{Name: "User4"})
|
||||||
|
@ -1878,7 +1878,7 @@ func shiftErrSlice(errs *[]error) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func getUsersByID(dbi sqlProvider, dialect dialect, resultsPtr *[]User, ids ...uint) error {
|
func getUsersByID(dbi DBAdapter, dialect dialect, resultsPtr *[]User, ids ...uint) error {
|
||||||
db := dbi.(*sql.DB)
|
db := dbi.(*sql.DB)
|
||||||
|
|
||||||
placeholders := make([]string, len(ids))
|
placeholders := make([]string, len(ids))
|
||||||
|
@ -1920,7 +1920,7 @@ func getUsersByID(dbi sqlProvider, dialect dialect, resultsPtr *[]User, ids ...u
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func getUserByID(dbi sqlProvider, dialect dialect, result *User, id uint) error {
|
func getUserByID(dbi DBAdapter, dialect dialect, result *User, id uint) error {
|
||||||
db := dbi.(*sql.DB)
|
db := dbi.(*sql.DB)
|
||||||
|
|
||||||
row := db.QueryRow(`SELECT id, name, age, address FROM users WHERE id=`+dialect.Placeholder(0), id)
|
row := db.QueryRow(`SELECT id, name, age, address FROM users WHERE id=`+dialect.Placeholder(0), id)
|
||||||
|
@ -1941,7 +1941,7 @@ func getUserByID(dbi sqlProvider, dialect dialect, result *User, id uint) error
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func getUserByName(dbi sqlProvider, dialect dialect, result *User, name string) error {
|
func getUserByName(dbi DBAdapter, dialect dialect, result *User, name string) error {
|
||||||
db := dbi.(*sql.DB)
|
db := dbi.(*sql.DB)
|
||||||
|
|
||||||
row := db.QueryRow(`SELECT id, name, age, address FROM users WHERE name=`+dialect.Placeholder(0), name)
|
row := db.QueryRow(`SELECT id, name, age, address FROM users WHERE name=`+dialect.Placeholder(0), name)
|
||||||
|
|
24
mocks.go
24
mocks.go
|
@ -2,10 +2,10 @@ package ksql
|
||||||
|
|
||||||
import "context"
|
import "context"
|
||||||
|
|
||||||
var _ SQLProvider = MockSQLProvider{}
|
var _ Provider = Mock{}
|
||||||
|
|
||||||
// MockSQLProvider ...
|
// Mock ...
|
||||||
type MockSQLProvider struct {
|
type Mock struct {
|
||||||
InsertFn func(ctx context.Context, table Table, record interface{}) error
|
InsertFn func(ctx context.Context, table Table, record interface{}) error
|
||||||
UpdateFn func(ctx context.Context, table Table, record interface{}) error
|
UpdateFn func(ctx context.Context, table Table, record interface{}) error
|
||||||
DeleteFn func(ctx context.Context, table Table, ids ...interface{}) error
|
DeleteFn func(ctx context.Context, table Table, ids ...interface{}) error
|
||||||
|
@ -15,45 +15,45 @@ type MockSQLProvider struct {
|
||||||
QueryChunksFn func(ctx context.Context, parser ChunkParser) error
|
QueryChunksFn func(ctx context.Context, parser ChunkParser) error
|
||||||
|
|
||||||
ExecFn func(ctx context.Context, query string, params ...interface{}) error
|
ExecFn func(ctx context.Context, query string, params ...interface{}) error
|
||||||
TransactionFn func(ctx context.Context, fn func(db SQLProvider) error) error
|
TransactionFn func(ctx context.Context, fn func(db Provider) error) error
|
||||||
}
|
}
|
||||||
|
|
||||||
// Insert ...
|
// Insert ...
|
||||||
func (m MockSQLProvider) Insert(ctx context.Context, table Table, record interface{}) error {
|
func (m Mock) Insert(ctx context.Context, table Table, record interface{}) error {
|
||||||
return m.InsertFn(ctx, table, record)
|
return m.InsertFn(ctx, table, record)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update ...
|
// Update ...
|
||||||
func (m MockSQLProvider) Update(ctx context.Context, table Table, record interface{}) error {
|
func (m Mock) Update(ctx context.Context, table Table, record interface{}) error {
|
||||||
return m.UpdateFn(ctx, table, record)
|
return m.UpdateFn(ctx, table, record)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Delete ...
|
// Delete ...
|
||||||
func (m MockSQLProvider) Delete(ctx context.Context, table Table, ids ...interface{}) error {
|
func (m Mock) Delete(ctx context.Context, table Table, ids ...interface{}) error {
|
||||||
return m.DeleteFn(ctx, table, ids...)
|
return m.DeleteFn(ctx, table, ids...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Query ...
|
// Query ...
|
||||||
func (m MockSQLProvider) Query(ctx context.Context, records interface{}, query string, params ...interface{}) error {
|
func (m Mock) Query(ctx context.Context, records interface{}, query string, params ...interface{}) error {
|
||||||
return m.QueryFn(ctx, records, query, params...)
|
return m.QueryFn(ctx, records, query, params...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// QueryOne ...
|
// QueryOne ...
|
||||||
func (m MockSQLProvider) QueryOne(ctx context.Context, record interface{}, query string, params ...interface{}) error {
|
func (m Mock) QueryOne(ctx context.Context, record interface{}, query string, params ...interface{}) error {
|
||||||
return m.QueryOneFn(ctx, record, query, params...)
|
return m.QueryOneFn(ctx, record, query, params...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// QueryChunks ...
|
// QueryChunks ...
|
||||||
func (m MockSQLProvider) QueryChunks(ctx context.Context, parser ChunkParser) error {
|
func (m Mock) QueryChunks(ctx context.Context, parser ChunkParser) error {
|
||||||
return m.QueryChunksFn(ctx, parser)
|
return m.QueryChunksFn(ctx, parser)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Exec ...
|
// Exec ...
|
||||||
func (m MockSQLProvider) Exec(ctx context.Context, query string, params ...interface{}) error {
|
func (m Mock) Exec(ctx context.Context, query string, params ...interface{}) error {
|
||||||
return m.ExecFn(ctx, query, params...)
|
return m.ExecFn(ctx, query, params...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Transaction ...
|
// Transaction ...
|
||||||
func (m MockSQLProvider) Transaction(ctx context.Context, fn func(db SQLProvider) error) error {
|
func (m Mock) Transaction(ctx context.Context, fn func(db Provider) error) error {
|
||||||
return m.TransactionFn(ctx, fn)
|
return m.TransactionFn(ctx, fn)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue