forked from OpenBazaar/openbazaar-go
/
Migration007.go
151 lines (139 loc) · 5.07 KB
/
Migration007.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
package migrations
import (
"database/sql"
"fmt"
"io/ioutil"
"os"
"path"
"strings"
"time"
)
const (
Migration007_casesCreateSQL = "create table cases (caseID text primary key not null, buyerContract blob, vendorContract blob, buyerValidationErrors blob, vendorValidationErrors blob, buyerPayoutAddress text, vendorPayoutAddress text, buyerOutpoints blob, vendorOutpoints blob, state integer, read integer, timestamp integer, buyerOpened integer, claim text, disputeResolution blob);"
Migration007_purchasesCreateSQL = "create table purchases (orderID text primary key not null, contract blob, state integer, read integer, timestamp integer, total integer, thumbnail text, vendorID text, vendorHandle text, title text, shippingName text, shippingAddress text, paymentAddr text, funded integer, transactions blob);"
Migration007_salesCreateSQL = "create table sales (orderID text primary key not null, contract blob, state integer, read integer, timestamp integer, total integer, thumbnail text, buyerID text, buyerHandle text, title text, shippingName text, shippingAddress text, paymentAddr text, funded integer, transactions blob, needsSync integer);"
)
type Migration007 struct{}
func (Migration007) Up(repoPath, databasePassword string, testnetEnabled bool) error {
var (
databaseFilePath string
executedAt = time.Now()
repoVersionFilePath = path.Join(repoPath, "repover")
)
if testnetEnabled {
databaseFilePath = path.Join(repoPath, "datastore", "testnet.db")
} else {
databaseFilePath = path.Join(repoPath, "datastore", "mainnet.db")
}
// Add lastNotifiedAt column
db, err := sql.Open("sqlite3", databaseFilePath)
if err != nil {
return err
}
defer db.Close()
if databasePassword != "" {
p := fmt.Sprintf("pragma key = '%s';", databasePassword)
_, err := db.Exec(p)
if err != nil {
return err
}
}
_, err = db.Exec("alter table cases add column lastNotifiedAt integer not null default 0")
if err != nil {
return err
}
_, err = db.Exec("alter table purchases add column lastNotifiedAt integer not null default 0")
if err != nil {
return err
}
_, err = db.Exec("alter table sales add column lastNotifiedAt integer not null default 0")
if err != nil {
return err
}
_, err = db.Exec("update cases set lastNotifiedAt = ?", executedAt.Unix())
if err != nil {
return err
}
_, err = db.Exec("update purchases set lastNotifiedAt = ?", executedAt.Unix())
if err != nil {
return err
}
_, err = db.Exec("update sales set lastNotifiedAt = ?", executedAt.Unix())
if err != nil {
return err
}
// Bump schema version
err = ioutil.WriteFile(repoVersionFilePath, []byte("8"), os.ModePerm)
if err != nil {
return err
}
return nil
}
func (Migration007) Down(repoPath, databasePassword string, testnetEnabled bool) error {
var (
databaseFilePath string
repoVersionFilePath = path.Join(repoPath, "repover")
)
if testnetEnabled {
databaseFilePath = path.Join(repoPath, "datastore", "testnet.db")
} else {
databaseFilePath = path.Join(repoPath, "datastore", "mainnet.db")
}
db, err := sql.Open("sqlite3", databaseFilePath)
if err != nil {
return err
}
defer db.Close()
if databasePassword != "" {
p := fmt.Sprintf("pragma key = '%s';", databasePassword)
_, err := db.Exec(p)
if err != nil {
return err
}
}
const (
alterCasesSQL = "alter table cases rename to cases_old;"
alterPurchasesSQL = "alter table purchases rename to purchases_old;"
alterSalesSQL = "alter table sales rename to sales_old;"
insertCasesSQL = "insert into cases select caseID, buyerContract, vendorContract, buyerValidationErrors, vendorValidationErrors, buyerPayoutAddress, vendorPayoutAddress, buyerOutpoints, vendorOutpoints, state, read, timestamp, buyerOpened, claim, disputeResolution from cases_old;"
insertPurchasesSQL = "insert into purchases select orderID, contract, state, read, timestamp, total, thumbnail, vendorID, vendorHandle, title, shippingName, shippingAddress, paymentAddr, funded, transactions from purchases_old;"
insertSalesSQL = "insert into sales select orderID, contract, state, read, timestamp, total, thumbnail, buyerID, buyerHandle, title, shippingName, shippingAddress, paymentAddr, funded, transactions, needsSync from sales_old;"
dropCasesTableSQL = "drop table cases_old;"
dropPurchasesTableSQL = "drop table purchases_old;"
dropSalesTableSQL = "drop table sales_old;"
)
dropColumnOperation := strings.Join([]string{
alterCasesSQL,
Migration007_casesCreateSQL,
insertCasesSQL,
dropCasesTableSQL,
alterPurchasesSQL,
Migration007_purchasesCreateSQL,
insertPurchasesSQL,
dropPurchasesTableSQL,
alterSalesSQL,
Migration007_salesCreateSQL,
insertSalesSQL,
dropSalesTableSQL,
}, " ")
tx, err := db.Begin()
if err != nil {
return err
}
if _, err = tx.Exec(dropColumnOperation); err != nil {
err0 := tx.Rollback()
if err0 != nil {
log.Error(err0)
}
return err
}
if err = tx.Commit(); err != nil {
return err
}
// Revert schema version
err = ioutil.WriteFile(repoVersionFilePath, []byte("7"), os.ModePerm)
if err != nil {
return err
}
return nil
}