feat: custom query's #6

Merged
SoXX merged 3 commits from dev/issue-5 into main 2024-07-27 18:06:57 +00:00
5 changed files with 164 additions and 2 deletions
Showing only changes of commit 470681fd4f - Show all commits

View File

@ -0,0 +1,25 @@
package postgres
import (
"context"
"database/sql"
"errors"
"gorm.io/gorm"
)
func ExecuteRawStatement(ctx context.Context, db *gorm.DB, query string, args ...any) (*sql.Rows, error) {
Alphyron marked this conversation as resolved Outdated

An Exec is an sql command without an return. You can use db.Exec instead,
Please create another functtion list QueryRawStatement to do the same with db.Raw

An Exec is an sql command without an return. You can use db.Exec instead, Please create another functtion list QueryRawStatement to do the same with db.Raw
if query == "" {
return nil, errors.New("query can not be empty")
}
if args == nil {
return nil, errors.New("arguments can not be nil")
}
result, err := db.WithContext(ctx).Raw(query, args...).Rows()
if err != nil {
return nil, err
}
return result, nil
}

View File

@ -0,0 +1,69 @@
package postgres
import (
"context"
"database/sql"
"git.anthrove.art/Anthrove/otter-space-sdk/v2/test"
"gorm.io/gorm"
"reflect"
"testing"
)
func TestExecuteRawStatement(t *testing.T) {
// Setup trow away container
ctx := context.Background()
container, gormDB, err := test.StartPostgresContainer(ctx)
if err != nil {
t.Fatalf("Could not start PostgreSQL container: %v", err)
}
defer container.Terminate(ctx)
// Test
type args struct {
ctx context.Context
db *gorm.DB
query string
args []any
}
tests := []struct {
name string
args args
want *sql.Rows
wantErr bool
}{
{
name: "Test 01: Empty Query",
args: args{
ctx: ctx,
db: gormDB,
query: "",
args: nil,
},
want: nil,
wantErr: true,
},
{
name: "Test 02: Nil Query",
args: args{
ctx: ctx,
db: gormDB,
query: "aasd",
args: nil,
},
want: nil,
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := ExecuteRawStatement(tt.args.ctx, tt.args.db, tt.args.query, tt.args.args...)
if (err != nil) != tt.wantErr {
t.Errorf("ExecuteRawStatement() error = %v, wantErr %v", err, tt.wantErr)
return
}
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("ExecuteRawStatement() got = %v, want %v", got, tt.want)
}
})
}
}

View File

@ -2,6 +2,7 @@ package database
import (
"context"
"database/sql"
"git.anthrove.art/Anthrove/otter-space-sdk/v2/pkg/models"
)
@ -27,4 +28,7 @@ type OtterSpace interface {
// TagGroup contains all function that are needed to manage the TagGroup
TagGroup
// ExecuteRawStatement run a custom query.
ExecuteRawStatement(ctx context.Context, query string, args ...any) (*sql.Rows, error)
}

View File

@ -2,6 +2,7 @@ package database
import (
"context"
"database/sql"
"embed"
"fmt"
log2 "log"
@ -160,8 +161,6 @@ func (p *postgresqlConnection) GetSourceByDomain(ctx context.Context, sourceDoma
return postgres.GetSourceByDomain(ctx, p.db, sourceDomain)
}
// NEW FUNCTIONS
func (p *postgresqlConnection) UpdateUserSourceScrapeTimeInterval(ctx context.Context, anthroveUserID models.AnthroveUserID, sourceID models.AnthroveSourceID, scrapeTime models.AnthroveScrapeTimeInterval) error {
return postgres.UpdateUserSourceScrapeTimeInterval(ctx, p.db, anthroveUserID, sourceID, scrapeTime)
}
@ -231,6 +230,10 @@ func (p *postgresqlConnection) CreateTagGroupInBatch(ctx context.Context, tagGro
}
func (p *postgresqlConnection) ExecuteRawStatement(ctx context.Context, query string, args ...any) (*sql.Rows, error) {
return postgres.ExecuteRawStatement(ctx, p.db, query, args...)
}
// HELPER
func (p *postgresqlConnection) migrateDatabase(dbPool *gorm.DB) error {

View File

@ -2,6 +2,7 @@ package database
import (
"context"
"database/sql"
"fmt"
"reflect"
"testing"
@ -3671,3 +3672,63 @@ func checkFavoritePosts(got *models.FavoriteList, want *models.FavoriteList) boo
return true
}
func Test_postgresqlConnection_ExecuteRawStatement(t *testing.T) {
// Setup trow away container
ctx := context.Background()
container, gormDB, err := test.StartPostgresContainer(ctx)
if err != nil {
t.Fatalf("Could not start PostgreSQL container: %v", err)
}
defer container.Terminate(ctx)
// Test
type args struct {
ctx context.Context
query string
args []any
}
tests := []struct {
name string
args args
want *sql.Rows
wantErr bool
}{
{
name: "Test 01: Empty Query",
args: args{
ctx: ctx,
query: "",
args: nil,
},
want: nil,
wantErr: true,
},
{
name: "Test 02: Nil Query",
args: args{
ctx: ctx,
query: "aasd",
args: nil,
},
want: nil,
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
p := &postgresqlConnection{
db: gormDB,
debug: true,
}
got, err := p.ExecuteRawStatement(tt.args.ctx, tt.args.query, tt.args.args...)
if (err != nil) != tt.wantErr {
t.Errorf("ExecuteRawStatement() error = %v, wantErr %v", err, tt.wantErr)
return
}
if !reflect.DeepEqual(got, tt.want) {
t.Errorf("ExecuteRawStatement() got = %v, want %v", got, tt.want)
}
})
}
}