Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 55 additions & 3 deletions deployable.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,14 @@ import (
"context"
"database/sql"
"fmt"
mssql "github.com/denisenkom/go-mssqldb"
"github.com/pkg/errors"
"github.com/vippsas/sqlcode/sqlparser"
"io/fs"
"strconv"
"strings"
"time"

mssql "github.com/denisenkom/go-mssqldb"
"github.com/pkg/errors"
"github.com/vippsas/sqlcode/sqlparser"
)

type Deployable struct {
Expand Down Expand Up @@ -137,6 +139,8 @@ func (d *Deployable) EnsureUploaded(ctx context.Context, dbc DB) error {

lockResourceName := "sqlcode.EnsureUploaded/" + d.SchemaSuffix

// When a lock is opened with the Transaction lock owner,
// that lock is released when the transaction is committed or rolled back.
var lockRetCode int
err := dbc.QueryRowContext(ctx, `
declare @retcode int;
Expand Down Expand Up @@ -261,3 +265,51 @@ func MustInclude(opts Options, fsys ...fs.FS) Deployable {
}
return result
}

type SchemaObject struct {
Name string
SchemaId int
Objects int
CreateDate time.Time
ModifyDate time.Time
}

func (s *SchemaObject) Suffix() string {
return strings.Split(s.Name, "@")[1]
}

// Return a list of sqlcode schemas that have been uploaded to the database.
// This includes all current and unused schemas.
func (d *Deployable) ListUploaded(ctx context.Context, dbc DB) []*SchemaObject {
objects := []*SchemaObject{}
impersonate(ctx, dbc, "sqlcode-deploy-sandbox-user", func(conn *sql.Conn) error {
rows, err := conn.QueryContext(ctx, `
select
s.name
, s.schema_id
, o.objects
, o.create_date
, o.modify_date
from sys.schemas s
outer apply (
select count(o.object_id) as objects
, min(o.create_date) as create_date
, max(o.modify_date) as modify_date
from sys.objects o
where o.schema_id = s.schema_id
) as o
where s.name like 'code@%'`)
if err != nil {
return err
}

for rows.Next() {
zero := &SchemaObject{}
rows.Scan(&zero.Name, &zero.Objects, &zero.SchemaId, &zero.CreateDate, &zero.ModifyDate)
objects = append(objects, zero)
}

return nil
})
return objects
}
2 changes: 1 addition & 1 deletion docker-compose.test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ services:
# mssql
#
mssql:
image: mcr.microsoft.com/mssql/server:2022-CU18-ubuntu-22.04
image: mcr.microsoft.com/mssql/server:latest

hostname: mssql
container_name: mssql
Expand Down
3 changes: 2 additions & 1 deletion migrations/0001.sqlcode.sql
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ alter role [sqlcode-deploy-role] add member [sqlcode-deploy-sandbox-user];
-- seems fair...
grant impersonate on user::[sqlcode-deploy-sandbox-user] to [sqlcode-deploy-role];


go

create schema sqlcode;
Expand Down Expand Up @@ -63,7 +64,7 @@ as begin
declare @msg varchar(max)
declare @sql nvarchar(max)

if @@trancount = 0 throw 55001, 'You should run sqlcode.CreateCodeSchema within a transaction', 1;
if @@trancount = 0 throw 55001, 'You should run sqlcode.DropCodeSchema within a transaction', 1;

declare @schemaname nvarchar(max) = concat('code@', @schemasuffix)
declare @schemaid int = (select schema_id from sys.schemas where name = @schemaname);
Expand Down
16 changes: 15 additions & 1 deletion preprocess_test.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,24 @@
package sqlcode

import (
"github.com/stretchr/testify/assert"
"testing"

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/vippsas/sqlcode/sqlparser"
)

func TestSchemaSuffixFromHash(t *testing.T) {
t.Run("returns a unique hash", func(t *testing.T) {
doc := sqlparser.Document{
Declares: []sqlparser.Declare{},
}

value := SchemaSuffixFromHash(doc)
require.Equal(t, value, SchemaSuffixFromHash(doc))
})
}

func TestLineNumberInInput(t *testing.T) {

// Scenario:
Expand Down
5 changes: 5 additions & 0 deletions sqltest/sqlcode_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,9 @@ func Test_RowsAffected(t *testing.T) {
rowsAffected, err := res.RowsAffected()
require.NoError(t, err)
assert.Equal(t, int64(1), rowsAffected)

schemas := SQL.ListUploaded(ctx, fixture.DB)
require.Len(t, schemas, 1)
require.Equal(t, 6, schemas[0].Objects)
require.Equal(t, "5420c0269aaf", schemas[0].Suffix())
}