List:Internals« Previous MessageNext Message »
From:Lars Thalmann Date:October 14 2005 1:14am
Subject:bk commit into 5.0 tree (lars:1.2022)
View as plain text  
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 Thalmann14 Oct