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