From e2e7566f99bf7ecb20a0ef7732bc9b32648344f1 Mon Sep 17 00:00:00 2001 From: Brandur Date: Thu, 25 Dec 2025 22:46:52 -0700 Subject: [PATCH] Miscellaneous database cleanup Here, some miscellaneous database cleanup that we've been tracking for a while. Nothing here is worth sending out by itself, but the next time we do a database migration for something else, we can bundle these changes in and send them out for free. Fixes #874, #875, and #1012. --- riverdriver/river_driver_interface.go | 6 +- .../internal/dbsqlc/models.go | 19 ------ .../internal/dbsqlc/river_client.sql.go | 53 ---------------- .../internal/dbsqlc/river_client_queue.sql.go | 62 ------------------- .../internal/dbsqlc/sqlc.yaml | 4 -- .../migration/main/007_misc_cleanup.down.sql | 41 ++++++++++++ .../migration/main/007_misc_cleanup.up.sql | 20 ++++++ .../riverdrivertest/riverdrivertest.go | 4 +- .../riverpgxv5/internal/dbsqlc/models.go | 19 ------ .../internal/dbsqlc/river_client.sql | 8 --- .../internal/dbsqlc/river_client.sql.go | 53 ---------------- .../internal/dbsqlc/river_client_queue.sql | 14 ----- .../internal/dbsqlc/river_client_queue.sql.go | 60 ------------------ .../riverpgxv5/internal/dbsqlc/river_job.sql | 2 +- .../internal/dbsqlc/river_queue.sql | 2 +- .../riverpgxv5/internal/dbsqlc/sqlc.yaml | 4 -- .../migration/main/007_misc_cleanup.down.sql | 41 ++++++++++++ .../migration/main/007_misc_cleanup.up.sql | 20 ++++++ .../riversqlite/internal/dbsqlc/models.go | 19 ------ .../internal/dbsqlc/river_client.sql | 8 --- .../internal/dbsqlc/river_client_queue.sql | 14 ----- .../riversqlite/internal/dbsqlc/river_job.sql | 2 +- .../internal/dbsqlc/river_queue.sql | 2 +- .../riversqlite/internal/dbsqlc/sqlc.yaml | 4 -- .../migration/main/007_misc_cleanup.down.sql | 59 ++++++++++++++++++ .../migration/main/007_misc_cleanup.up.sql | 41 ++++++++++++ 26 files changed, 233 insertions(+), 348 deletions(-) delete mode 100644 riverdriver/riverdatabasesql/internal/dbsqlc/river_client.sql.go delete mode 100644 riverdriver/riverdatabasesql/internal/dbsqlc/river_client_queue.sql.go create mode 100644 riverdriver/riverdatabasesql/migration/main/007_misc_cleanup.down.sql create mode 100644 riverdriver/riverdatabasesql/migration/main/007_misc_cleanup.up.sql delete mode 100644 riverdriver/riverpgxv5/internal/dbsqlc/river_client.sql delete mode 100644 riverdriver/riverpgxv5/internal/dbsqlc/river_client.sql.go delete mode 100644 riverdriver/riverpgxv5/internal/dbsqlc/river_client_queue.sql delete mode 100644 riverdriver/riverpgxv5/internal/dbsqlc/river_client_queue.sql.go create mode 100644 riverdriver/riverpgxv5/migration/main/007_misc_cleanup.down.sql create mode 100644 riverdriver/riverpgxv5/migration/main/007_misc_cleanup.up.sql delete mode 100644 riverdriver/riversqlite/internal/dbsqlc/river_client.sql delete mode 100644 riverdriver/riversqlite/internal/dbsqlc/river_client_queue.sql create mode 100644 riverdriver/riversqlite/migration/main/007_misc_cleanup.down.sql create mode 100644 riverdriver/riversqlite/migration/main/007_misc_cleanup.up.sql diff --git a/riverdriver/river_driver_interface.go b/riverdriver/river_driver_interface.go index aed92b7e..b93c2f7a 100644 --- a/riverdriver/river_driver_interface.go +++ b/riverdriver/river_driver_interface.go @@ -872,8 +872,10 @@ func MigrationLineMainTruncateTables(version int) []string { return []string{"river_job", "river_leader"} case 4: return []string{"river_job", "river_leader", "river_queue"} + case 5, 6: + return []string{"river_job", "river_leader", "river_queue", "river_client", "river_client_queue"} } - // 0 (zero value), 5, 6 - return []string{"river_job", "river_leader", "river_queue", "river_client", "river_client_queue"} + // 0 (zero value), 7 + return []string{"river_job", "river_leader", "river_queue"} } diff --git a/riverdriver/riverdatabasesql/internal/dbsqlc/models.go b/riverdriver/riverdatabasesql/internal/dbsqlc/models.go index b89cbae4..e1c0f0f2 100644 --- a/riverdriver/riverdatabasesql/internal/dbsqlc/models.go +++ b/riverdriver/riverdatabasesql/internal/dbsqlc/models.go @@ -58,25 +58,6 @@ func (ns NullRiverJobState) Value() (driver.Value, error) { return string(ns.RiverJobState), nil } -type RiverClient struct { - ID string - CreatedAt time.Time - Metadata string - PausedAt *time.Time - UpdatedAt time.Time -} - -type RiverClientQueue struct { - RiverClientID string - Name string - CreatedAt time.Time - MaxWorkers int64 - Metadata string - NumJobsCompleted int64 - NumJobsRunning int64 - UpdatedAt time.Time -} - type RiverJob struct { ID int64 Args string diff --git a/riverdriver/riverdatabasesql/internal/dbsqlc/river_client.sql.go b/riverdriver/riverdatabasesql/internal/dbsqlc/river_client.sql.go deleted file mode 100644 index daa907d8..00000000 --- a/riverdriver/riverdatabasesql/internal/dbsqlc/river_client.sql.go +++ /dev/null @@ -1,53 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. -// versions: -// sqlc v1.29.0 -// source: river_client.sql - -package dbsqlc - -import ( - "context" - "time" -) - -const clientCreateOrSetUpdatedAt = `-- name: ClientCreateOrSetUpdatedAt :one -INSERT INTO /* TEMPLATE: schema */river_client ( - id, - metadata, - paused_at, - updated_at -) VALUES ( - $1, - coalesce($2::jsonb, '{}'::jsonb), - coalesce($3::timestamptz, NULL), - coalesce($4::timestamptz, now()) -) ON CONFLICT (name) DO UPDATE -SET - updated_at = coalesce($4::timestamptz, now()) -RETURNING id, created_at, metadata, paused_at, updated_at -` - -type ClientCreateOrSetUpdatedAtParams struct { - ID string - Metadata string - PausedAt *time.Time - UpdatedAt *time.Time -} - -func (q *Queries) ClientCreateOrSetUpdatedAt(ctx context.Context, db DBTX, arg *ClientCreateOrSetUpdatedAtParams) (*RiverClient, error) { - row := db.QueryRowContext(ctx, clientCreateOrSetUpdatedAt, - arg.ID, - arg.Metadata, - arg.PausedAt, - arg.UpdatedAt, - ) - var i RiverClient - err := row.Scan( - &i.ID, - &i.CreatedAt, - &i.Metadata, - &i.PausedAt, - &i.UpdatedAt, - ) - return &i, err -} diff --git a/riverdriver/riverdatabasesql/internal/dbsqlc/river_client_queue.sql.go b/riverdriver/riverdatabasesql/internal/dbsqlc/river_client_queue.sql.go deleted file mode 100644 index 24924a3c..00000000 --- a/riverdriver/riverdatabasesql/internal/dbsqlc/river_client_queue.sql.go +++ /dev/null @@ -1,62 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. -// versions: -// sqlc v1.29.0 -// source: river_client_queue.sql - -package dbsqlc - -import ( - "context" - "time" - - "github.com/lib/pq" -) - -const clientQueueCreateOrSetUpdatedAtMany = `-- name: ClientQueueCreateOrSetUpdatedAtMany :one -INSERT INTO /* TEMPLATE: schema */river_client_queue ( - metadata, - name, - paused_at, - river_client_id, - updated_at -) VALUES ( - coalesce($1::jsonb, '{}'), - unnest($2::text[]), - coalesce($3::timestamptz, NULL), - $4, - coalesce($5::timestamptz, now()) -) ON CONFLICT (name) DO UPDATE -SET - updated_at = coalesce($5::timestamptz, now()) -RETURNING river_client_id, name, created_at, max_workers, metadata, num_jobs_completed, num_jobs_running, updated_at -` - -type ClientQueueCreateOrSetUpdatedAtManyParams struct { - Metadata string - Name []string - PausedAt *time.Time - RiverClientID string - UpdatedAt *time.Time -} - -func (q *Queries) ClientQueueCreateOrSetUpdatedAtMany(ctx context.Context, db DBTX, arg *ClientQueueCreateOrSetUpdatedAtManyParams) (*RiverClientQueue, error) { - row := db.QueryRowContext(ctx, clientQueueCreateOrSetUpdatedAtMany, - arg.Metadata, - pq.Array(arg.Name), - arg.PausedAt, - arg.RiverClientID, - arg.UpdatedAt, - ) - var i RiverClientQueue - err := row.Scan( - &i.RiverClientID, - &i.Name, - &i.CreatedAt, - &i.MaxWorkers, - &i.Metadata, - &i.NumJobsCompleted, - &i.NumJobsRunning, - &i.UpdatedAt, - ) - return &i, err -} diff --git a/riverdriver/riverdatabasesql/internal/dbsqlc/sqlc.yaml b/riverdriver/riverdatabasesql/internal/dbsqlc/sqlc.yaml index 77805117..b6ef567d 100644 --- a/riverdriver/riverdatabasesql/internal/dbsqlc/sqlc.yaml +++ b/riverdriver/riverdatabasesql/internal/dbsqlc/sqlc.yaml @@ -3,8 +3,6 @@ sql: - engine: "postgresql" queries: - ../../../riverpgxv5/internal/dbsqlc/pg_misc.sql - - ../../../riverpgxv5/internal/dbsqlc/river_client.sql - - ../../../riverpgxv5/internal/dbsqlc/river_client_queue.sql - ../../../riverpgxv5/internal/dbsqlc/river_job.sql - ../../../riverpgxv5/internal/dbsqlc/river_leader.sql - ../../../riverpgxv5/internal/dbsqlc/river_migration.sql @@ -12,8 +10,6 @@ sql: - ../../../riverpgxv5/internal/dbsqlc/schema.sql schema: - ../../../riverpgxv5/internal/dbsqlc/pg_misc.sql - - ../../../riverpgxv5/internal/dbsqlc/river_client.sql - - ../../../riverpgxv5/internal/dbsqlc/river_client_queue.sql - ../../../riverpgxv5/internal/dbsqlc/river_job.sql - ../../../riverpgxv5/internal/dbsqlc/river_leader.sql - ../../../riverpgxv5/internal/dbsqlc/river_migration.sql diff --git a/riverdriver/riverdatabasesql/migration/main/007_misc_cleanup.down.sql b/riverdriver/riverdatabasesql/migration/main/007_misc_cleanup.down.sql new file mode 100644 index 00000000..2e30b394 --- /dev/null +++ b/riverdriver/riverdatabasesql/migration/main/007_misc_cleanup.down.sql @@ -0,0 +1,41 @@ +-- +-- Add back unused tables `river_client` and `river_client_queue`. +-- + +CREATE UNLOGGED TABLE /* TEMPLATE: schema */river_client ( + id text PRIMARY KEY NOT NULL, + created_at timestamptz NOT NULL DEFAULT now(), + metadata jsonb NOT NULL DEFAULT '{}', + paused_at timestamptz, + updated_at timestamptz NOT NULL, + CONSTRAINT name_length CHECK (char_length(id) > 0 AND char_length(id) < 128) +); + +CREATE UNLOGGED TABLE /* TEMPLATE: schema */river_client_queue ( + river_client_id text NOT NULL REFERENCES /* TEMPLATE: schema */river_client (id) ON DELETE CASCADE, + name text NOT NULL, + created_at timestamptz NOT NULL DEFAULT now(), + max_workers bigint NOT NULL DEFAULT 0, + metadata jsonb NOT NULL DEFAULT '{}', + num_jobs_completed bigint NOT NULL DEFAULT 0, + num_jobs_running bigint NOT NULL DEFAULT 0, + updated_at timestamptz NOT NULL, + PRIMARY KEY (river_client_id, name), + CONSTRAINT name_length CHECK (char_length(name) > 0 AND char_length(name) < 128), + CONSTRAINT num_jobs_completed_zero_or_positive CHECK (num_jobs_completed >= 0), + CONSTRAINT num_jobs_running_zero_or_positive CHECK (num_jobs_running >= 0) +); + +-- +-- Revert addition of `DEFAULT 25` to `river_job.max_attempts`. +-- + +ALTER TABLE /* TEMPLATE: schema */river_job + ALTER COLUMN max_attempts DROP DEFAULT; + +-- +-- Changes `river_queue.updated_at` to revert the default of `CURRENT_TIMESTAMP`. +-- + +ALTER TABLE /* TEMPLATE: schema */river_queue + ALTER COLUMN updated_at DROP DEFAULT; \ No newline at end of file diff --git a/riverdriver/riverdatabasesql/migration/main/007_misc_cleanup.up.sql b/riverdriver/riverdatabasesql/migration/main/007_misc_cleanup.up.sql new file mode 100644 index 00000000..2df449a5 --- /dev/null +++ b/riverdriver/riverdatabasesql/migration/main/007_misc_cleanup.up.sql @@ -0,0 +1,20 @@ +-- +-- Drop unused tables `river_client` and `river_client_queue`. +-- + +DROP TABLE /* TEMPLATE: schema */river_client_queue; +DROP TABLE /* TEMPLATE: schema */river_client; + +-- +-- Adds `DEFAULT 25` to `river_job.max_attempts`. +-- + +ALTER TABLE /* TEMPLATE: schema */river_job + ALTER COLUMN max_attempts SET DEFAULT 25; + +-- +-- Changes `river_queue.updated_at` to have a default of `CURRENT_TIMESTAMP`. +-- + +ALTER TABLE /* TEMPLATE: schema */river_queue + ALTER COLUMN updated_at SET DEFAULT CURRENT_TIMESTAMP; \ No newline at end of file diff --git a/riverdriver/riverdrivertest/riverdrivertest.go b/riverdriver/riverdrivertest/riverdrivertest.go index 27aade13..68dd4e3f 100644 --- a/riverdriver/riverdrivertest/riverdrivertest.go +++ b/riverdriver/riverdrivertest/riverdrivertest.go @@ -108,7 +108,9 @@ func Exercise[TTx any](ctx context.Context, t *testing.T, driver.GetMigrationTruncateTables(riverdriver.MigrationLineMain, 5)) require.Equal(t, []string{"river_job", "river_leader", "river_queue", "river_client", "river_client_queue"}, driver.GetMigrationTruncateTables(riverdriver.MigrationLineMain, 6)) - require.Equal(t, []string{"river_job", "river_leader", "river_queue", "river_client", "river_client_queue"}, + require.Equal(t, []string{"river_job", "river_leader", "river_queue"}, + driver.GetMigrationTruncateTables(riverdriver.MigrationLineMain, 7)) + require.Equal(t, []string{"river_job", "river_leader", "river_queue"}, driver.GetMigrationTruncateTables(riverdriver.MigrationLineMain, 0)) }) }) diff --git a/riverdriver/riverpgxv5/internal/dbsqlc/models.go b/riverdriver/riverpgxv5/internal/dbsqlc/models.go index 66588b13..1cf8ea62 100644 --- a/riverdriver/riverpgxv5/internal/dbsqlc/models.go +++ b/riverdriver/riverpgxv5/internal/dbsqlc/models.go @@ -60,25 +60,6 @@ func (ns NullRiverJobState) Value() (driver.Value, error) { return string(ns.RiverJobState), nil } -type RiverClient struct { - ID string - CreatedAt time.Time - Metadata []byte - PausedAt *time.Time - UpdatedAt time.Time -} - -type RiverClientQueue struct { - RiverClientID string - Name string - CreatedAt time.Time - MaxWorkers int64 - Metadata []byte - NumJobsCompleted int64 - NumJobsRunning int64 - UpdatedAt time.Time -} - type RiverJob struct { ID int64 Args []byte diff --git a/riverdriver/riverpgxv5/internal/dbsqlc/river_client.sql b/riverdriver/riverpgxv5/internal/dbsqlc/river_client.sql deleted file mode 100644 index 7c9b151f..00000000 --- a/riverdriver/riverpgxv5/internal/dbsqlc/river_client.sql +++ /dev/null @@ -1,8 +0,0 @@ -CREATE UNLOGGED TABLE river_client ( - id text PRIMARY KEY NOT NULL, - created_at timestamptz NOT NULL DEFAULT CURRENT_TIMESTAMP, - metadata jsonb NOT NULL DEFAULT '{}' ::jsonb, - paused_at timestamptz, - updated_at timestamptz NOT NULL, - CONSTRAINT name_length CHECK (char_length(id) > 0 AND char_length(id) < 128) -); \ No newline at end of file diff --git a/riverdriver/riverpgxv5/internal/dbsqlc/river_client.sql.go b/riverdriver/riverpgxv5/internal/dbsqlc/river_client.sql.go deleted file mode 100644 index f6130976..00000000 --- a/riverdriver/riverpgxv5/internal/dbsqlc/river_client.sql.go +++ /dev/null @@ -1,53 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. -// versions: -// sqlc v1.29.0 -// source: river_client.sql - -package dbsqlc - -import ( - "context" - "time" -) - -const clientCreateOrSetUpdatedAt = `-- name: ClientCreateOrSetUpdatedAt :one -INSERT INTO /* TEMPLATE: schema */river_client ( - id, - metadata, - paused_at, - updated_at -) VALUES ( - $1, - coalesce($2::jsonb, '{}'::jsonb), - coalesce($3::timestamptz, NULL), - coalesce($4::timestamptz, now()) -) ON CONFLICT (name) DO UPDATE -SET - updated_at = coalesce($4::timestamptz, now()) -RETURNING id, created_at, metadata, paused_at, updated_at -` - -type ClientCreateOrSetUpdatedAtParams struct { - ID string - Metadata []byte - PausedAt *time.Time - UpdatedAt *time.Time -} - -func (q *Queries) ClientCreateOrSetUpdatedAt(ctx context.Context, db DBTX, arg *ClientCreateOrSetUpdatedAtParams) (*RiverClient, error) { - row := db.QueryRow(ctx, clientCreateOrSetUpdatedAt, - arg.ID, - arg.Metadata, - arg.PausedAt, - arg.UpdatedAt, - ) - var i RiverClient - err := row.Scan( - &i.ID, - &i.CreatedAt, - &i.Metadata, - &i.PausedAt, - &i.UpdatedAt, - ) - return &i, err -} diff --git a/riverdriver/riverpgxv5/internal/dbsqlc/river_client_queue.sql b/riverdriver/riverpgxv5/internal/dbsqlc/river_client_queue.sql deleted file mode 100644 index 720101b9..00000000 --- a/riverdriver/riverpgxv5/internal/dbsqlc/river_client_queue.sql +++ /dev/null @@ -1,14 +0,0 @@ -CREATE UNLOGGED TABLE river_client_queue ( - river_client_id text NOT NULL REFERENCES river_client (id) ON DELETE CASCADE, - name text NOT NULL, - created_at timestamptz NOT NULL DEFAULT now(), - max_workers bigint NOT NULL DEFAULT 0, - metadata jsonb NOT NULL DEFAULT '{}', - num_jobs_completed bigint NOT NULL DEFAULT 0, - num_jobs_running bigint NOT NULL DEFAULT 0, - updated_at timestamptz NOT NULL, - PRIMARY KEY (river_client_id, name), - CONSTRAINT name_length CHECK (char_length(name) > 0 AND char_length(name) < 128), - CONSTRAINT num_jobs_completed_zero_or_positive CHECK (num_jobs_completed >= 0), - CONSTRAINT num_jobs_running_zero_or_positive CHECK (num_jobs_running >= 0) -); \ No newline at end of file diff --git a/riverdriver/riverpgxv5/internal/dbsqlc/river_client_queue.sql.go b/riverdriver/riverpgxv5/internal/dbsqlc/river_client_queue.sql.go deleted file mode 100644 index 86ec793f..00000000 --- a/riverdriver/riverpgxv5/internal/dbsqlc/river_client_queue.sql.go +++ /dev/null @@ -1,60 +0,0 @@ -// Code generated by sqlc. DO NOT EDIT. -// versions: -// sqlc v1.29.0 -// source: river_client_queue.sql - -package dbsqlc - -import ( - "context" - "time" -) - -const clientQueueCreateOrSetUpdatedAtMany = `-- name: ClientQueueCreateOrSetUpdatedAtMany :one -INSERT INTO /* TEMPLATE: schema */river_client_queue ( - metadata, - name, - paused_at, - river_client_id, - updated_at -) VALUES ( - coalesce($1::jsonb, '{}'), - unnest($2::text[]), - coalesce($3::timestamptz, NULL), - $4, - coalesce($5::timestamptz, now()) -) ON CONFLICT (name) DO UPDATE -SET - updated_at = coalesce($5::timestamptz, now()) -RETURNING river_client_id, name, created_at, max_workers, metadata, num_jobs_completed, num_jobs_running, updated_at -` - -type ClientQueueCreateOrSetUpdatedAtManyParams struct { - Metadata []byte - Name []string - PausedAt *time.Time - RiverClientID string - UpdatedAt *time.Time -} - -func (q *Queries) ClientQueueCreateOrSetUpdatedAtMany(ctx context.Context, db DBTX, arg *ClientQueueCreateOrSetUpdatedAtManyParams) (*RiverClientQueue, error) { - row := db.QueryRow(ctx, clientQueueCreateOrSetUpdatedAtMany, - arg.Metadata, - arg.Name, - arg.PausedAt, - arg.RiverClientID, - arg.UpdatedAt, - ) - var i RiverClientQueue - err := row.Scan( - &i.RiverClientID, - &i.Name, - &i.CreatedAt, - &i.MaxWorkers, - &i.Metadata, - &i.NumJobsCompleted, - &i.NumJobsRunning, - &i.UpdatedAt, - ) - return &i, err -} diff --git a/riverdriver/riverpgxv5/internal/dbsqlc/river_job.sql b/riverdriver/riverpgxv5/internal/dbsqlc/river_job.sql index 95a2493e..0ea00274 100644 --- a/riverdriver/riverpgxv5/internal/dbsqlc/river_job.sql +++ b/riverdriver/riverpgxv5/internal/dbsqlc/river_job.sql @@ -19,7 +19,7 @@ CREATE TABLE river_job ( errors jsonb[], finalized_at timestamptz, kind text NOT NULL, - max_attempts smallint NOT NULL, + max_attempts smallint NOT NULL DEFAULT 25, metadata jsonb NOT NULL DEFAULT '{}', priority smallint NOT NULL DEFAULT 1, queue text NOT NULL DEFAULT 'default', diff --git a/riverdriver/riverpgxv5/internal/dbsqlc/river_queue.sql b/riverdriver/riverpgxv5/internal/dbsqlc/river_queue.sql index 6a114720..abc45ed4 100644 --- a/riverdriver/riverpgxv5/internal/dbsqlc/river_queue.sql +++ b/riverdriver/riverpgxv5/internal/dbsqlc/river_queue.sql @@ -3,7 +3,7 @@ CREATE TABLE river_queue ( created_at timestamptz NOT NULL DEFAULT now(), metadata jsonb NOT NULL DEFAULT '{}' ::jsonb, paused_at timestamptz, - updated_at timestamptz NOT NULL + updated_at timestamptz NOT NULL DEFAULT CURRENT_TIMESTAMP ); -- name: QueueCreateOrSetUpdatedAt :one diff --git a/riverdriver/riverpgxv5/internal/dbsqlc/sqlc.yaml b/riverdriver/riverpgxv5/internal/dbsqlc/sqlc.yaml index a818dcfa..d4f579b1 100644 --- a/riverdriver/riverpgxv5/internal/dbsqlc/sqlc.yaml +++ b/riverdriver/riverpgxv5/internal/dbsqlc/sqlc.yaml @@ -3,8 +3,6 @@ sql: - engine: "postgresql" queries: - pg_misc.sql - - river_client.sql - - river_client_queue.sql - river_job.sql - river_job_copyfrom.sql - river_leader.sql @@ -13,8 +11,6 @@ sql: - schema.sql schema: - pg_misc.sql - - river_client.sql - - river_client_queue.sql - river_job.sql - river_leader.sql - river_migration.sql diff --git a/riverdriver/riverpgxv5/migration/main/007_misc_cleanup.down.sql b/riverdriver/riverpgxv5/migration/main/007_misc_cleanup.down.sql new file mode 100644 index 00000000..2e30b394 --- /dev/null +++ b/riverdriver/riverpgxv5/migration/main/007_misc_cleanup.down.sql @@ -0,0 +1,41 @@ +-- +-- Add back unused tables `river_client` and `river_client_queue`. +-- + +CREATE UNLOGGED TABLE /* TEMPLATE: schema */river_client ( + id text PRIMARY KEY NOT NULL, + created_at timestamptz NOT NULL DEFAULT now(), + metadata jsonb NOT NULL DEFAULT '{}', + paused_at timestamptz, + updated_at timestamptz NOT NULL, + CONSTRAINT name_length CHECK (char_length(id) > 0 AND char_length(id) < 128) +); + +CREATE UNLOGGED TABLE /* TEMPLATE: schema */river_client_queue ( + river_client_id text NOT NULL REFERENCES /* TEMPLATE: schema */river_client (id) ON DELETE CASCADE, + name text NOT NULL, + created_at timestamptz NOT NULL DEFAULT now(), + max_workers bigint NOT NULL DEFAULT 0, + metadata jsonb NOT NULL DEFAULT '{}', + num_jobs_completed bigint NOT NULL DEFAULT 0, + num_jobs_running bigint NOT NULL DEFAULT 0, + updated_at timestamptz NOT NULL, + PRIMARY KEY (river_client_id, name), + CONSTRAINT name_length CHECK (char_length(name) > 0 AND char_length(name) < 128), + CONSTRAINT num_jobs_completed_zero_or_positive CHECK (num_jobs_completed >= 0), + CONSTRAINT num_jobs_running_zero_or_positive CHECK (num_jobs_running >= 0) +); + +-- +-- Revert addition of `DEFAULT 25` to `river_job.max_attempts`. +-- + +ALTER TABLE /* TEMPLATE: schema */river_job + ALTER COLUMN max_attempts DROP DEFAULT; + +-- +-- Changes `river_queue.updated_at` to revert the default of `CURRENT_TIMESTAMP`. +-- + +ALTER TABLE /* TEMPLATE: schema */river_queue + ALTER COLUMN updated_at DROP DEFAULT; \ No newline at end of file diff --git a/riverdriver/riverpgxv5/migration/main/007_misc_cleanup.up.sql b/riverdriver/riverpgxv5/migration/main/007_misc_cleanup.up.sql new file mode 100644 index 00000000..2df449a5 --- /dev/null +++ b/riverdriver/riverpgxv5/migration/main/007_misc_cleanup.up.sql @@ -0,0 +1,20 @@ +-- +-- Drop unused tables `river_client` and `river_client_queue`. +-- + +DROP TABLE /* TEMPLATE: schema */river_client_queue; +DROP TABLE /* TEMPLATE: schema */river_client; + +-- +-- Adds `DEFAULT 25` to `river_job.max_attempts`. +-- + +ALTER TABLE /* TEMPLATE: schema */river_job + ALTER COLUMN max_attempts SET DEFAULT 25; + +-- +-- Changes `river_queue.updated_at` to have a default of `CURRENT_TIMESTAMP`. +-- + +ALTER TABLE /* TEMPLATE: schema */river_queue + ALTER COLUMN updated_at SET DEFAULT CURRENT_TIMESTAMP; \ No newline at end of file diff --git a/riverdriver/riversqlite/internal/dbsqlc/models.go b/riverdriver/riversqlite/internal/dbsqlc/models.go index 5890b263..3d49c0a3 100644 --- a/riverdriver/riversqlite/internal/dbsqlc/models.go +++ b/riverdriver/riversqlite/internal/dbsqlc/models.go @@ -8,25 +8,6 @@ import ( "time" ) -type RiverClient struct { - ID string - CreatedAt time.Time - Metadata []byte - PausedAt *time.Time - UpdatedAt time.Time -} - -type RiverClientQueue struct { - RiverClientID string - Name string - CreatedAt time.Time - MaxWorkers int64 - Metadata []byte - NumJobsCompleted int64 - NumJobsRunning int64 - UpdatedAt time.Time -} - type RiverJob struct { ID int64 Args []byte diff --git a/riverdriver/riversqlite/internal/dbsqlc/river_client.sql b/riverdriver/riversqlite/internal/dbsqlc/river_client.sql deleted file mode 100644 index e09cce0c..00000000 --- a/riverdriver/riversqlite/internal/dbsqlc/river_client.sql +++ /dev/null @@ -1,8 +0,0 @@ -CREATE TABLE river_client ( - id text PRIMARY KEY NOT NULL, - created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - metadata blob NOT NULL DEFAULT (json('{}')), - paused_at timestamp, - updated_at timestamp NOT NULL, - CONSTRAINT name_length CHECK (length(id) > 0 AND length(id) < 128) -); \ No newline at end of file diff --git a/riverdriver/riversqlite/internal/dbsqlc/river_client_queue.sql b/riverdriver/riversqlite/internal/dbsqlc/river_client_queue.sql deleted file mode 100644 index 55b9a51a..00000000 --- a/riverdriver/riversqlite/internal/dbsqlc/river_client_queue.sql +++ /dev/null @@ -1,14 +0,0 @@ -CREATE TABLE river_client_queue ( - river_client_id text NOT NULL REFERENCES river_client (id) ON DELETE CASCADE, - name text NOT NULL, - created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, - max_workers integer NOT NULL DEFAULT 0, - metadata blob NOT NULL DEFAULT (json('{}')), - num_jobs_completed integer NOT NULL DEFAULT 0, - num_jobs_running integer NOT NULL DEFAULT 0, - updated_at timestamp NOT NULL, - PRIMARY KEY (river_client_id, name), - CONSTRAINT name_length CHECK (length(name) > 0 AND length(name) < 128), - CONSTRAINT num_jobs_completed_zero_or_positive CHECK (num_jobs_completed >= 0), - CONSTRAINT num_jobs_running_zero_or_positive CHECK (num_jobs_running >= 0) -); \ No newline at end of file diff --git a/riverdriver/riversqlite/internal/dbsqlc/river_job.sql b/riverdriver/riversqlite/internal/dbsqlc/river_job.sql index dfb72dc3..82b8623c 100644 --- a/riverdriver/riversqlite/internal/dbsqlc/river_job.sql +++ b/riverdriver/riversqlite/internal/dbsqlc/river_job.sql @@ -8,7 +8,7 @@ CREATE TABLE river_job ( errors blob, -- JSON array of error objects finalized_at timestamp, kind text NOT NULL, - max_attempts integer NOT NULL, + max_attempts integer NOT NULL DEFAULT 25, metadata blob NOT NULL DEFAULT (json('{}')), priority integer NOT NULL DEFAULT 1, queue text NOT NULL DEFAULT 'default', diff --git a/riverdriver/riversqlite/internal/dbsqlc/river_queue.sql b/riverdriver/riversqlite/internal/dbsqlc/river_queue.sql index 1aa7c5fe..8192d8b7 100644 --- a/riverdriver/riversqlite/internal/dbsqlc/river_queue.sql +++ b/riverdriver/riversqlite/internal/dbsqlc/river_queue.sql @@ -3,7 +3,7 @@ CREATE TABLE river_queue ( created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, metadata blob NOT NULL DEFAULT (json('{}')), paused_at timestamp, - updated_at timestamp NOT NULL + updated_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ); -- name: QueueCreateOrSetUpdatedAt :one diff --git a/riverdriver/riversqlite/internal/dbsqlc/sqlc.yaml b/riverdriver/riversqlite/internal/dbsqlc/sqlc.yaml index dd86a267..89678fe3 100644 --- a/riverdriver/riversqlite/internal/dbsqlc/sqlc.yaml +++ b/riverdriver/riversqlite/internal/dbsqlc/sqlc.yaml @@ -2,16 +2,12 @@ version: "2" sql: - engine: "sqlite" queries: - - river_client.sql - - river_client_queue.sql - river_job.sql - river_leader.sql - river_migration.sql - river_queue.sql - schema.sql schema: - - river_client.sql - - river_client_queue.sql - river_job.sql - river_leader.sql - river_migration.sql diff --git a/riverdriver/riversqlite/migration/main/007_misc_cleanup.down.sql b/riverdriver/riversqlite/migration/main/007_misc_cleanup.down.sql new file mode 100644 index 00000000..1682f26a --- /dev/null +++ b/riverdriver/riversqlite/migration/main/007_misc_cleanup.down.sql @@ -0,0 +1,59 @@ +-- +-- Add back unused tables `river_client` and `river_client_queue`. +-- + +CREATE TABLE /* TEMPLATE: schema */river_client ( + id text PRIMARY KEY NOT NULL, + created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + metadata blob NOT NULL DEFAULT (json('{}')), + paused_at timestamp, + updated_at timestamp NOT NULL, + CONSTRAINT name_length CHECK (length(id) > 0 AND length(id) < 128) +); + +CREATE TABLE /* TEMPLATE: schema */river_client_queue ( + river_client_id text NOT NULL REFERENCES river_client (id) ON DELETE CASCADE, + name text NOT NULL, + created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + max_workers integer NOT NULL DEFAULT 0, + metadata blob NOT NULL DEFAULT (json('{}')), + num_jobs_completed integer NOT NULL DEFAULT 0, + num_jobs_running integer NOT NULL DEFAULT 0, + updated_at timestamp NOT NULL, + PRIMARY KEY (river_client_id, name), + CONSTRAINT name_length CHECK (length(name) > 0 AND length(name) < 128), + CONSTRAINT num_jobs_completed_zero_or_positive CHECK (num_jobs_completed >= 0), + CONSTRAINT num_jobs_running_zero_or_positive CHECK (num_jobs_running >= 0) +); + +-- +-- Revert addition of `DEFAULT 25` to `river_job.max_attempts`. +-- + +ALTER TABLE /* TEMPLATE: schema */river_job + RENAME COLUMN max_attempts TO max_attempts_old; + +ALTER TABLE /* TEMPLATE: schema */river_job + ADD COLUMN max_attempts integer NOT NULL; + +UPDATE /* TEMPLATE: schema */river_job +SET max_attempts = max_attempts_old; + +ALTER TABLE /* TEMPLATE: schema */river_job + DROP COLUMN max_attempts_old; + +-- +-- Changes `river_queue.updated_at` to revert the default of `CURRENT_TIMESTAMP`. +-- + +ALTER TABLE /* TEMPLATE: schema */river_queue + RENAME COLUMN updated_at TO updated_at_old; + +ALTER TABLE /* TEMPLATE: schema */river_queue + ADD COLUMN updated_at timestamp NOT NULL; + +UPDATE /* TEMPLATE: schema */river_queue +SET updated_at = updated_at_old; + +ALTER TABLE /* TEMPLATE: schema */river_queue + DROP COLUMN updated_at_old; \ No newline at end of file diff --git a/riverdriver/riversqlite/migration/main/007_misc_cleanup.up.sql b/riverdriver/riversqlite/migration/main/007_misc_cleanup.up.sql new file mode 100644 index 00000000..10d85a5b --- /dev/null +++ b/riverdriver/riversqlite/migration/main/007_misc_cleanup.up.sql @@ -0,0 +1,41 @@ +-- +-- Drop unused tables `river_client` and `river_client_queue`. +-- + +DROP TABLE /* TEMPLATE: schema */river_client_queue; +DROP TABLE /* TEMPLATE: schema */river_client; + +-- +-- Adds `DEFAULT 25` to `river_job.max_attempts`. +-- + +-- This may look odd in that we're adding a brand new column, but it's because +-- SQLite doesn't support anything beyond the most trivial DDL. + +ALTER TABLE /* TEMPLATE: schema */river_job + RENAME COLUMN max_attempts TO max_attempts_old; + +ALTER TABLE /* TEMPLATE: schema */river_job + ADD COLUMN max_attempts integer NOT NULL DEFAULT 25; + +UPDATE /* TEMPLATE: schema */river_job +SET max_attempts = max_attempts_old; + +ALTER TABLE /* TEMPLATE: schema */river_job + DROP COLUMN max_attempts_old; + +-- +-- Changes `river_queue.updated_at` to have a default of `CURRENT_TIMESTAMP`. +-- + +ALTER TABLE /* TEMPLATE: schema */river_queue + RENAME COLUMN updated_at TO updated_at_old; + +ALTER TABLE /* TEMPLATE: schema */river_queue + ADD COLUMN updated_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP; + +UPDATE /* TEMPLATE: schema */river_queue +SET updated_at = updated_at_old; + +ALTER TABLE /* TEMPLATE: schema */river_queue + DROP COLUMN updated_at_old; \ No newline at end of file