oplog/cmd_oplog.go (54 lines of code) (raw):
package oplog
import (
"go.mongodb.org/mongo-driver/bson"
"strings"
)
type CommandOperation struct {
concernSyncData bool
runOnAdmin bool // some commands like `renameCollection` need run on admin database
needFilter bool // should be ignored in shake
}
var opsMap = map[string]*CommandOperation{
"create": {concernSyncData: false, runOnAdmin: false, needFilter: false},
"createIndexes": {concernSyncData: false, runOnAdmin: false, needFilter: false},
"collMod": {concernSyncData: false, runOnAdmin: false, needFilter: false},
"dropDatabase": {concernSyncData: false, runOnAdmin: false, needFilter: false},
"drop": {concernSyncData: false, runOnAdmin: false, needFilter: false},
"deleteIndex": {concernSyncData: false, runOnAdmin: false, needFilter: false},
"deleteIndexes": {concernSyncData: false, runOnAdmin: false, needFilter: false},
"dropIndex": {concernSyncData: false, runOnAdmin: false, needFilter: false},
"dropIndexes": {concernSyncData: false, runOnAdmin: false, needFilter: false},
"renameCollection": {concernSyncData: false, runOnAdmin: true, needFilter: false},
"convertToCapped": {concernSyncData: false, runOnAdmin: false, needFilter: false},
"emptycapped": {concernSyncData: false, runOnAdmin: false, needFilter: false},
"applyOps": {concernSyncData: true, runOnAdmin: false, needFilter: false},
"startIndexBuild": {concernSyncData: false, runOnAdmin: false, needFilter: true},
"commitIndexBuild": {concernSyncData: false, runOnAdmin: false, needFilter: false},
"abortIndexBuild": {concernSyncData: false, runOnAdmin: false, needFilter: true},
}
func ExtraCommandName(o bson.D) (string, bool) {
// command name must be at the first position
if len(o) > 0 {
if _, exist := opsMap[o[0].Key]; exist {
return o[0].Key, true
}
}
return "", false
}
func IsSyncDataCommand(operation string) bool {
if op, ok := opsMap[strings.TrimSpace(operation)]; ok {
return op.concernSyncData
}
return false
}
func IsRunOnAdminCommand(operation string) bool {
if op, ok := opsMap[strings.TrimSpace(operation)]; ok {
return op.runOnAdmin
}
return false
}
func IsNeedFilterCommand(operation string) bool {
if op, ok := opsMap[strings.TrimSpace(operation)]; ok {
return op.needFilter
}
return false
}