|
6 | 6 | "encoding/json" |
7 | 7 | "io" |
8 | 8 | "os" |
| 9 | + "strings" |
9 | 10 |
|
10 | 11 | _ "github.com/mattn/go-sqlite3" |
11 | 12 | "github.com/pkg/errors" |
@@ -47,12 +48,15 @@ func (s *Sqlite) GetDevProject(ctx context.Context, key string) (*model.Project, |
47 | 48 | var flagStateData string |
48 | 49 |
|
49 | 50 | row := s.database.QueryRowContext(ctx, ` |
50 | | - SELECT key, source_environment_key, context, last_sync_time, flag_state |
51 | | - FROM projects |
| 51 | + SELECT key, source_environment_key, context, last_sync_time, flag_state, payload_version |
| 52 | + FROM projects |
52 | 53 | WHERE key = ? |
53 | 54 | `, key) |
54 | 55 |
|
55 | | - if err := row.Scan(&project.Key, &project.SourceEnvironmentKey, &contextData, &project.LastSyncTime, &flagStateData); err != nil { |
| 56 | + if err := row.Scan( |
| 57 | + &project.Key, &project.SourceEnvironmentKey, &contextData, |
| 58 | + &project.LastSyncTime, &flagStateData, &project.PayloadVersion, |
| 59 | + ); err != nil { |
56 | 60 | if errors.Is(err, sql.ErrNoRows) { |
57 | 61 | return nil, model.NewErrNotFound("project", key) |
58 | 62 | } |
@@ -200,14 +204,15 @@ SELECT 1 FROM projects WHERE key = ? |
200 | 204 | return |
201 | 205 | } |
202 | 206 | _, err = tx.Exec(` |
203 | | -INSERT INTO projects (key, source_environment_key, context, last_sync_time, flag_state) |
204 | | -VALUES (?, ?, ?, ?, ?) |
| 207 | +INSERT INTO projects (key, source_environment_key, context, last_sync_time, flag_state, payload_version) |
| 208 | +VALUES (?, ?, ?, ?, ?, ?) |
205 | 209 | `, |
206 | 210 | project.Key, |
207 | 211 | project.SourceEnvironmentKey, |
208 | 212 | project.Context.JSONString(), |
209 | 213 | project.LastSyncTime, |
210 | 214 | string(flagsStateJson), |
| 215 | + project.PayloadVersion, |
211 | 216 | ) |
212 | 217 | if err != nil { |
213 | 218 | return |
@@ -341,6 +346,20 @@ func (s *Sqlite) UpsertOverride(ctx context.Context, override model.Override) (m |
341 | 346 | return override, nil |
342 | 347 | } |
343 | 348 |
|
| 349 | +func (s *Sqlite) IncrementProjectPayloadVersion(ctx context.Context, projectKey string) (int, error) { |
| 350 | + row := s.database.QueryRowContext(ctx, ` |
| 351 | + UPDATE projects |
| 352 | + SET payload_version = payload_version + 1 |
| 353 | + WHERE key = ? |
| 354 | + RETURNING payload_version |
| 355 | + `, projectKey) |
| 356 | + var version int |
| 357 | + if err := row.Scan(&version); err != nil { |
| 358 | + return 0, errors.Wrap(err, "unable to increment payload version") |
| 359 | + } |
| 360 | + return version, nil |
| 361 | +} |
| 362 | + |
344 | 363 | func (s *Sqlite) DeactivateOverride(ctx context.Context, projectKey, flagKey string) (int, error) { |
345 | 364 | row := s.database.QueryRowContext(ctx, ` |
346 | 365 | UPDATE overrides |
@@ -373,12 +392,12 @@ func (s *Sqlite) RestoreBackup(ctx context.Context, stream io.Reader) (string, e |
373 | 392 | } |
374 | 393 | err = os.Rename(filepath, s.dbPath) |
375 | 394 | if err != nil { |
376 | | - //panic because this would really leave the app in an invalid state |
| 395 | + // panic because this would really leave the app in an invalid state |
377 | 396 | panic(err) |
378 | 397 | } |
379 | 398 | s.database, err = sql.Open("sqlite3", s.dbPath) |
380 | 399 | if err != nil { |
381 | | - //panic because this would really leave the app in an invalid state |
| 400 | + // panic because this would really leave the app in an invalid state |
382 | 401 | panic(err) |
383 | 402 | } |
384 | 403 |
|
@@ -445,12 +464,20 @@ func (s *Sqlite) runMigrations(ctx context.Context) error { |
445 | 464 | source_environment_key text NOT NULL, |
446 | 465 | context text NOT NULL, |
447 | 466 | last_sync_time timestamp NOT NULL, |
448 | | - flag_state TEXT NOT NULL |
| 467 | + flag_state TEXT NOT NULL, |
| 468 | + payload_version INTEGER NOT NULL DEFAULT 1 |
449 | 469 | )`) |
450 | 470 | if err != nil { |
451 | 471 | return err |
452 | 472 | } |
453 | 473 |
|
| 474 | + // Migration: add payload_version to existing databases that predate this column. |
| 475 | + _, err = tx.Exec(`ALTER TABLE projects ADD COLUMN payload_version INTEGER NOT NULL DEFAULT 1`) |
| 476 | + if err != nil && !strings.Contains(err.Error(), "duplicate column name") { |
| 477 | + return err |
| 478 | + } |
| 479 | + err = nil |
| 480 | + |
454 | 481 | _, err = tx.Exec(` |
455 | 482 | CREATE TABLE IF NOT EXISTS overrides ( |
456 | 483 | project_key text NOT NULL, |
|
0 commit comments