MySQL 5.6.14 Source Code Document
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
NdbApiSignal.cpp
1 /*
2  Copyright (c) 2003, 2010, 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 as published by
6  the Free Software Foundation; version 2 of the License.
7 
8  This program is distributed in the hope that it will be useful,
9  but WITHOUT ANY WARRANTY; without even the implied warranty of
10  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  GNU General Public License for more details.
12 
13  You should have received a copy of the GNU General Public License
14  along with this program; if not, write to the Free Software
15  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
16 */
17 
18 
19 #include "API.hpp"
20 #include "NdbApiSignal.hpp"
21 
28 #include <signaldata/TcKeyReq.hpp>
29 #include <signaldata/KeyInfo.hpp>
30 #include <signaldata/AttrInfo.hpp>
31 #include <signaldata/TestOrd.hpp>
32 #include <signaldata/CreateIndx.hpp>
33 #include <signaldata/DropIndx.hpp>
34 #include <signaldata/TcIndx.hpp>
35 #include <signaldata/IndxKeyInfo.hpp>
36 #include <signaldata/IndxAttrInfo.hpp>
37 #include <signaldata/TcHbRep.hpp>
38 #include <signaldata/ScanTab.hpp>
39 
40 #include <NdbOut.hpp>
41 
42 /******************************************************************************
43 NdbApiSignal();
44 
45 Return Value: None
46 Remark: Creates a NdbApiSignal object.
47 ******************************************************************************/
48 NdbApiSignal::NdbApiSignal(BlockReference ref)
49 {
50  theVerId_signalNumber = 0; // 4 bit ver id - 16 bit gsn
51  theReceiversBlockNumber = 0; // Only 16 bit blocknum
52  theSendersBlockRef = refToBlock(ref);
53  theLength = 0;
54  theSendersSignalId = 0;
55  theSignalId = 0;
56  theTrace = 0;
57  m_noOfSections = 0;
58  m_fragmentInfo = 0;
59  for (int i = 0; i < 25; i++)
60  theData[i] = 0x13579753;
61 
62  setDataPtr(&theData[0]);
63  theNextSignal = 0;
64 }
65 
66 NdbApiSignal::NdbApiSignal(Ndb* ndb)
67 {
68  BlockReference ref = ndb->theMyRef;
69  theVerId_signalNumber = 0; // 4 bit ver id - 16 bit gsn
70  theReceiversBlockNumber = 0; // Only 16 bit blocknum
71  theSendersBlockRef = refToBlock(ref);
72  theLength = 0;
73  theSendersSignalId = 0;
74  theSignalId = 0;
75  theTrace = 0;
76  m_noOfSections = 0;
77  m_fragmentInfo = 0;
78  for (int i = 0; i < 25; i++)
79  theData[i] = 0x13579753;
80 
81  setDataPtr(&theData[0]);
82  theNextSignal = 0;
83 }
84 
88 NdbApiSignal::NdbApiSignal(const NdbApiSignal &src) {
89  copyFrom(&src);
90 }
91 /******************************************************************************
92 ~NdbApiSignal();
93 
94 Return Value: None
95 Remark: Delete a NdbApiSignal object.
96 ******************************************************************************/
97 NdbApiSignal::~NdbApiSignal()
98 {
99 }
100 /******************************************************************************
101 int setSignal(NdbSignalType aNdbSignalType);
102 
103 Return Value: Return 0 : setSignal was successful.
104  Return tErrorCode In all other case.
105 Parameters: aNdbSignalType: Type of signal.
106 Remark: Set signal header and allocate 128 byte.
107 ******************************************************************************/
108 int
109 NdbApiSignal::setSignal(int aNdbSignalType, Uint32 receiversBlockNo)
110 {
111  theSendersSignalId = 0;
112  switch (aNdbSignalType)
113  {
114  case GSN_DIHNDBTAMPER:
115  {
116  theTrace = TestOrd::TraceAPI;
117  theReceiversBlockNumber = DBDIH;
118  theVerId_signalNumber = GSN_DIHNDBTAMPER;
119  theLength = 3;
120  }
121  break;
122 
123  case GSN_TCSEIZEREQ:
124  {
125  theTrace = TestOrd::TraceAPI;
126  theReceiversBlockNumber = DBTC;
127  theVerId_signalNumber = GSN_TCSEIZEREQ;
128  theLength = 3;
129  }
130  break;
131 
132  case GSN_TCKEYREQ:
133  {
134  assert(blockToMain(receiversBlockNo) == DBTC);
135  theTrace = TestOrd::TraceAPI;
136  theReceiversBlockNumber = receiversBlockNo;
137  theVerId_signalNumber = GSN_TCKEYREQ;
138  theLength = TcKeyReq::SignalLength;
139  }
140  break;
141 
142  case GSN_TCRELEASEREQ:
143  {
144  assert(blockToMain(receiversBlockNo) == DBTC);
145  theTrace = TestOrd::TraceAPI;
146  theReceiversBlockNumber = receiversBlockNo;
147  theVerId_signalNumber = GSN_TCRELEASEREQ;
148  theLength = 3;
149  }
150  break;
151 
152  case GSN_ATTRINFO:
153  {
154  assert(blockToMain(receiversBlockNo) == DBTC);
155  theTrace = TestOrd::TraceAPI;
156  theReceiversBlockNumber = receiversBlockNo;
157  theVerId_signalNumber = GSN_ATTRINFO;
158  theLength = AttrInfo::MaxSignalLength;
159  }
160  break;
161 
162  case GSN_KEYINFO:
163  {
164  assert(blockToMain(receiversBlockNo) == DBTC);
165  theTrace = TestOrd::TraceAPI;
166  theReceiversBlockNumber = receiversBlockNo;
167  theVerId_signalNumber = GSN_KEYINFO;
168  theLength = KeyInfo::MaxSignalLength;
169  }
170  break;
171 
172  case GSN_TCROLLBACKREQ:
173  {
174  assert(blockToMain(receiversBlockNo) == DBTC);
175  theTrace = TestOrd::TraceAPI;
176  theReceiversBlockNumber = receiversBlockNo;
177  theVerId_signalNumber = GSN_TCROLLBACKREQ;
178  theLength = 3;
179  }
180  break;
181 
182  case GSN_TC_HBREP:
183  {
184  assert(blockToMain(receiversBlockNo) == DBTC);
185  theTrace = TestOrd::TraceAPI;
186  theReceiversBlockNumber = receiversBlockNo;
187  theVerId_signalNumber = GSN_TC_HBREP;
188  theLength = TcHbRep::SignalLength;
189  }
190  break;
191 
192  case GSN_TC_COMMITREQ:
193  {
194  assert(blockToMain(receiversBlockNo) == DBTC);
195  theTrace = TestOrd::TraceAPI;
196  theReceiversBlockNumber = receiversBlockNo;
197  theVerId_signalNumber = GSN_TC_COMMITREQ;
198  theLength = 3;
199  }
200  break;
201 
202  case GSN_SCAN_TABREQ:
203  {
204  assert(blockToMain(receiversBlockNo) == DBTC);
205  theTrace = TestOrd::TraceAPI;
206  theReceiversBlockNumber = receiversBlockNo;
207  theVerId_signalNumber = GSN_SCAN_TABREQ;
208  theLength = ScanTabReq::StaticLength;
209  }
210  break;
211 
212  case GSN_SCAN_NEXTREQ:
213  {
214  assert(blockToMain(receiversBlockNo) == DBTC);
215  theTrace = TestOrd::TraceAPI;
216  theReceiversBlockNumber = receiversBlockNo;
217  theVerId_signalNumber = GSN_SCAN_NEXTREQ;
218  theLength = ScanNextReq::SignalLength;
219  }
220  break;
221 
222  case GSN_CREATE_INDX_REQ:
223  {
224  theTrace = TestOrd::TraceAPI;
225  theReceiversBlockNumber = DBDICT;
226  theVerId_signalNumber = GSN_CREATE_INDX_REQ;
227  theLength = CreateIndxReq::SignalLength;
228  }
229  break;
230 
231  case GSN_DROP_INDX_REQ:
232  {
233  theTrace = TestOrd::TraceAPI;
234  theReceiversBlockNumber = DBDICT;
235  theVerId_signalNumber = GSN_DROP_INDX_REQ;
236  theLength = DropIndxReq::SignalLength;
237  }
238  break;
239 
240  case GSN_TCINDXREQ:
241  {
242  assert(blockToMain(receiversBlockNo) == DBTC);
243  theTrace = TestOrd::TraceAPI;
244  theReceiversBlockNumber = receiversBlockNo;
245  theVerId_signalNumber = GSN_TCINDXREQ;
246  theLength = TcKeyReq::SignalLength;
247  }
248  break;
249 
250  case GSN_INDXKEYINFO:
251  {
252  assert(blockToMain(receiversBlockNo) == DBTC);
253  theTrace = TestOrd::TraceAPI;
254  theReceiversBlockNumber = receiversBlockNo;
255  theVerId_signalNumber = GSN_INDXKEYINFO;
256  theLength = IndxKeyInfo::MaxSignalLength;
257  }
258  break;
259 
260  case GSN_INDXATTRINFO:
261  {
262  assert(blockToMain(receiversBlockNo) == DBTC);
263  theTrace = TestOrd::TraceAPI;
264  theReceiversBlockNumber = receiversBlockNo;
265  theVerId_signalNumber = GSN_INDXATTRINFO;
266  theLength = IndxAttrInfo::MaxSignalLength;
267  }
268  break;
269 
270  default:
271  {
272  return -1;
273  }
274  }
275  return 0;
276 }
277 
278 void
279 NdbApiSignal::set(Uint8 trace,
280  Uint16 receiversBlockNumber,
281  Uint16 signalNumber,
282  Uint32 length){
283 
284  theTrace = trace;
285  theReceiversBlockNumber = receiversBlockNumber;
286  theVerId_signalNumber = signalNumber;
287  theLength = length;
288 }
289 
290 void
291 NdbApiSignal::copyFrom(const NdbApiSignal * src){
292  theSignalId = src->theSignalId;
293  theVerId_signalNumber = src->theVerId_signalNumber;
294  theReceiversBlockNumber = src->theReceiversBlockNumber;
295  theSendersBlockRef = src->theSendersBlockRef;
296  theLength = src->theLength;
297  theTrace = src->theTrace;
298  m_noOfSections = src->m_noOfSections;
299  m_fragmentInfo = src->m_fragmentInfo;
300 
301  Uint32 * dstData = getDataPtrSend();
302  const Uint32 * srcData = src->getDataPtr();
303  for (Uint32 i = 0; i < theLength; i++)
304  dstData[i] = srcData[i];
305 
306  setDataPtr(dstData);
307 }