Skip to content
This repository was archived by the owner on Feb 21, 2024. It is now read-only.

Commit dd90838

Browse files
authored
Cloud 1457 (#2347)
* added dupe check * added dupe check for databases * prevent dupe table names * refactored table dupe search * further refactoring This commit, further refactoring of checking for duplicates are done with SQL commands Also adjusted tests to confirm changes * fixed linting errors * moved the errors around to keep them consolidated in the dax package also removed useless comment
1 parent fc74c8e commit dd90838

3 files changed

Lines changed: 39 additions & 4 deletions

File tree

dax/controller/schemar/schemar_test.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -301,12 +301,12 @@ func TestSQLSchemar(t *testing.T) {
301301
requireCode(t, err, cschemar.ErrCodeFieldNameInvalid)
302302
})
303303

304-
t.Run("Test create table that already exists", func(t *testing.T) {
304+
t.Run("Test create table where table name already exists", func(t *testing.T) {
305305
tx, err = trans.BeginTx(context.Background(), true)
306306
require.NoError(t, err)
307307
defer tx.Rollback()
308308
err = schemar.CreateTable(tx, qtbl)
309-
requireCode(t, err, dax.ErrTableIDExists)
309+
requireCode(t, err, dax.ErrTableNameExists)
310310
})
311311

312312
t.Run("Find database by name that doesn't exist", func(t *testing.T) {
@@ -317,6 +317,17 @@ func TestSQLSchemar(t *testing.T) {
317317
requireCode(t, err, dax.ErrDatabaseNameDoesNotExist)
318318
})
319319

320+
t.Run("Create database with database name that already exists", func(t *testing.T) {
321+
tx, err = trans.BeginTx(context.Background(), true)
322+
require.NoError(t, err)
323+
defer tx.Rollback()
324+
err = schemar.CreateDatabase(tx,
325+
&dax.QualifiedDatabase{
326+
OrganizationID: orgID,
327+
Database: dax.Database{ID: dbID2, Name: dbName}})
328+
requireCode(t, err, dax.ErrDatabaseNameExists)
329+
})
330+
320331
t.Run("Find database by ID that doesn't exist", func(t *testing.T) {
321332
tx, err = trans.BeginTx(context.Background(), true)
322333
require.NoError(t, err)
@@ -335,6 +346,7 @@ func TestSQLSchemar(t *testing.T) {
335346
}
336347

337348
func requireCode(t *testing.T, err error, code errors.Code) {
349+
t.Helper()
338350
if !errors.Is(err, code) {
339351
t.Fatalf("Error '%v' does not have code %s.", err, code)
340352
}

dax/controller/sqldb/schemar.go

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,15 +50,23 @@ func (s *Schemar) CreateDatabase(tx dax.Transaction, qdb *dax.QualifiedDatabase)
5050
return dax.NewErrDatabaseIDExists(qdb.QualifiedID())
5151
}
5252

53+
// Check if org exists, if not, create org.
5354
org := &models.Organization{ID: string(qdb.OrganizationID)}
54-
if ok, err := dt.C.Where("id = ?", qdb.OrganizationID).Exists(org); err != nil {
55+
if exists, err := dt.C.Where("id = ?", qdb.OrganizationID).Exists(org); err != nil {
5556
return errors.Wrap(err, "checking for org")
56-
} else if !ok {
57+
} else if !exists {
5758
if err := dt.C.Create(org); err != nil {
5859
return errors.Wrap(err, "creating organization")
5960
}
6061
}
6162

63+
// Check if database name exists in org, if does, throw error.
64+
if exists, err := dt.C.Where("name = ? AND organization_id = ?", qdb.Name, org.ID).Exists(&models.Database{}); err != nil {
65+
return errors.Wrap(err, "checking database name")
66+
} else if exists {
67+
return dax.NewErrDatabaseNameExists(qdb.Name)
68+
}
69+
6270
db := toModelDatabase(qdb)
6371

6472
if err := dt.C.Create(db); err != nil {
@@ -244,6 +252,13 @@ func (s *Schemar) CreateTable(tx dax.Transaction, qtbl *dax.QualifiedTable) erro
244252
return dax.NewErrInvalidTransaction("*sqldb.DaxTransaction")
245253
}
246254

255+
// Check to see if table name exists for a database ID, and if so, throw error
256+
if exists, err := dt.C.Where("name = ? AND database_id = ?", qtbl.Name, qtbl.DatabaseID).Exists(&models.Table{}); err != nil {
257+
return errors.Wrap(err, "checking if table name exists")
258+
} else if exists {
259+
return dax.NewErrTableNameExists(qtbl.Name)
260+
}
261+
247262
tbl := toModelTable(qtbl)
248263

249264
err := dt.C.Eager().Create(tbl)

dax/errors.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ const (
1212
ErrDatabaseIDExists errors.Code = "DatabaseIDExists"
1313
ErrDatabaseIDDoesNotExist errors.Code = "DatabaseIDDoesNotExist"
1414
ErrDatabaseNameDoesNotExist errors.Code = "DatabaseNameDoesNotExist"
15+
ErrDatabaseNameExists errors.Code = "DatabaseNameExists"
1516

1617
ErrTableIDExists errors.Code = "TableIDExists"
1718
ErrTableKeyExists errors.Code = "TableKeyExists"
@@ -59,6 +60,13 @@ func NewErrDatabaseNameDoesNotExist(dbName DatabaseName) error {
5960
)
6061
}
6162

63+
func NewErrDatabaseNameExists(dbName DatabaseName) error {
64+
return errors.New(
65+
ErrDatabaseNameExists,
66+
fmt.Sprintf("database name %s already exists", dbName),
67+
)
68+
}
69+
6270
func NewErrTableIDDoesNotExist(qtid QualifiedTableID) error {
6371
return errors.New(
6472
ErrTableIDDoesNotExist,

0 commit comments

Comments
 (0)