Below is the list of changes that have just been committed into a local
5.0 repository of lthalmann. When lthalmann does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
ChangeSet
1.2022 05/10/14 01:14:23 lars@stripped +9 -0
WL#2835: Base64 mysys functions
mysys/base64.c
1.7 05/10/14 01:13:57 lars@stripped +168 -115
Making Base64 mysys-compatible
include/base64.h
1.5 05/10/14 01:13:57 lars@stripped +32 -9
Making Base64 mysys-style
ndb/src/mgmsrv/Services.cpp
1.52 05/10/14 01:13:56 lars@stripped +7 -5
Use of mysys Base64
ndb/src/mgmapi/mgmapi.cpp
1.54 05/10/14 01:13:55 lars@stripped +9 -5
Use of mysys Base64
ndb/src/common/util/Parser.cpp
1.8 05/10/14 01:13:55 lars@stripped +1 -6
Removed dead code
ndb/src/common/util/Makefile.am
1.11 05/10/14 01:13:55 lars@stripped +1 -1
Remove Base64
ndb/config/type_util.mk.am
1.4 05/10/14 01:13:55 lars@stripped +6 -1
NDB UTIL now dependent on mysys
ndb/config/type_ndbapi.mk.am
1.5 05/10/14 01:13:55 lars@stripped +3 -1
NDBAPI now dependent on mysys
mysys/Makefile.am
1.67 05/10/14 01:13:55 lars@stripped +6 -1
Added Base64 to mysys
include/base64.h
1.4 05/09/29 15:13:32 lars@stripped +0 -0
Rename: ndb/include/util/Base64.hpp -> include/base64.h
mysys/base64.c
1.6 05/09/29 15:13:02 lars@stripped +0 -0
Rename: ndb/src/common/util/Base64.cpp -> mysys/base64.c
# This is a BitKeeper patch. What follows are the unified diffs for the
# set of deltas contained in the patch. The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User: lars
# Host: dl145h.mysql.com
# Root: /users/lthalmann/bk/mysql-5.0-base64
--- 1.66/mysys/Makefile.am 2005-08-25 20:01:51 +02:00
+++ 1.67/mysys/Makefile.am 2005-10-14 01:13:55 +02:00
@@ -55,7 +55,7 @@
charset.c charset-def.c my_bitmap.c my_bit.c md5.c \
my_gethostbyname.c rijndael.c my_aes.c sha1.c \
my_handler.c my_netware.c my_largepage.c \
- my_windac.c my_access.c
+ my_windac.c my_access.c base64.c
EXTRA_DIST = thr_alarm.c thr_lock.c my_pthread.c my_thr_init.c \
thr_mutex.c thr_rwlock.c
libmysys_a_LIBADD = @THREAD_LOBJECTS@
@@ -115,6 +115,11 @@
$(CP) $(srcdir)/my_gethwaddr.c ./test_gethwaddr.c
$(LINK) $(FLAGS) -DMAIN ./test_gethwaddr.c $(LDADD) $(LIBS)
$(RM) -f ./test_gethwaddr.c
+
+test_base64$(EXEEXT): base64.c $(LIBRARIES)
+ $(CP) $(srcdir)/base64.c ./test_base64.c
+ $(LINK) $(FLAGS) -DMAIN ./test_base64.c $(LDADD) $(LIBS)
+ $(RM) -f ./test_base64.c
# Don't update the files from bitkeeper
%::SCCS/s.%
--- 1.3/ndb/include/util/Base64.hpp 2005-01-14 08:58:46 +01:00
+++ 1.5/include/base64.h 2005-10-14 01:13:57 +02:00
@@ -14,15 +14,38 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
-#ifndef __BASE64_HPP_INCLUDED__
-#define __BASE64_HPP_INCLUDED__
+#ifndef __BASE64_H_INCLUDED__
+#define __BASE64_H_INCLUDED__
-#include <UtilBuffer.hpp>
-#include <BaseString.hpp>
+#ifdef __cplusplus
+extern "C" {
+#endif
-int base64_encode(const UtilBuffer &src, BaseString &dst);
-int base64_encode(const void * s, size_t src_len, BaseString &dst);
-int base64_decode(const BaseString &src, UtilBuffer &dst);
-int base64_decode(const char * s, size_t len, UtilBuffer &dst);
-#endif /* !__BASE64_HPP_INCLUDED__ */
+#include <mysys_priv.h>
+
+/*
+ Calculate how much memory needed for dst of base64_encode()
+*/
+int base64_needed_encoded_length(int length_of_data);
+
+/*
+ Calculate how much memory needed for dst of base64_decode()
+*/
+int base64_needed_decoded_length(int length_of_encoded_data);
+
+/*
+ Encode data as a base64 string
+*/
+int base64_encode(const void *src, size_t src_len, char *dst);
+
+/*
+ Decode a base64 string into data
+*/
+int base64_decode(const char *src, size_t src_len, void *dst);
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* !__BASE64_H_INCLUDED__ */
--- 1.5/ndb/src/common/util/Base64.cpp 2005-01-14 08:58:46 +01:00
+++ 1.7/mysys/base64.c 2005-10-14 01:13:57 +02:00
@@ -14,92 +14,130 @@
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>
+#include <base64.h>
+#include <m_string.h> // strchr()
+
+#ifndef MAIN
static char base64_table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"0123456789+/";
+
+int
+base64_needed_encoded_length(int length_of_data)
+{
+ return ceil(length_of_data * 4 / 3) /* base64 chars */ +
+ ceil(length_of_data / (76 * 3 / 4)) /* Newlines */ +
+ 3 /* Padding */;
+}
+
+
int
-base64_encode(const UtilBuffer &src, BaseString &dst)
+base64_needed_decoded_length(int length_of_encoded_data)
{
- return base64_encode(src.get_data(), src.length(), dst);
+ return ceil(length_of_encoded_data * 3 / 4);
}
+
+/*
+ Encode a data as base64.
+
+ Note: We require that dst is pre-allocated to correct size.
+ See base64_needed_encoded_length().
+*/
+
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');
+base64_encode(const void *src, size_t src_len, char *dst)
+{
+ const unsigned char *s= (const unsigned char*)src;
+ size_t i= 0;
+ size_t len= 0;
+
+ for (; i < src_len; len += 4)
+ {
+ if (len == 76)
+ {
+ len= 0;
+ *dst++= '\n';
}
-
+
unsigned c;
- c = s[i++];
+ c= s[i++];
c <<= 8;
- if(i < src_len)
+ if (i < src_len)
c += s[i];
c <<= 8;
i++;
-
- if(i < src_len)
+
+ 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]);
+ *dst++= base64_table[(c >> 18) & 0x3f];
+ *dst++= base64_table[(c >> 12) & 0x3f];
- if(i > src_len)
- dst.append('=');
+ if (i > (src_len + 1))
+ *dst++= '=';
else
- dst.append(base64_table[(c >> 0) & 0x3f]);
+ *dst++= base64_table[(c >> 6) & 0x3f];
- len += 4;
+ if (i > src_len)
+ *dst++= '=';
+ else
+ *dst++= base64_table[(c >> 0) & 0x3f];
}
+
return 0;
}
+
static inline unsigned
-pos(unsigned char c) {
+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 && my_isspace(default_charset_info, * src)) \
+ { \
+ i++; \
+ src++; \
+ } \
+ if (i == size) \
+ { \
+ i= size + 1; \
+ break; \
+ } \
}
-#define SKIP_SPACE(src, i, size){ \
- while(i < size && isspace(* src)){ \
- i++; \
- src++; \
- } \
- if(i == size){ \
- i = size + 1; \
- break; \
- } \
-}
+/*
+ Decode a base64 string
+
+ Note: We require that dst is pre-allocated to correct size.
+ See base64_needed_decoded_length().
+
+ RETURN Number of bytes produced in dst or -1 in case of failure
+*/
int
-base64_decode(const char * src, size_t size, UtilBuffer &dst) {
- size_t i = 0;
- while(i < size){
- unsigned c = 0;
- int mark = 0;
+base64_decode(const char *src, size_t size, void *dst)
+{
+ char b[3];
+ size_t i= 0;
+ void *d= dst;
+ size_t j;
+
+ while (i < size)
+ {
+ unsigned c= 0;
+ size_t mark= 0;
SKIP_SPACE(src, i, size);
-
+
c += pos(*src++);
c <<= 6;
i++;
@@ -112,11 +150,12 @@
SKIP_SPACE(src, i, size);
- if(* src != '=')
+ if (* src != '=')
c += pos(*src++);
- else {
- i = size;
- mark = 2;
+ else
+ {
+ i= size;
+ mark= 2;
c <<= 6;
goto end;
}
@@ -125,87 +164,101 @@
SKIP_SPACE(src, i, size);
- if(*src != '=')
+ if (*src != '=')
c += pos(*src++);
- else {
- i = size;
- mark = 1;
+ 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);
+ b[0]= (c >> 16) & 0xff;
+ b[1]= (c >> 8) & 0xff;
+ b[2]= (c >> 0) & 0xff;
+
+ for (j=0; j<3-mark; j++)
+ *(char *)d++= b[j];
}
-
- if(i != size){
- abort();
+
+ if (i != size)
+ {
return -1;
}
- return 0;
+ return d - dst;
}
-#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);
+#else /* MAIN */
- BaseString str;
- require(base64_encode(src, str) == 0);
-
- if(str.length() == 3850){
- printf(">%s<\n", str.c_str());
- }
+#define require(b) { \
+ if (!(b)) { \
+ printf("Require failed at %s:%d\n", __FILE__, __LINE__); \
+ abort(); \
+ } \
+}
- 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");
+int
+main(void)
+{
+ int i;
+ size_t j;
+ size_t k, l;
+ size_t dst_len;
+
+ for (i= 0; i < 500; i++)
+ {
+ /* Create source data */
+ const size_t src_len= rand() % 1000 + 1;
+
+ char * src= (char *) malloc(src_len);
+ char * s= src;
+
+ for (j= 0; j<src_len; j++)
+ {
+ char c= rand();
+ *s++= c;
+ }
+
+ /* Encode */
+ char * str= (char *) malloc(base64_needed_encoded_length(src_len));
+ require(base64_encode(src, src_len, str) == 0);
+
+ /* Decode */
+ char * dst= (char *) malloc(base64_needed_decoded_length(strlen(str)));
+ dst_len= base64_decode(str, strlen(str), dst);
+ require(dst_len == src_len);
+
+ if (memcmp(src, dst, src_len) != 0)
+ {
+ printf(" --------- src --------- --------- dst ---------\n");
+ for (k= 0; k<src_len; k+=8)
+ {
+ printf("%.4x ", (uint) k);
+ for (l=0; l<8 && k+l<src_len; l++)
+ {
+ unsigned char c= src[k+l];
+ printf("%.2x ", (unsigned)c);
+ }
+
+ printf(" ");
+
+ for (l=0; l<8 && k+l<dst_len; l++)
+ {
+ unsigned char c= dst[k+l];
+ printf("%.2x ", (unsigned)c);
+ }
+ printf("\n");
}
- printf("\n");
- abort();
+ printf("src length: %.8x, dst length: %.8x\n",
+ (uint) src_len, (uint) dst_len);
+ require(0);
}
}
+ printf("Test succeeded.\n");
return 0;
}
--- 1.7/ndb/src/common/util/Parser.cpp 2005-07-14 17:54:32 +02:00
+++ 1.8/ndb/src/common/util/Parser.cpp 2005-10-14 01:13:55 +02:00
@@ -20,7 +20,6 @@
#include "Parser.hpp"
#include <NdbOut.hpp>
#include <Properties.hpp>
-#include <Base64.hpp>
#undef DEBUG
#define DEBUG(x) ndbout << x << endl;
@@ -316,11 +315,7 @@
}
case DummyRow::Properties: {
- Properties *sp = new Properties();
- BaseString v(value);
- UtilBuffer b;
- base64_decode(v, b);
- sp->unpack((const Uint32 *)b.get_data(), b.length());
+ abort();
break;
}
default:
--- 1.53/ndb/src/mgmapi/mgmapi.cpp 2005-09-12 14:11:27 +02:00
+++ 1.54/ndb/src/mgmapi/mgmapi.cpp 2005-10-14 01:13:55 +02:00
@@ -34,8 +34,8 @@
#include <Parser.hpp>
#include <OutputStream.hpp>
#include <InputStream.hpp>
-#include <Base64.hpp>
+#include <base64.h>
#define MGM_CMD(name, fun, desc) \
{ name, \
@@ -1770,11 +1770,15 @@
} while(start < len);
if(buf64 == 0)
break;
-
+
+ void *tmp_data = malloc(base64_needed_decoded_length((size_t) (len - 1)));
+ const int res = base64_decode(buf64, len-1, tmp_data);
+ delete[] buf64;
UtilBuffer tmp;
- const int res = base64_decode(buf64, len-1, tmp);
- delete[] buf64;
- if(res != 0){
+ tmp.append((void *) tmp_data, res);
+ free(tmp_data);
+ if (res < 0)
+ {
fprintf(handle->errstream, "Failed to decode buffer\n");
break;
}
--- 1.51/ndb/src/mgmsrv/Services.cpp 2005-09-06 09:41:56 +02:00
+++ 1.52/ndb/src/mgmsrv/Services.cpp 2005-10-14 01:13:56 +02:00
@@ -25,7 +25,6 @@
#include <signaldata/SetLogLevelOrd.hpp>
#include <LogLevel.hpp>
#include <BaseString.hpp>
-#include <Base64.hpp>
#include <ConfigValues.hpp>
#include <mgmapi_configuration.hpp>
@@ -33,6 +32,8 @@
#include "Services.hpp"
#include "../mgmapi/ndb_logevent.hpp"
+#include <base64.h>
+
extern bool g_StopServer;
static const unsigned int MAX_READ_TIMEOUT = 1000 ;
@@ -598,17 +599,18 @@
cfg->pack(src);
NdbMutex_Unlock(m_mgmsrv.m_configMutex);
- BaseString str;
- int res = base64_encode(src, str);
+ char *tmp_str = (char *) malloc(base64_needed_encoded_length(src.length()));
+ int res = base64_encode(src.get_data(), src.length(), tmp_str);
m_output->println("get config reply");
m_output->println("result: Ok");
- m_output->println("Content-Length: %d", str.length());
+ m_output->println("Content-Length: %d", strlen(tmp_str));
m_output->println("Content-Type: ndbconfig/octet-stream");
m_output->println("Content-Transfer-Encoding: base64");
m_output->println("");
- m_output->println(str.c_str());
+ m_output->println(tmp_str);
+ free(tmp_str);
return;
}
--- 1.4/ndb/config/type_ndbapi.mk.am 2004-06-02 02:54:35 +02:00
+++ 1.5/ndb/config/type_ndbapi.mk.am 2005-10-14 01:13:55 +02:00
@@ -1,6 +1,8 @@
INCLUDES += \
- -I$(srcdir) -I$(top_srcdir)/include -I$(top_srcdir)/ndb/include \
+ -I$(srcdir) -I$(top_srcdir)/include \
+ -I$(top_srcdir)/mysys \
+ -I$(top_srcdir)/ndb/include \
-I$(top_srcdir)/ndb/include/kernel \
-I$(top_srcdir)/ndb/include/transporter \
-I$(top_srcdir)/ndb/include/debugger \
--- 1.3/ndb/config/type_util.mk.am 2004-06-02 02:54:36 +02:00
+++ 1.4/ndb/config/type_util.mk.am 2005-10-14 01:13:55 +02:00
@@ -1,6 +1,11 @@
-INCLUDES += -I$(srcdir) -I$(top_srcdir)/include \
+INCLUDES += -I$(srcdir) \
+ -I$(top_srcdir)/include \
+ -I$(top_srcdir)/mysys \
-I$(top_srcdir)/ndb/include \
-I$(top_srcdir)/ndb/include/util \
-I$(top_srcdir)/ndb/include/portlib \
-I$(top_srcdir)/ndb/include/logger
+
+LDADD += \
+ $(top_builddir)/mysys/libmysys.a
--- 1.10/ndb/src/common/util/Makefile.am 2004-12-31 06:19:23 +01:00
+++ 1.11/ndb/src/common/util/Makefile.am 2005-10-14 01:13:55 +02:00
@@ -5,7 +5,7 @@
File.cpp md5_hash.cpp Properties.cpp socket_io.cpp \
SimpleProperties.cpp Parser.cpp InputStream.cpp \
SocketServer.cpp SocketClient.cpp SocketAuthenticator.cpp\
- OutputStream.cpp NdbOut.cpp BaseString.cpp Base64.cpp \
+ OutputStream.cpp NdbOut.cpp BaseString.cpp \
NdbSqlUtil.cpp new.cpp \
uucode.c random.c version.c \
strdup.c \
| Thread |
|---|
| • bk commit into 5.0 tree (lars:1.2022) | Lars Thalmann | 14 Oct |