2
* Copyright (C) 2013 Drizzle Developer Group
3
* Copyright (C) 2013 Kuldeep Porwal
6
* Use and distribution licensed under the BSD license. See
7
* the COPYING file in the parent directory for full text.
9
* summary: Utility functions to parse event data
14
#include "libdrizzle/common.h"
21
#include<libdrizzle-5.1/helper.h>
25
uint32_t getByte4(int pos,const unsigned char* data)
27
if((int)(sizeof(data)-pos)<4)
31
uint32_t tmpMask = mask(32); // all 32 bits set to 1
33
tmpMask=((uint32_t)data[pos]&tmpMask);
34
tmpMask=((uint32_t)data[pos+1]<<8|tmpMask);
35
tmpMask=((uint32_t)data[pos+2]<<16|tmpMask);
36
tmpMask=((uint32_t)data[pos+3]<<24|tmpMask);
41
uint32_t getByte3(int pos,const unsigned char* data)
43
if((int)(sizeof(data)-pos)<3)
47
uint32_t tmpMask = mask(32); // all 32 bits set to 1
49
tmpMask=((uint32_t)data[pos]&tmpMask);
50
tmpMask=((uint32_t)data[pos+1]<<8|tmpMask);
51
tmpMask=((uint32_t)data[pos+2]<<16|tmpMask);
56
uint16_t getByte2(int pos,const unsigned char* data)
58
if((int)sizeof(data)-pos<2)
62
uint16_t tmpMask = mask(16); // all 16 bits set to 1
64
tmpMask=((uint16_t)data[pos]&tmpMask);
65
tmpMask=((uint16_t)data[pos+1]<<8|tmpMask);
71
uint64_t getByte6(int pos,const unsigned char* data)
73
if((int)sizeof(data)-pos<6)
77
uint64_t tmpMask = mask(64); // all 64 bits set to 1
79
tmpMask=((uint64_t)data[pos]&tmpMask);
80
tmpMask=((uint64_t)data[pos+1]<<8|tmpMask);
81
tmpMask=((uint64_t)data[pos+2]<<16|tmpMask);
82
tmpMask=((uint64_t)data[pos+3]<<24|tmpMask);
83
tmpMask=((uint64_t)data[pos+4]<<32|tmpMask);
84
tmpMask=((uint64_t)data[pos+5]<<40|tmpMask);
89
uint64_t getByte8(int pos,const unsigned char* data)
91
if((int)sizeof(data)-pos<8)
95
uint64_t tmpMask = mask(64); // all 64 bits set to 1
97
tmpMask=((uint64_t)data[pos]&tmpMask);
98
tmpMask=((uint64_t)data[pos+1]<<8|tmpMask);
99
tmpMask=((uint64_t)data[pos+2]<<16|tmpMask);
100
tmpMask=((uint64_t)data[pos+3]<<24|tmpMask);
101
tmpMask=((uint64_t)data[pos+4]<<32|tmpMask);
102
tmpMask=((uint64_t)data[pos+5]<<40|tmpMask);
103
tmpMask=((uint64_t)data[pos+5]<<48|tmpMask);
104
tmpMask=((uint64_t)data[pos+5]<<56|tmpMask);
109
char * getString(int pos,int len,const unsigned char * data)
111
if((int)sizeof(data)-pos<len)
115
char *tmp = (char *)malloc(sizeof(char)*(len));
117
for(i=pos;i<pos+len;i++)
125
std::string getIntToStr(uint64_t num)
127
std::stringstream ss;
129
std::string str=ss.str();
133
uint64_t getEncodedLen(int& pos, const unsigned char *data)
136
if((int)sizeof(data)-pos<1)
141
int colBytes = bytes_col_count((uint32_t)data[pos]);
142
if((int)sizeof(data)-pos-1<colBytes)
150
len= (uint64_t)data[pos];
154
len= (uint64_t)getByte2(pos+1,data);
157
len= (uint64_t)getByte3(pos+1,data);
160
len= (uint64_t)getByte8(pos+1,data);
165
pos+=colBytes+(colBytes>1)?1:0; // include first byte if colCount>1
170
bool getNextBit(uint8_t& val)
175
int getBoolArray(bool arr[],const unsigned char data[],int start_pos,int _byte,int _bit)
177
if((int)sizeof(data)-start_pos<_byte)
182
for(int i=0;i<_byte;i++)
186
uint8_t number= (uint8_t)data[start_pos+i];
187
arr[8*i] = (int)number&(int)1;
190
for(int val=1;val<8;val++)
192
if((8*i+val) >= _bit)
194
arr[8*i+val] = getNextBit(number);
199
return count; // count where bit in not set. (0)
202
int lookup_metadata_field_size(enum_field_types field_type)
206
case MYSQL_TYPE_DOUBLE:
207
case MYSQL_TYPE_FLOAT:
208
case MYSQL_TYPE_BLOB:
209
case MYSQL_TYPE_GEOMETRY:
212
case MYSQL_TYPE_VARCHAR:
213
case MYSQL_TYPE_NEWDECIMAL:
214
case MYSQL_TYPE_STRING:
215
case MYSQL_TYPE_VAR_STRING:
217
case MYSQL_TYPE_DECIMAL:
219
case MYSQL_TYPE_ENUM:
220
case MYSQL_TYPE_YEAR:
221
case MYSQL_TYPE_TINY:
222
case MYSQL_TYPE_SHORT:
223
case MYSQL_TYPE_INT24:
224
case MYSQL_TYPE_LONG:
225
case MYSQL_TYPE_LONGLONG:
226
case MYSQL_TYPE_NEWDATE:
227
case MYSQL_TYPE_DATE:
228
case MYSQL_TYPE_TIME:
229
case MYSQL_TYPE_TIMESTAMP:
230
case MYSQL_TYPE_DATETIME:
231
case MYSQL_TYPE_TINY_BLOB:
232
case MYSQL_TYPE_MEDIUM_BLOB:
233
case MYSQL_TYPE_LONG_BLOB:
234
case MYSQL_TYPE_NULL:
241
enum_field_bytes lookup_field_bytes(enum_field_types field_type)
245
case MYSQL_TYPE_DECIMAL:
246
case MYSQL_TYPE_TIMESTAMP:
247
case MYSQL_TYPE_DATE:
248
case MYSQL_TYPE_TIME:
249
case MYSQL_TYPE_DATETIME:
250
case MYSQL_TYPE_NEWDATE:
251
case MYSQL_TYPE_VARCHAR:
253
case MYSQL_TYPE_NEWDECIMAL:
254
case MYSQL_TYPE_TINY_BLOB:
255
case MYSQL_TYPE_MEDIUM_BLOB:
256
case MYSQL_TYPE_LONG_BLOB:
257
case MYSQL_TYPE_BLOB:
258
case MYSQL_TYPE_VAR_STRING:
259
case MYSQL_TYPE_STRING:
262
case MYSQL_TYPE_TINY:
265
case MYSQL_TYPE_SHORT:
266
case MYSQL_TYPE_YEAR:
269
case MYSQL_TYPE_LONG:
270
case MYSQL_TYPE_FLOAT:
271
case MYSQL_TYPE_INT24:
274
case MYSQL_TYPE_DOUBLE:
275
case MYSQL_TYPE_LONGLONG:
278
case MYSQL_TYPE_NULL:
279
case MYSQL_TYPE_ENUM:
281
case MYSQL_TYPE_GEOMETRY: