Search Apps Documentation Source Content File Folder Download Copy Actions Download

migration_research_migration.gno

2.48 Kb · 96 lines
 1package user
 2
 3import (
 4	"gno.land/p/g1nqnrt3aldzhu6zzeg75yw97wvavqy7wr77g56q/deploy-test/v0/v0/accesscontrol"
 5	oldadmin "gno.land/r/g1nqnrt3aldzhu6zzeg75yw97wvavqy7wr77g56q/deploy-test/v0/v0/admin"
 6	olduser "gno.land/r/g1nqnrt3aldzhu6zzeg75yw97wvavqy7wr77g56q/deploy-test/v0/v0/user"
 7)
 8
 9var (
10	migrationInitialized  bool
11	migrationFinalized    bool
12	migrationOffset       int
13	migrationTotal        int
14	migrationLastAddress  string
15	migrationLastNickname string
16)
17
18// MigrationInit is the first next-package call made by the research driver.
19func MigrationInit(cur realm) {
20	accesscontrol.AssertIsAdmin(0, cur, oldadmin.IsAdmin)
21	if migrationInitialized {
22		panic("migration already initialized")
23	}
24
25	initializeMigration(cur)
26}
27
28// MigrationNext advances the migration after MigrationInit until finalization.
29func MigrationNext(cur realm) {
30	accesscontrol.AssertIsAdmin(0, cur, oldadmin.IsAdmin)
31	if !migrationInitialized {
32		panic("migration not initialized")
33	}
34	if migrationFinalized {
35		panic("migration already finalized")
36	}
37
38	assertMigrationCursor()
39
40	migrationOffset = migrationTotal
41	migrationFinalized = true
42}
43
44// IsMigrationInitialized reports whether MigrationInit has run.
45func IsMigrationInitialized() bool {
46	return migrationInitialized
47}
48
49// IsMigrationFinalized reports whether migration batches are complete.
50func IsMigrationFinalized() bool {
51	return migrationFinalized
52}
53
54// GetMigrationOffset reports the number of source records accounted for by migration.
55func GetMigrationOffset() int {
56	return migrationOffset
57}
58
59// GetMigrationTotal reports the source record total captured during MigrationInit.
60func GetMigrationTotal() int {
61	return migrationTotal
62}
63
64// GetMigrationLastNickname reports the cursor nickname used by batch migration.
65func GetMigrationLastNickname() string {
66	return migrationLastNickname
67}
68
69func initializeMigration(cur realm) {
70	if migrationInitialized {
71		return
72	}
73
74	config := olduser.GetMigrationConfig()
75	listLimit = config.ListLimit
76	userStore = olduser.GetMigrationUserStore(cross(cur))
77	migrationTotal = config.TotalUsers
78	migrationOffset = 0
79
80	migrationInitialized = true
81}
82
83func assertMigrationCursor() {
84	if migrationOffset == 0 {
85		return
86	}
87	if migrationLastAddress == "" || migrationLastNickname == "" {
88		panic("invalid migration cursor")
89	}
90	if GetNickname(address(migrationLastAddress)) != migrationLastNickname {
91		panic("migration cursor mismatch")
92	}
93	if GetAddressByNickname(migrationLastNickname).String() != migrationLastAddress {
94		panic("migration cursor mismatch")
95	}
96}