-
Notifications
You must be signed in to change notification settings - Fork 4
/
clearsubkeys.go
142 lines (126 loc) · 3.52 KB
/
clearsubkeys.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
//
// k2hdkc_go
//
// Copyright 2018 Yahoo Japan Corporation.
//
// Go driver for k2hdkc that is a highly available and scalable distributed
// KVS clustering system. For k2hdkc, see
// https://github.com/yahoojapan/k2hdkc for the details.
//
// For the full copyright and license information, please view
// the license file that was distributed with this source code.
//
// AUTHOR: Hirotaka Wakabayashi
// CREATE: Fri, 14 Sep 2018
// REVISION:
//
package k2hdkc
import (
// #cgo CFLAGS: -g -O2 -Wall -Wextra -Wno-unused-variable -Wno-unused-parameter -I. -I/usr/include/k2hdkc
// #cgo LDFLAGS: -L/usr/lib -lk2hdkc
// #include <stdlib.h>
// #include "k2hdkc.h"
// #include "k2hmacro.h"
"C"
)
import (
"bytes"
"errors"
"fmt"
)
// ClearSubKeys holds arguments for C.k2hdkc_pm_set_subkeys and a pointer of ClearSubKeys.
type ClearSubKeys struct {
key []byte
result *ClearSubKeysResult
}
// String returns a text representation of the object.
func (r *ClearSubKeys) String() string {
return fmt.Sprintf("[%v, %v]", r.key, r.result)
}
// ClearSubKeysResult holds the result of ClearSubKeys.Execute().
type ClearSubKeysResult struct {
ok C._Bool
resCode C.dkcres_type_t // response
subResCode C.dkcres_type_t // response(details)
}
// String returns a text representation of the object.
func (r *ClearSubKeysResult) String() string {
return fmt.Sprintf("[%v, %v, %v]", r.ok, r.resCode, r.subResCode)
}
// NewClearSubKeys return a new ClearSubKeys.
func NewClearSubKeys(k interface{}) (*ClearSubKeys, error) {
var key []byte
switch k.(type) {
default:
return nil, fmt.Errorf("unsupported key data format %T", k)
case string:
if len(k.(string)) > 0 {
var buf bytes.Buffer
buf.WriteString(k.(string))
buf.WriteRune('\u0000')
key = buf.Bytes()
}
case []byte:
key = k.([]byte)
}
if key == nil || len(key) == 0 {
return nil, errors.New("len(key) is zero")
}
r := &ClearSubKeysResult{
ok: false, // default is false.
resCode: 0,
subResCode: 0,
}
c := &ClearSubKeys{
key: key,
result: r,
}
return c, nil
}
// Execute calls the C.k2hdkc_pm_set_subkeys function that clear the subkey to the k2hdkc cluster.
func (r *ClearSubKeys) Execute(s *Session) (bool, error) {
if r.key == nil || len(r.key) == 0 || r.result == nil {
return false, fmt.Errorf("some required members nil, r.key %v, r.result %v", r.key, r.result)
}
cKey := C.CBytes(r.key)
defer C.free(cKey)
r.result.ok = C.k2hdkc_pm_set_subkeys(
s.handler,
(*C.uchar)(cKey),
C.size_t(len(r.key)),
nil,
0)
r.result.resCode = C.k2hdkc_get_res_code(s.handler)
r.result.subResCode = C.k2hdkc_get_res_subcode(s.handler)
if r.result.ok == false {
return false, fmt.Errorf("C.k2hdkc_pm_set_subkeys returned %v", r.result.ok)
}
return true, nil
}
// Result returns the pointer of ClearSubKeysResult that has the result of Execute method.
func (r *ClearSubKeys) Result() *ClearSubKeysResult {
if r.result != nil {
return r.result
}
return nil
}
// Bool returns true if C.k2hdkc_pm_set_subkeys has been successfully called.
func (r *ClearSubKeysResult) Bool() bool {
if !r.ok {
return false
}
return true
}
// Error returns the errno of C.k2hdkc_pm_set_subkeys in string format.
func (r *ClearSubKeysResult) Error() string {
return fmt.Sprintf("%v %v",
C.GoString(C.str_dkcres_result_type(r.resCode)),
C.GoString(C.str_dkcres_subcode_type(r.subResCode)))
}
// Local Variables:
// c-basic-offset: 4
// tab-width: 4
// indent-tabs-mode: t
// End:
// vim600: noexpandtab sw=4 ts=4 fdm=marker
// vim<600: noexpandtab sw=4 ts=4