Skip to content

Commit 3f8e436

Browse files
feat: include reference name in trigger
If the reference name isn't included in the trigger, we can't have multiple ones.
1 parent 92c8e92 commit 3f8e436

File tree

2 files changed

+44
-9
lines changed

2 files changed

+44
-9
lines changed

domain/schema/charm_schema_test.go

Lines changed: 43 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44
package schema
55

66
import (
7+
"context"
8+
"database/sql"
9+
10+
jc "github.com/juju/testing/checkers"
711
gc "gopkg.in/check.v1"
812
)
913

@@ -19,16 +23,47 @@ func (s *charmSchemaSuite) TestCharmSequence(c *gc.C) {
1923
// Insert the first sequence, then every other one is monotonically
2024
// increasing.
2125

22-
s.assertExecSQL(c, "INSERT INTO sequence_charm_local (source_id, reference_name, sequence) VALUES ('1', 'foo', 1)")
23-
s.assertExecSQL(c, "INSERT INTO charm (uuid, source_id, reference_name, revision) VALUES ('abc', '1', 'foo', 1)")
26+
s.assertExecSQL(c, "INSERT INTO sequence_charm_local (reference_name, sequence) VALUES ('foo', 1)")
27+
s.assertExecSQL(c, "UPDATE sequence_charm_local SET sequence=2 WHERE reference_name='foo'")
28+
s.assertExecSQL(c, "UPDATE sequence_charm_local SET sequence=3 WHERE reference_name='foo'")
29+
30+
// Ensure we can't go backwards.
2431

25-
s.assertExecSQL(c, "UPDATE sequence_charm_local SET sequence=2 WHERE source_id='1' AND reference_name='foo'")
26-
s.assertExecSQL(c, "INSERT INTO charm (uuid, source_id, reference_name, revision) VALUES ('def', '1', 'foo', 2)")
32+
s.assertExecSQLError(c, "UPDATE sequence_charm_local SET sequence=2 AND reference_name='foo'", "sequence number must monotonically increase")
33+
}
2734

28-
s.assertExecSQL(c, "UPDATE sequence_charm_local SET sequence=3 WHERE source_id='1' AND reference_name='foo'")
29-
s.assertExecSQL(c, "INSERT INTO charm (uuid, source_id, reference_name, revision) VALUES ('ghi', '1', 'foo', 3)")
35+
func (s *charmSchemaSuite) TestCharmSequenceWithMultipleReferenceNames(c *gc.C) {
36+
s.applyDDL(c, ModelDDL())
3037

31-
// Ensure we can't go backwards.
38+
s.assertExecSQL(c, "INSERT INTO sequence_charm_local (reference_name, sequence) VALUES ('foo', 1)")
39+
s.assertExecSQL(c, "UPDATE sequence_charm_local SET sequence=2 WHERE reference_name='foo'")
40+
s.assertExecSQL(c, "INSERT INTO sequence_charm_local (reference_name, sequence) VALUES ('bar', 1)")
41+
s.assertExecSQL(c, "UPDATE sequence_charm_local SET sequence=3 WHERE reference_name='foo'")
42+
s.assertExecSQL(c, "UPDATE sequence_charm_local SET sequence=2 WHERE reference_name='bar'")
43+
44+
s.assertSequence(c, "foo", 3)
45+
s.assertSequence(c, "bar", 2)
46+
47+
}
48+
49+
func (s *charmSchemaSuite) assertSequence(c *gc.C, name string, expected int) {
50+
var sequence int
51+
err := s.TxnRunner().StdTxn(context.Background(), func(ctx context.Context, tx *sql.Tx) error {
52+
row, err := tx.QueryContext(ctx, "SELECT sequence FROM sequence_charm_local WHERE reference_name=?", name)
53+
if err != nil {
54+
return err
55+
}
56+
defer row.Close()
57+
58+
if !row.Next() {
59+
return sql.ErrNoRows
60+
}
61+
if err := row.Scan(&sequence); err != nil {
62+
return err
63+
}
3264

33-
s.assertExecSQLError(c, "UPDATE sequence_charm_local SET sequence=2 WHERE source_id='1' AND reference_name='foo'", "sequence number must monotonically increase")
65+
return row.Err()
66+
})
67+
c.Assert(err, jc.ErrorIsNil)
68+
c.Check(sequence, gc.Equals, expected)
3469
}

domain/schema/model.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ func ModelDDL() *schema.Schema {
126126
),
127127

128128
triggerGuardForTable("sequence_charm_local",
129-
"NEW.sequence <= OLD.sequence",
129+
"OLD.reference_name = NEW.reference_name AND NEW.sequence <= OLD.sequence",
130130
"sequence number must monotonically increase",
131131
),
132132
)

0 commit comments

Comments
 (0)