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}