@@ -65,12 +65,16 @@ func (s *Session) DeleteSession() error {
65
65
return nil
66
66
}
67
67
68
- type ChangesetIter struct {
68
+ type Changeset struct {
69
+ cs []byte
70
+ }
71
+
72
+ type ChangesetIterator struct {
69
73
iter * C.sqlite3_changeset_iter
70
74
}
71
75
72
76
// Changeset generates a changeset from a session object.
73
- func (s * Session ) Changeset () ([] byte , error ) {
77
+ func (s * Session ) Changeset () (* Changeset , error ) {
74
78
var nChangeset C.int
75
79
var pChangeset unsafe.Pointer
76
80
@@ -81,13 +85,13 @@ func (s *Session) Changeset() ([]byte, error) {
81
85
}
82
86
defer C .sqlite3_free (pChangeset ) // Free the changeset buffer after use
83
87
84
- // Convert the C buffer to a Go byte slice
88
+ // copy the changeset buffer to a Go byte slice, because cgo can nuke its memory at any time
85
89
changeset := C .GoBytes (pChangeset , nChangeset )
86
- return changeset , nil
90
+ return & Changeset { cs : changeset } , nil
87
91
}
88
92
89
93
// ChangesetStart creates and initializes a changeset iterator.
90
- func ChangesetStart (changeset []byte ) (* ChangesetIter , error ) {
94
+ func ChangesetStart (changeset []byte ) (* ChangesetIterator , error ) {
91
95
var iter * C.sqlite3_changeset_iter
92
96
93
97
// Call sqlite3changeset_start
@@ -96,11 +100,15 @@ func ChangesetStart(changeset []byte) (*ChangesetIter, error) {
96
100
return nil , fmt .Errorf ("sqlite3changeset_start: %s" , C .GoString (C .sqlite3_errstr (rc )))
97
101
}
98
102
99
- return & ChangesetIter {iter : iter }, nil
103
+ return & ChangesetIterator {iter : iter }, nil
104
+ }
105
+
106
+ func (cs * Changeset ) Start () (* ChangesetIterator , error ) {
107
+ return ChangesetStart (cs .cs )
100
108
}
101
109
102
110
// ChangesetNext moves the changeset iterator to the next change.
103
- func (ci * ChangesetIter ) ChangesetNext () (bool , error ) {
111
+ func (ci * ChangesetIterator ) ChangesetNext () (bool , error ) {
104
112
rc := C .sqlite3changeset_next (ci .iter )
105
113
if rc == C .SQLITE_DONE {
106
114
return false , nil // No more changes
@@ -112,7 +120,7 @@ func (ci *ChangesetIter) ChangesetNext() (bool, error) {
112
120
}
113
121
114
122
// ChangesetOp returns the type of change (INSERT, UPDATE, or DELETE) that the iterator points to.
115
- func (ci * ChangesetIter ) ChangesetOp () (string , int , int , bool , error ) {
123
+ func (ci * ChangesetIterator ) ChangesetOp () (string , int , int , bool , error ) {
116
124
var tableName * C.char
117
125
var nCol C.int
118
126
var op C.int
@@ -127,7 +135,7 @@ func (ci *ChangesetIter) ChangesetOp() (string, int, int, bool, error) {
127
135
}
128
136
129
137
// ChangesetOld retrieves the old value for the specified column in the change payload.
130
- func (ci * ChangesetIter ) ChangesetOld (column int ) (* C.sqlite3_value , error ) {
138
+ func (ci * ChangesetIterator ) ChangesetOld (column int ) (* C.sqlite3_value , error ) {
131
139
var value * C.sqlite3_value
132
140
133
141
rc := C .sqlite3changeset_old (ci .iter , C .int (column ), & value )
@@ -139,7 +147,7 @@ func (ci *ChangesetIter) ChangesetOld(column int) (*C.sqlite3_value, error) {
139
147
}
140
148
141
149
// ChangesetNew retrieves the new value for the specified column in the change payload.
142
- func (ci * ChangesetIter ) ChangesetNew (column int ) (* C.sqlite3_value , error ) {
150
+ func (ci * ChangesetIterator ) ChangesetNew (column int ) (* C.sqlite3_value , error ) {
143
151
var value * C.sqlite3_value
144
152
145
153
rc := C .sqlite3changeset_new (ci .iter , C .int (column ), & value )
@@ -151,7 +159,7 @@ func (ci *ChangesetIter) ChangesetNew(column int) (*C.sqlite3_value, error) {
151
159
}
152
160
153
161
// ChangesetFinalize deletes a changeset iterator.
154
- func (ci * ChangesetIter ) ChangesetFinalize () error {
162
+ func (ci * ChangesetIterator ) ChangesetFinalize () error {
155
163
if ci .iter != nil {
156
164
rc := C .sqlite3changeset_finalize (ci .iter )
157
165
ci .iter = nil // Prevent double finalization
0 commit comments