1
0
mirror of https://github.com/MariaDB/server.git synced 2025-11-27 05:41:41 +03:00
Files
mariadb/ndb/src/common/util/Base64.cpp
unknown 3705bf9dfb wl2240 - ndb - new testcase for validating startTransation with hint
ndb/include/ndbapi/NdbDictionary.hpp:
  NdbDictionaryColumn::getSizeInBytes
ndb/include/ndbapi/NdbOperation.hpp:
  NdbOperation::getTable
ndb/include/ndbapi/NdbTransaction.hpp:
  Make getConnectionNodeId public (for test programs)
ndb/include/util/Base64.hpp:
  base64(void*)
ndb/src/common/util/Base64.cpp:
  base64(void*)
ndb/src/kernel/blocks/ERROR_codes.txt:
  New error code for REF'ing non-local TCKEYREQ
ndb/src/kernel/blocks/dbdih/DbdihMain.cpp:
  Easy clearing of ERROR_INSERT
ndb/src/kernel/blocks/dbtc/DbtcMain.cpp:
  New error code for REF'ing non-local TCKEYREQ
ndb/src/ndbapi/NdbDictionary.cpp:
  NdbDictionaryColumn::getSizeInBytes
ndb/src/ndbapi/NdbDictionaryImpl.cpp:
  If m_noIfDistKyes == 0, then each PK is dist key
ndb/src/ndbapi/NdbOperation.cpp:
  NdbOperation::getTable
ndb/src/ndbapi/NdbOperationSearch.cpp:
  remove d-key handling for pk ops
ndb/test/include/HugoCalculator.hpp:
  remove unimpletemented methods
ndb/test/include/HugoOperations.hpp:
  1) HugoOperation::setTransaction 
  2) Type independant value handling
  3) Some more util methods
ndb/test/ndbapi/testPartitioning.cpp:
  new testcase for validating startTransation with hint
ndb/test/run-test/atrt-mysql-test-run:
  fix checks of return values
ndb/test/src/HugoCalculator.cpp:
  Better generation of values
   -- depends on fact that srand(K), rand() == srand(K), rand()
  Generate string with base64
ndb/test/src/HugoOperations.cpp:
  1) HugoOperation::setTransaction 
  2) Type independant value handling
  3) Some more util methods
2005-01-14 08:58:50 +01:00

213 lines
4.4 KiB
C++

/* Copyright (C) 2003 MySQL AB
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#include <ndb_global.h>
#include <Base64.hpp>
static char base64_table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"0123456789+/";
int
base64_encode(const UtilBuffer &src, BaseString &dst)
{
return base64_encode(src.get_data(), src.length(), dst);
}
int
base64_encode(const void * _s, size_t src_len, BaseString &dst) {
const unsigned char * s = (const unsigned char*)_s;
size_t i = 0;
size_t len = 0;
while(i < src_len) {
if(len == 76){
len = 0;
dst.append('\n');
}
unsigned c;
c = s[i++];
c <<= 8;
if(i < src_len)
c += s[i];
c <<= 8;
i++;
if(i < src_len)
c += s[i];
i++;
dst.append(base64_table[(c >> 18) & 0x3f]);
dst.append(base64_table[(c >> 12) & 0x3f]);
if(i > (src_len + 1))
dst.append('=');
else
dst.append(base64_table[(c >> 6) & 0x3f]);
if(i > src_len)
dst.append('=');
else
dst.append(base64_table[(c >> 0) & 0x3f]);
len += 4;
}
return 0;
}
static inline unsigned
pos(unsigned char c) {
return strchr(base64_table, c) - base64_table;
}
int
base64_decode(const BaseString &src, UtilBuffer &dst) {
return base64_decode(src.c_str(), src.length(), dst);
}
#define SKIP_SPACE(src, i, size){ \
while(i < size && isspace(* src)){ \
i++; \
src++; \
} \
if(i == size){ \
i = size + 1; \
break; \
} \
}
int
base64_decode(const char * src, size_t size, UtilBuffer &dst) {
size_t i = 0;
while(i < size){
unsigned c = 0;
int mark = 0;
SKIP_SPACE(src, i, size);
c += pos(*src++);
c <<= 6;
i++;
SKIP_SPACE(src, i, size);
c += pos(*src++);
c <<= 6;
i++;
SKIP_SPACE(src, i, size);
if(* src != '=')
c += pos(*src++);
else {
i = size;
mark = 2;
c <<= 6;
goto end;
}
c <<= 6;
i++;
SKIP_SPACE(src, i, size);
if(*src != '=')
c += pos(*src++);
else {
i = size;
mark = 1;
goto end;
}
i++;
end:
char b[3];
b[0] = (c >> 16) & 0xff;
b[1] = (c >> 8) & 0xff;
b[2] = (c >> 0) & 0xff;
dst.append((void *)b, 3-mark);
}
if(i != size){
abort();
return -1;
}
return 0;
}
#ifdef __TEST__B64
/**
* USER_FLAGS="-D__TEST__B64" make Base64.o && g++ Base64.o BaseString.o
*/
inline
void
require(bool b){
if(!b)
abort();
}
int
main(void){
for(int i = 0; i < 500; i++){
const size_t len = rand() % 10000 + 1;
UtilBuffer src;
for(size_t j = 0; j<len; j++){
char c = rand();
src.append(&c, 1);
}
require(src.length() == len);
BaseString str;
require(base64_encode(src, str) == 0);
if(str.length() == 3850){
printf(">%s<\n", str.c_str());
}
UtilBuffer dst;
require(base64_decode(str, dst) == 0);
require(dst.length() == src.length());
const char * c_src = (char*)src.get_data();
const char * c_dst = (char*)dst.get_data();
if(memcmp(src.get_data(), dst.get_data(), src.length()) != 0){
printf("-- src --\n");
for(int i2 = 0; i2<len; i2++){
unsigned char c = c_src[i2];
printf("%.2x ", (unsigned)c);
if((i2 % 8) == 7)
printf("\n");
}
printf("\n");
printf("-- dst --\n");
for(int i2 = 0; i2<len; i2++){
unsigned char c = c_dst[i2];
printf("%.2x ", (unsigned)c);
if((i2 % 8) == 7)
printf("\n");
}
printf("\n");
abort();
}
}
return 0;
}
#endif