storj/storagenode/storagenodedb/testdata/multidbsnapshot.go
Jeff Wendling 4ad01e8170 storagenode/storagenodedb: backfill reputation.joined_at
it was being used in ways that implied it should be NOT NULL
even though it was possibly null. we used to get this data
from the satellite db's added_at column as seen in 30369b02,
so backfill it using that data where joined_at is NULL, and
then alter the table to constrain the column to be NOT NULL.

Fixes #3866.

Change-Id: If2d856189209740d985f71dada7b93525e625ef3
2020-05-01 17:59:53 +00:00

131 lines
2.6 KiB
Go

// Copyright (C) 2019 Storj Labs, Inc.
// See LICENSE for copying information.
package testdata
import (
"context"
"fmt"
"storj.io/storj/private/dbutil/dbschema"
"storj.io/storj/private/dbutil/sqliteutil"
)
// States is the global variable that stores all the states for testing
var States = MultiDBStates{
List: []*MultiDBState{
&v0,
&v1,
&v2,
&v3,
&v4,
&v5,
&v6,
&v7,
&v8,
&v9,
&v10,
&v11,
&v12,
&v13,
&v14,
&v15,
&v16,
&v17,
&v18,
&v19,
&v20,
&v21,
&v22,
&v23,
&v24,
&v25,
&v26,
&v27,
&v28,
&v29,
&v30,
&v31,
&v32,
&v33,
&v34,
&v35,
&v36,
&v37,
&v38,
},
}
// MultiDBStates provides a convenient list of MultiDBState
type MultiDBStates struct {
List []*MultiDBState
}
// FindVersion finds a MultiDBState with the specified version.
func (mdbs *MultiDBStates) FindVersion(version int) (*MultiDBState, bool) {
for _, state := range mdbs.List {
if state.Version == version {
return state, true
}
}
return nil, false
}
// MultiDBState represents an expected state across multiple DBs, defined in SQL
// commands.
type MultiDBState struct {
Version int
DBStates DBStates
}
// DBStates is a convenience type
type DBStates map[string]*DBState
// DBState allows you to define the desired state of the DB using SQl commands.
// Both the SQl and NewData fields contains SQL that will be executed to create
// the expected DB. The NewData SQL additionally will be executed on the testDB
// to ensure data is consistent.
type DBState struct {
SQL string
NewData string
}
// MultiDBSnapshot represents an expected state among multiple databases
type MultiDBSnapshot struct {
Version int
DBSnapshots DBSnapshots
}
// NewMultiDBSnapshot returns a new MultiDBSnapshot
func NewMultiDBSnapshot() *MultiDBSnapshot {
return &MultiDBSnapshot{
DBSnapshots: DBSnapshots{},
}
}
// DBSnapshots is a convenience type
type DBSnapshots map[string]*DBSnapshot
// DBSnapshot is a snapshot of a single DB.
type DBSnapshot struct {
Schema *dbschema.Schema
Data *dbschema.Data
}
// LoadMultiDBSnapshot converts a MultiDBState into a MultiDBSnapshot. It
// executes the SQL and stores the shema and data.
func LoadMultiDBSnapshot(ctx context.Context, multiDBState *MultiDBState) (*MultiDBSnapshot, error) {
multiDBSnapshot := NewMultiDBSnapshot()
for dbName, dbState := range multiDBState.DBStates {
snapshot, err := sqliteutil.LoadSnapshotFromSQL(ctx, fmt.Sprintf("%s\n%s", dbState.SQL, dbState.NewData))
if err != nil {
return nil, err
}
multiDBSnapshot.DBSnapshots[dbName] = &DBSnapshot{
Schema: snapshot.Schema,
Data: snapshot.Data,
}
}
return multiDBSnapshot, nil
}