1 /*
2 Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
3
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License, version 2.0,
6 as published by the Free Software Foundation.
7
8 This program is also distributed with certain software (including
9 but not limited to OpenSSL) that is licensed under separate terms,
10 as designated in a particular file or component or in included license
11 documentation. The authors of MySQL hereby grant you an additional
12 permission to link the program and your derivative works with the
13 separately licensed software that they have included with MySQL.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License, version 2.0, for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
23 */
24
25
26 #include <NdbApi.hpp>
27
28 #include "adapter_global.h"
29 #include "js_wrapper_macros.h"
30 #include "Record.h"
31 #include "NativeMethodCall.h"
32 #include "NdbWrapperErrors.h"
33 #include "NdbJsConverters.h"
34
35 using namespace v8;
36
37 V8WrapperFn begin;
38 V8WrapperFn end;
39 V8WrapperFn istrue;
40 V8WrapperFn isfalse;
41 V8WrapperFn cmp;
42 V8WrapperFn isnull;
43 V8WrapperFn isnotnull;
44 V8WrapperFn getInterpretedCode;
45 V8WrapperFn getNdbOperation;
46
47 #define WRAPPER_FUNCTION(A) addMethod(#A, A)
48
49 class NdbScanFilterEnvelopeClass : public Envelope {
50 public:
NdbScanFilterEnvelopeClass()51 NdbScanFilterEnvelopeClass() : Envelope("NdbScanFilter") {
52 WRAPPER_FUNCTION( begin);
53 WRAPPER_FUNCTION( end);
54 WRAPPER_FUNCTION( istrue);
55 WRAPPER_FUNCTION( isfalse);
56 WRAPPER_FUNCTION( cmp);
57 WRAPPER_FUNCTION( isnull);
58 WRAPPER_FUNCTION( isnotnull);
59 WRAPPER_FUNCTION( getInterpretedCode);
60 WRAPPER_FUNCTION( getNdbOperation);
61 addMethod("getNdbError", getNdbError<NdbScanFilter>);
62 }
63 };
64
65 NdbScanFilterEnvelopeClass NdbScanFilterEnvelope;
66
newNdbScanFilter(const Arguments & args)67 void newNdbScanFilter(const Arguments & args) {
68 DEBUG_MARKER(UDEB_DETAIL);
69 EscapableHandleScope scope(args.GetIsolate());
70
71 PROHIBIT_CONSTRUCTOR_CALL();
72 REQUIRE_ARGS_LENGTH(1);
73
74 JsValueConverter<NdbInterpretedCode *> arg0(args[0]);
75
76 NdbScanFilter * f = new NdbScanFilter(arg0.toC());
77
78 Local<Value> jsObject = NdbScanFilterEnvelope.wrap(f);
79 NdbScanFilterEnvelope.freeFromGC(f, jsObject);
80 args.GetReturnValue().Set(scope.Escape(jsObject));
81 }
82
83
begin(const Arguments & args)84 void begin(const Arguments & args) {
85 DEBUG_MARKER(UDEB_DETAIL);
86 EscapableHandleScope scope(args.GetIsolate());
87 typedef NativeMethodCall_1_<int, NdbScanFilter, NdbScanFilter::Group> NCALL;
88 NCALL ncall(& NdbScanFilter::begin, args);
89 ncall.run();
90 args.GetReturnValue().Set(scope.Escape(ncall.jsReturnVal()));
91 }
92
end(const Arguments & args)93 void end(const Arguments & args) {
94 DEBUG_MARKER(UDEB_DETAIL);
95 EscapableHandleScope scope(args.GetIsolate());
96 typedef NativeMethodCall_0_<int, NdbScanFilter> NCALL;
97 NCALL ncall(& NdbScanFilter::end, args);
98 ncall.run();
99 args.GetReturnValue().Set(scope.Escape(ncall.jsReturnVal()));
100 }
101
istrue(const Arguments & args)102 void istrue(const Arguments & args) {
103 DEBUG_MARKER(UDEB_DETAIL);
104 EscapableHandleScope scope(args.GetIsolate());
105 typedef NativeMethodCall_0_<int, NdbScanFilter> NCALL;
106 NCALL ncall(& NdbScanFilter::istrue, args);
107 ncall.run();
108 args.GetReturnValue().Set(scope.Escape(ncall.jsReturnVal()));
109 }
110
isfalse(const Arguments & args)111 void isfalse(const Arguments & args) {
112 DEBUG_MARKER(UDEB_DETAIL);
113 EscapableHandleScope scope(args.GetIsolate());
114 typedef NativeMethodCall_0_<int, NdbScanFilter> NCALL;
115 NCALL ncall(& NdbScanFilter::isfalse, args);
116 ncall.run();
117 args.GetReturnValue().Set(scope.Escape(ncall.jsReturnVal()));
118 }
119
120
121 /* cmp()
122 ARG0: BinaryCondition
123 ARG1: Column ID
124 ARG2: Buffer
125 ARG3: Offset
126 ARG4: Length
127 */
cmp(const Arguments & args)128 void cmp(const Arguments &args) {
129 NdbScanFilter * filter = unwrapPointer<NdbScanFilter *>(args.Holder());
130 int condition = args[0]->Int32Value();
131 int columnId = args[1]->Uint32Value();
132 char * buffer = node::Buffer::Data(args[2]->ToObject());
133 uint32_t offset = args[3]->Uint32Value();
134 uint32_t length = args[4]->Uint32Value();
135
136 int rval = filter->cmp(NdbScanFilter::BinaryCondition(condition),
137 columnId, buffer + offset, length);
138
139 args.GetReturnValue().Set(rval);
140 }
141
142
isnull(const Arguments & args)143 void isnull(const Arguments & args) {
144 DEBUG_MARKER(UDEB_DETAIL);
145 EscapableHandleScope scope(args.GetIsolate());
146 typedef NativeMethodCall_1_<int, NdbScanFilter, int> NCALL;
147 NCALL ncall(& NdbScanFilter::isnull, args);
148 ncall.run();
149 args.GetReturnValue().Set(scope.Escape(ncall.jsReturnVal()));
150 }
151
isnotnull(const Arguments & args)152 void isnotnull(const Arguments & args) {
153 DEBUG_MARKER(UDEB_DETAIL);
154 EscapableHandleScope scope(args.GetIsolate());
155 typedef NativeMethodCall_1_<int, NdbScanFilter, int> NCALL;
156 NCALL ncall(& NdbScanFilter::isnotnull, args);
157 ncall.run();
158 args.GetReturnValue().Set(scope.Escape(ncall.jsReturnVal()));
159 }
160
getInterpretedCode(const Arguments & args)161 void getInterpretedCode(const Arguments & args) {
162 DEBUG_MARKER(UDEB_DETAIL);
163 EscapableHandleScope scope(args.GetIsolate());
164 typedef NativeConstMethodCall_0_<const NdbInterpretedCode *, NdbScanFilter> NCALL;
165 NCALL ncall(& NdbScanFilter::getInterpretedCode, args);
166 ncall.wrapReturnValueAs(getConstNdbInterpretedCodeEnvelope());
167 ncall.run();
168 args.GetReturnValue().Set(scope.Escape(ncall.jsReturnVal()));
169 }
170
getNdbOperation(const Arguments & args)171 void getNdbOperation(const Arguments & args) {
172 DEBUG_MARKER(UDEB_DETAIL);
173 EscapableHandleScope scope(args.GetIsolate());
174 typedef NativeConstMethodCall_0_<NdbOperation *, NdbScanFilter> NCALL;
175 NCALL ncall(& NdbScanFilter::getNdbOperation, args);
176 ncall.run();
177 args.GetReturnValue().Set(scope.Escape(ncall.jsReturnVal()));
178 }
179
180
181 #define WRAP_CONSTANT(X) DEFINE_JS_INT(sfObj, #X, NdbScanFilter::X)
182
NdbScanFilter_initOnLoad(Handle<Object> target)183 void NdbScanFilter_initOnLoad(Handle<Object> target) {
184 Local<String> sfKey = NEW_SYMBOL("NdbScanFilter");
185 Local<Object> sfObj = Object::New(v8::Isolate::GetCurrent());
186
187 target->Set(sfKey, sfObj);
188
189 DEFINE_JS_FUNCTION(sfObj, "create", newNdbScanFilter);
190 WRAP_CONSTANT(AND);
191 WRAP_CONSTANT(OR);
192 WRAP_CONSTANT(NAND);
193 WRAP_CONSTANT(NOR);
194 WRAP_CONSTANT(COND_LE);
195 WRAP_CONSTANT(COND_LT);
196 WRAP_CONSTANT(COND_GE);
197 WRAP_CONSTANT(COND_GT);
198 WRAP_CONSTANT(COND_EQ);
199 WRAP_CONSTANT(COND_NE);
200 WRAP_CONSTANT(COND_LIKE);
201 WRAP_CONSTANT(COND_NOT_LIKE);
202 WRAP_CONSTANT(COND_AND_EQ_MASK);
203 WRAP_CONSTANT(COND_AND_NE_MASK);
204 WRAP_CONSTANT(COND_AND_EQ_ZERO);
205 WRAP_CONSTANT(COND_AND_NE_ZERO);
206 WRAP_CONSTANT(FilterTooLarge);
207 }
208
209