Skip to content

Commit 521a7de

Browse files
committed
Fix(storage): fix an sql error when degrade version
Signed-off-by: WhereAreBugs <[email protected]>
1 parent a703f1e commit 521a7de

File tree

2 files changed

+71
-24
lines changed

2 files changed

+71
-24
lines changed

internal/storage/sql.go

Lines changed: 51 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ type Cluster struct {
109109
var (
110110
// table: clusters
111111
CreateClustersTable = `
112-
CREATE TABLE IF NOT EXISTS clusters (
112+
CREATE TABLE IF NOT EXISTS clusters_new (
113113
id INTEGER PRIMARY KEY AUTOINCREMENT,
114114
uuid TEXT NOT NULL,
115115
name TEXT NOT NULL UNIQUE,
@@ -124,38 +124,78 @@ var (
124124

125125
// insert cluster
126126
InsertCluster = `
127-
INSERT INTO clusters(uuid, name, description, topology, type, pool, create_time)
127+
INSERT INTO clusters_new(uuid, name, description, topology, type, pool, create_time)
128128
VALUES(?, ?, ?, ?, ?, "", datetime('now','localtime'))
129129
`
130-
// check new cluster column
131-
GetTypeFiled = `SELECT COUNT(*) FROM pragma_table_info('clusters') WHERE name = 'type'`
130+
// check if view exists
131+
isViewExist = `SELECT COUNT(*) FROM sqlite_master WHERE type='view' AND name = 'clusters'`
132132

133133
// update new cluster column
134-
UpdateCluster = `ALTER TABLE clusters ADD COLUMN type TEXT NOT NULL DEFAULT 'develop'`
134+
AddTypeField = `ALTER TABLE clusters_new ADD COLUMN type TEXT NOT NULL DEFAULT 'develop'`
135+
136+
// rename clusters table
137+
RenameClusters = `ALTER TABLE clusters RENAME TO clusters_new`
138+
139+
// create view for old table
140+
CreateClustersView = `
141+
CREATE VIEW IF NOT EXISTS clusters AS
142+
SELECT id, uuid, name, description, topology, pool, create_time, current
143+
FROM clusters_new
144+
`
145+
146+
// insert tigger
147+
InsertTrigger = `
148+
CREATE TRIGGER IF NOT EXISTS cluster_insert_trigger
149+
INSTEAD OF INSERT ON clusters
150+
FOR EACH ROW
151+
BEGIN
152+
INSERT INTO clusters_new VALUES (new.id, new.uuid, new.name, new.description, new.topology, new.pool, new.create_time, new.current,'develop');
153+
END
154+
`
155+
156+
// update trigger
157+
UpdateTrigger = `
158+
CREATE TRIGGER IF NOT EXISTS cluster_update_trigger
159+
INSTEAD OF UPDATE ON clusters
160+
FOR EACH ROW
161+
BEGIN
162+
UPDATE clusters_new SET uuid = new.uuid, name = new.name, description = new.description, topology = new.topology, pool = new.pool, create_time = new.create_time, current = new.current WHERE id = new.id;
163+
END
164+
`
165+
166+
// delete trigger
167+
DeleteTrigger = `
168+
CREATE TRIGGER IF NOT EXISTS cluster_delete_trigger
169+
INSTEAD OF DELETE ON clusters
170+
FOR EACH ROW
171+
BEGIN
172+
DELETE FROM clusters_new WHERE id = old.id;
173+
END ;
174+
`
135175

136176
// delete cluster
137-
DeleteCluster = `DELETE from clusters WHERE name = ?`
177+
DeleteCluster = `DELETE from clusters_new WHERE name = ?`
138178

139179
// select cluster
140-
SelectCluster = `SELECT * FROM clusters WHERE name LIKE ?`
180+
SelectCluster = `SELECT * FROM clusters_new WHERE name LIKE ?`
141181

142182
// get current cluster
143-
GetCurrentCluster = `SELECT * FROM clusters WHERE current = 1`
183+
GetCurrentCluster = `SELECT * FROM clusters_new WHERE current = 1`
144184

145185
// checkout cluster
146186
CheckoutCluster = `
147-
UPDATE clusters
187+
UPDATE clusters_new
148188
SET current = CASE name
149189
WHEN ? THEN 1
150190
ELSE 0
151191
END
152192
`
153193

154194
// set cluster topology
155-
SetClusterTopology = `UPDATE clusters SET topology = ? WHERE id = ?`
195+
SetClusterTopology = `UPDATE clusters_new SET topology = ? WHERE id = ?`
156196

157197
// set cluster pool
158-
SetClusterPool = `UPDATE clusters SET topology = ?, pool = ? WHERE id = ?`
198+
SetClusterPool = `UPDATE clusters_new SET topology = ?, pool = ? WHERE id = ?`
159199
)
160200

161201
// service

internal/storage/storage.go

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,20 @@ func (s *Storage) init() error {
8282
CreateAuditTable,
8383
CreateMonitorTable,
8484
CreateAnyTable,
85+
CreateClustersView,
86+
InsertTrigger,
87+
UpdateTrigger,
88+
DeleteTrigger,
89+
}
90+
91+
tablesOK, err := s.CheckViewExists()
92+
if err != nil {
93+
return err
94+
}
95+
if !tablesOK {
96+
// allow failed to execute
97+
_, err = s.db.Write(RenameClusters)
98+
_, err = s.db.Write(AddTypeField)
8599
}
86100

87101
for _, sql := range sqls {
@@ -91,14 +105,7 @@ func (s *Storage) init() error {
91105
}
92106
}
93107

94-
flag, err := s.CheckTypeFiledExist()
95-
if err != nil {
96-
return err
97-
}
98-
if !flag {
99-
_, err = s.db.Write(UpdateCluster)
100-
}
101-
return err
108+
return nil
102109
}
103110

104111
func (s *Storage) write(query string, args ...any) error {
@@ -171,22 +178,22 @@ func (s *Storage) InsertCluster(name, uuid, description, topology, deployType st
171178
return s.write(InsertCluster, uuid, name, description, topology, deployType)
172179
}
173180

174-
func (s *Storage) CheckTypeFiledExist() (bool, error) {
175-
result, err := s.db.Query(GetTypeFiled)
181+
func (s *Storage) CheckViewExists() (bool, error) {
182+
result, err := s.db.Query(isViewExist)
176183
if err != nil {
177184
return false, err
178185
}
179186
defer result.Close()
180187

181-
var isFiledExist bool
188+
var exists bool
182189
for result.Next() {
183-
err = result.Scan(&isFiledExist)
190+
err = result.Scan(&exists)
184191
if err != nil {
185192
return false, err
186193
}
187194
break
188195
}
189-
return isFiledExist, nil
196+
return exists, nil
190197
}
191198

192199
func (s *Storage) DeleteCluster(name string) error {

0 commit comments

Comments
 (0)