github.com/status-im/status-go@v1.1.0/protocol/sqlite/migrations.go (about)

     1  package sqlite
     2  
     3  import (
     4  	"strings"
     5  
     6  	"github.com/pkg/errors"
     7  
     8  	encryptmigrations "github.com/status-im/status-go/protocol/encryption/migrations"
     9  	appmigrations "github.com/status-im/status-go/protocol/migrations"
    10  	push_notification_client_migrations "github.com/status-im/status-go/protocol/pushnotificationclient/migrations"
    11  	push_notification_server_migrations "github.com/status-im/status-go/protocol/pushnotificationserver/migrations"
    12  	wakumigrations "github.com/status-im/status-go/protocol/transport/migrations"
    13  )
    14  
    15  type getter func(string) ([]byte, error)
    16  
    17  type migrationsWithGetter struct {
    18  	Names  []string
    19  	Getter getter
    20  }
    21  
    22  var defaultMigrations = []migrationsWithGetter{
    23  	{
    24  		Names:  wakumigrations.AssetNames(),
    25  		Getter: wakumigrations.Asset,
    26  	},
    27  	{
    28  		Names:  encryptmigrations.AssetNames(),
    29  		Getter: encryptmigrations.Asset,
    30  	},
    31  	{
    32  		Names:  appmigrations.AssetNames(),
    33  		Getter: appmigrations.Asset,
    34  	},
    35  	{
    36  		Names:  push_notification_server_migrations.AssetNames(),
    37  		Getter: push_notification_server_migrations.Asset,
    38  	},
    39  	{
    40  		Names:  push_notification_client_migrations.AssetNames(),
    41  		Getter: push_notification_client_migrations.Asset,
    42  	},
    43  }
    44  
    45  func prepareMigrations(migrations []migrationsWithGetter) ([]string, getter, error) {
    46  	var allNames []string
    47  	nameToGetter := make(map[string]getter)
    48  
    49  	for _, m := range migrations {
    50  		for _, name := range m.Names {
    51  			if !validateName(name) {
    52  				continue
    53  			}
    54  
    55  			if _, ok := nameToGetter[name]; ok {
    56  				return nil, nil, errors.Errorf("migration with name %s already exists", name)
    57  			}
    58  			allNames = append(allNames, name)
    59  			nameToGetter[name] = m.Getter
    60  		}
    61  	}
    62  
    63  	return allNames, func(name string) ([]byte, error) {
    64  		getter, ok := nameToGetter[name]
    65  		if !ok {
    66  			return nil, errors.Errorf("no migration for name %s", name)
    67  		}
    68  		return getter(name)
    69  	}, nil
    70  }
    71  
    72  // validateName verifies that only *.sql files are taken into consideration.
    73  func validateName(name string) bool {
    74  	return strings.HasSuffix(name, ".sql")
    75  }