/
operate_args.go
99 lines (89 loc) · 2.3 KB
/
operate_args.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
// Copyright 2014-2021 Aerospike, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package aerospike
type operateArgs struct {
writePolicy *WritePolicy
operations []*Operation
partition *Partition
readAttr int
writeAttr int
hasWrite bool
}
func newOperateArgs(
cluster *Cluster,
policy *WritePolicy,
key *Key,
operations []*Operation,
) (res operateArgs, err Error) {
res = operateArgs{
operations: operations,
writePolicy: policy,
}
rattr := 0
wattr := 0
write := false
readBin := false
readHeader := false
respondAllOps := policy.RespondPerEachOp
for _, operation := range operations {
switch operation.opType {
case _BIT_READ, _EXP_READ, _HLL_READ, _MAP_READ:
// Map operations require respondAllOps to be true.
respondAllOps = true
// Fall through to read.
fallthrough
case _CDT_READ, _READ:
if operation.headerOnly {
rattr |= _INFO1_READ
readHeader = true
} else {
rattr |= _INFO1_READ
// Read all bins if no bin is specified.
if len(operation.binName) == 0 {
rattr |= _INFO1_GET_ALL
}
readBin = true
}
case _BIT_MODIFY, _EXP_MODIFY, _HLL_MODIFY, _MAP_MODIFY:
// Map operations require respondAllOps to be true.
respondAllOps = true
// Fall through to write.
fallthrough
default:
wattr = _INFO2_WRITE
write = true
}
}
res.hasWrite = write
if readHeader && !readBin {
rattr |= _INFO1_NOBINDATA
}
res.readAttr = rattr
if respondAllOps {
wattr |= _INFO2_RESPOND_ALL_OPS
}
res.writeAttr = wattr
if write {
res.partition, err = PartitionForWrite(cluster, &res.writePolicy.BasePolicy, key)
if err != nil {
return operateArgs{}, err
}
} else {
res.partition, err = PartitionForRead(cluster, &res.writePolicy.BasePolicy, key)
if err != nil {
return operateArgs{}, err
}
}
return res, nil
}