9
9
"reflect"
10
10
"runtime"
11
11
"strings"
12
- "time"
13
12
14
13
"github.com/ParsePlatform/flashback"
15
14
"github.com/google/gopacket/pcap"
@@ -26,35 +25,23 @@ var (
26
25
debug = flag .Bool ("debug" , false , "Print debug-level output" )
27
26
)
28
27
29
- type Operation struct {
30
- Ns string `bson:"ns"`
31
- Timestamp time.Time `bson:"ts"`
32
- NToSkip int32 `bson:"ntoskip,omitempty"`
33
- NToReturn int32 `bson:"ntoreturn,omitempty"`
34
- InsertDoc bson.D `bson:"o,omitempty"`
35
- QueryDoc bson.D `bson:"query,omitempty"`
36
- UpdateDoc bson.D `bson:"updateobj,omitempty"`
37
- CommandDoc bson.D `bson:"command,omitempty"`
38
- Type flashback.OpType `bson:"op"`
39
- }
40
-
41
28
func ParseQuery (opQuery []byte ) (bson.D , error ) {
42
29
var query bson.D
43
30
err := bson .Unmarshal (opQuery , & query )
44
31
return query , err
45
32
}
46
33
47
- func (op * Operation ) HandleCommand ( opCommand * mongoproto.OpQuery , f * os.File ) error {
34
+ func HandleCommand (op * flashback. Op , opCommand * mongoproto.OpQuery , f * os.File ) error {
48
35
var err error
49
36
op .Type = flashback .Command
50
37
op .CommandDoc , err = ParseQuery (opCommand .Query )
51
38
if err != nil {
52
39
return err
53
40
}
54
- return op . Write (f )
41
+ return Write (op , f )
55
42
}
56
43
57
- func (op * Operation ) HandleQuery ( opQuery * mongoproto.OpQuery , f * os.File ) error {
44
+ func HandleQuery (op * flashback. Op , opQuery * mongoproto.OpQuery , f * os.File ) error {
58
45
var err error
59
46
op .Ns = opQuery .FullCollectionName
60
47
op .Type = flashback .Query
@@ -63,32 +50,32 @@ func (op *Operation) HandleQuery(opQuery *mongoproto.OpQuery, f *os.File) error
63
50
collection , exists := flashback .GetElem (op .QueryDoc , "insert" )
64
51
if exists == true {
65
52
opQuery .FullCollectionName = strings .Replace (opQuery .FullCollectionName , "$cmd" , collection .(string ), 1 )
66
- return op . HandleInsertFromQuery (opQuery , f )
53
+ return HandleInsertFromQuery (op , opQuery , f )
67
54
}
68
- return op . HandleCommand (opQuery , f )
55
+ return HandleCommand (op , opQuery , f )
69
56
}
70
57
op .QueryDoc , err = ParseQuery (opQuery .Query )
71
58
if err != nil {
72
59
return err
73
60
}
74
- return op . Write (f )
61
+ return Write (op , f )
75
62
}
76
63
77
- func (op * Operation ) HandleInsertDocument ( document bson.D , f * os.File ) error {
64
+ func HandleInsertDocument (op * flashback. Op , document bson.D , f * os.File ) error {
78
65
op .Type = flashback .Insert
79
66
op .InsertDoc = document
80
- return op . Write (f )
67
+ return Write (op , f )
81
68
}
82
69
83
- func (op * Operation ) HandleInsert ( opInsert * mongoproto.OpInsert , f * os.File ) error {
70
+ func HandleInsert (op * flashback. Op , opInsert * mongoproto.OpInsert , f * os.File ) error {
84
71
op .Ns = opInsert .FullCollectionName
85
72
if opInsert .Documents != nil {
86
73
for _ , document := range opInsert .Documents {
87
74
insert , err := ParseQuery (document )
88
75
if err != nil {
89
76
return err
90
77
}
91
- err = op . HandleInsertDocument (insert , f )
78
+ err = HandleInsertDocument (op , insert , f )
92
79
if err != nil {
93
80
return err
94
81
}
@@ -97,7 +84,7 @@ func (op *Operation) HandleInsert(opInsert *mongoproto.OpInsert, f *os.File) err
97
84
return nil
98
85
}
99
86
100
- func (op * Operation ) HandleInsertFromQuery ( opQuery * mongoproto.OpQuery , f * os.File ) error {
87
+ func HandleInsertFromQuery (op * flashback. Op , opQuery * mongoproto.OpQuery , f * os.File ) error {
101
88
op .Ns = opQuery .FullCollectionName
102
89
query , err := ParseQuery (opQuery .Query )
103
90
if err != nil {
@@ -107,13 +94,13 @@ func (op *Operation) HandleInsertFromQuery(opQuery *mongoproto.OpQuery, f *os.Fi
107
94
if exists == true {
108
95
if (reflect .TypeOf (documents ).Kind () == reflect .Slice ) {
109
96
for _ , document := range documents .([]interface {}) {
110
- err = op . HandleInsertDocument (document .(bson.D ), f )
97
+ err = HandleInsertDocument (op , document .(bson.D ), f )
111
98
if err != nil {
112
99
return err
113
100
}
114
101
}
115
102
} else {
116
- err = op . HandleInsertDocument (documents .(bson.D ), f )
103
+ err = HandleInsertDocument (op , documents .(bson.D ), f )
117
104
if err != nil {
118
105
return err
119
106
}
@@ -122,18 +109,18 @@ func (op *Operation) HandleInsertFromQuery(opQuery *mongoproto.OpQuery, f *os.Fi
122
109
return nil
123
110
}
124
111
125
- func (op * Operation ) HandleDelete ( opDelete * mongoproto.OpDelete , f * os.File ) error {
112
+ func HandleDelete (op * flashback. Op , opDelete * mongoproto.OpDelete , f * os.File ) error {
126
113
var err error
127
114
op .Type = flashback .Remove
128
115
op .Ns = opDelete .FullCollectionName
129
116
op .QueryDoc , err = ParseQuery (opDelete .Selector )
130
117
if err != nil {
131
118
return err
132
119
}
133
- return op . Write (f )
120
+ return Write (op , f )
134
121
}
135
122
136
- func (op * Operation ) Write ( f * os.File ) error {
123
+ func Write (op * flashback. Op , f * os.File ) error {
137
124
opBson , err := bson .Marshal (op )
138
125
if err != nil {
139
126
return err
@@ -166,14 +153,14 @@ func main() {
166
153
defer f .Close ()
167
154
for op := range m .Ops {
168
155
var err error
169
- fbOp := & Operation {
156
+ fbOp := & flashback. Op {
170
157
Timestamp : op .Seen ,
171
158
}
172
159
// todo: fix mongoproto.OpUpdate and mongoproto.OpDelete so they can be added
173
160
if opInsert , ok := op .Op .(* mongoproto.OpInsert ); ok {
174
- err = fbOp . HandleInsert (opInsert , f )
161
+ err = HandleInsert (fbOp , opInsert , f )
175
162
} else if opQuery , ok := op .Op .(* mongoproto.OpQuery ); ok {
176
- err = fbOp . HandleQuery (opQuery , f )
163
+ err = HandleQuery (fbOp , opQuery , f )
177
164
} else if * debug == true {
178
165
if _ , ok := op .Op .(* mongoproto.OpUnknown ); ok {
179
166
fmt .Println ("Found mongoproto.OpUnknown operation: " , op )
0 commit comments