Skip to content

Commit ac4f70d

Browse files
committed
Added method to return a list of sqlcode schemas.
1 parent ec8049e commit ac4f70d

File tree

5 files changed

+78
-6
lines changed

5 files changed

+78
-6
lines changed

deployable.go

+55-3
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@ import (
44
"context"
55
"database/sql"
66
"fmt"
7-
mssql "github.com/denisenkom/go-mssqldb"
8-
"github.com/pkg/errors"
9-
"github.com/vippsas/sqlcode/sqlparser"
107
"io/fs"
118
"strconv"
129
"strings"
10+
"time"
11+
12+
mssql "github.com/denisenkom/go-mssqldb"
13+
"github.com/pkg/errors"
14+
"github.com/vippsas/sqlcode/sqlparser"
1315
)
1416

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

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

142+
// When a lock is opened with the Transaction lock owner,
143+
// that lock is released when the transaction is committed or rolled back.
140144
var lockRetCode int
141145
err := dbc.QueryRowContext(ctx, `
142146
declare @retcode int;
@@ -261,3 +265,51 @@ func MustInclude(opts Options, fsys ...fs.FS) Deployable {
261265
}
262266
return result
263267
}
268+
269+
type SchemaObject struct {
270+
Name string
271+
SchemaId int
272+
Objects int
273+
CreateDate time.Time
274+
ModifyDate time.Time
275+
}
276+
277+
func (s *SchemaObject) Suffix() string {
278+
return strings.Split(s.Name, "@")[1]
279+
}
280+
281+
// Return a list of sqlcode schemas have been uploaded to the database.
282+
// This includes all current and unused schemas.
283+
func (d *Deployable) ListUploaded(ctx context.Context, dbc DB) []*SchemaObject {
284+
objects := []*SchemaObject{}
285+
impersonate(ctx, dbc, "sqlcode-deploy-sandbox-user", func(conn *sql.Conn) error {
286+
rows, err := conn.QueryContext(ctx, `
287+
select
288+
s.name
289+
, s.schema_id
290+
, o.objects
291+
, o.create_date
292+
, o.modify_date
293+
from sys.schemas s
294+
outer apply (
295+
select count(o.object_id) as objects
296+
, min(o.create_date) as create_date
297+
, max(o.modify_date) as modify_date
298+
from sys.objects o
299+
where o.schema_id = s.schema_id
300+
) as o
301+
where s.name like 'code@%'`)
302+
if err != nil {
303+
return err
304+
}
305+
306+
for rows.Next() {
307+
zero := &SchemaObject{}
308+
rows.Scan(&zero.Name, &zero.Objects, &zero.SchemaId, &zero.CreateDate, &zero.ModifyDate)
309+
objects = append(objects, zero)
310+
}
311+
312+
return nil
313+
})
314+
return objects
315+
}

docker-compose.test.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ services:
33
# mssql
44
#
55
mssql:
6-
image: mcr.microsoft.com/mssql/server:2022-CU14-ubuntu-22.04
6+
image: mcr.microsoft.com/mssql/server:latest
77

88
hostname: mssql
99
container_name: mssql

migrations/0001.sqlcode.sql

+2-1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ alter role [sqlcode-deploy-role] add member [sqlcode-deploy-sandbox-user];
2121
-- seems fair...
2222
grant impersonate on user::[sqlcode-deploy-sandbox-user] to [sqlcode-deploy-role];
2323

24+
2425
go
2526

2627
create schema sqlcode;
@@ -63,7 +64,7 @@ as begin
6364
declare @msg varchar(max)
6465
declare @sql nvarchar(max)
6566

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

6869
declare @schemaname nvarchar(max) = concat('code@', @schemasuffix)
6970
declare @schemaid int = (select schema_id from sys.schemas where name = @schemaname);

preprocess_test.go

+15-1
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,24 @@
11
package sqlcode
22

33
import (
4-
"github.com/stretchr/testify/assert"
54
"testing"
5+
6+
"github.com/stretchr/testify/assert"
7+
"github.com/stretchr/testify/require"
8+
"github.com/vippsas/sqlcode/sqlparser"
69
)
710

11+
func TestSchemaSuffixFromHash(t *testing.T) {
12+
t.Run("returns a unique hash", func(t *testing.T) {
13+
doc := sqlparser.Document{
14+
Declares: []sqlparser.Declare{},
15+
}
16+
17+
value := SchemaSuffixFromHash(doc)
18+
require.Equal(t, value, SchemaSuffixFromHash(doc))
19+
})
20+
}
21+
822
func TestLineNumberInInput(t *testing.T) {
923

1024
// Scenario:

sqltest/sqlcode_test.go

+5
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,9 @@ func Test_RowsAffected(t *testing.T) {
2323
rowsAffected, err := res.RowsAffected()
2424
require.NoError(t, err)
2525
assert.Equal(t, int64(1), rowsAffected)
26+
27+
schemas := SQL.ListUploaded(ctx, fixture.DB)
28+
require.Len(t, schemas, 1)
29+
require.Equal(t, 6, schemas[0].Objects)
30+
require.Equal(t, "5420c0269aaf", schemas[0].Suffix())
2631
}

0 commit comments

Comments
 (0)