NdbRecAttr.cpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:10k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. /************************************************************************************************
  14. Name:          NdbRecAttr.C
  15. Include:
  16. Link:
  17. Author:        UABRONM Mikael Ronstr鰉 UAB/B/SD                         
  18. Date:          971206
  19. Version:       0.1
  20. Description:   Interface between TIS and NDB
  21. Documentation:
  22. Adjust:  971206  UABRONM First version
  23. ************************************************************************************************/
  24. #include <ndb_global.h>
  25. #include <NdbOut.hpp>
  26. #include <NdbRecAttr.hpp>
  27. #include <NdbBlob.hpp>
  28. #include "NdbDictionaryImpl.hpp"
  29. #include <NdbTCP.h>
  30. NdbRecAttr::NdbRecAttr(Ndb*)
  31. {
  32.   init();
  33. }
  34. NdbRecAttr::~NdbRecAttr()
  35. {
  36.   release();
  37. }
  38. int
  39. NdbRecAttr::setup(const class NdbDictionary::Column* col, char* aValue)
  40. {
  41.   return setup(&(col->m_impl), aValue);
  42. }
  43. int
  44. NdbRecAttr::setup(const NdbColumnImpl* anAttrInfo, char* aValue)
  45. {
  46.   Uint32 tAttrSize = anAttrInfo->m_attrSize;
  47.   Uint32 tArraySize = anAttrInfo->m_arraySize;
  48.   Uint32 tAttrByteSize = tAttrSize * tArraySize;
  49.   
  50.   m_column = anAttrInfo;
  51.   theAttrId = anAttrInfo->m_attrId;
  52.   theAttrSize = tAttrSize;
  53.   theArraySize = tArraySize;
  54.   theValue = aValue;
  55.   theNULLind = 0;
  56.   m_nullable = anAttrInfo->m_nullable;
  57.   // check alignment to signal data
  58.   // a future version could check alignment per data type as well
  59.   
  60.   if (aValue != NULL && (UintPtr(aValue)&3) == 0 && (tAttrByteSize&3) == 0) {
  61.     theStorageX = NULL;
  62.     theRef = aValue;
  63.     return 0;
  64.   }
  65.   if (tAttrByteSize <= 32) {
  66.     theStorageX = NULL;
  67.     theStorage[0] = 0;
  68.     theStorage[1] = 0;
  69.     theStorage[2] = 0;
  70.     theStorage[3] = 0;
  71.     theRef = theStorage;
  72.     return 0;
  73.   }
  74.   Uint32 tSize = (tAttrByteSize + 7) >> 3;
  75.   Uint64* tRef = new Uint64[tSize];
  76.   if (tRef != NULL) {
  77.     for (Uint32 i = 0; i < tSize; i++) {
  78.       tRef[i] = 0;
  79.     }
  80.     theStorageX = tRef;
  81.     theRef = tRef;
  82.     return 0;
  83.   }
  84.   return -1;
  85. }
  86. void
  87. NdbRecAttr::copyout()
  88. {
  89.   char* tRef = (char*)theRef;
  90.   char* tValue = theValue;
  91.   if (tRef != tValue && tRef != NULL && tValue != NULL) {
  92.     Uint32 n = theAttrSize * theArraySize;
  93.     while (n-- > 0) {
  94.       *tValue++ = *tRef++;
  95.     }
  96.   }
  97. }
  98. NdbRecAttr *
  99. NdbRecAttr::clone() const {
  100.   NdbRecAttr * ret = new NdbRecAttr(0);
  101.   ret->theAttrId = theAttrId;
  102.   ret->theNULLind = theNULLind;
  103.   ret->theAttrSize = theAttrSize;
  104.   ret->theArraySize = theArraySize;
  105.   ret->m_column = m_column;
  106.   
  107.   Uint32 n = theAttrSize * theArraySize;  
  108.   if(n <= 32){
  109.     ret->theRef = (char*)&ret->theStorage[0];
  110.     ret->theStorageX = 0;
  111.     ret->theValue = 0;
  112.   } else {
  113.     ret->theStorageX = new Uint64[((n + 7) >> 3)];
  114.     ret->theRef = (char*)ret->theStorageX;    
  115.     ret->theValue = 0;
  116.   }
  117.   memcpy(ret->theRef, theRef, n);
  118.   return ret;
  119. }
  120. bool
  121. NdbRecAttr::receive_data(const Uint32 * data, Uint32 sz){
  122.   const Uint32 n = (theAttrSize * theArraySize + 3) >> 2;  
  123.   if(n == sz){
  124.     theNULLind = 0;
  125.     if(!copyoutRequired())
  126.       memcpy(theRef, data, 4 * sz);
  127.     else
  128.       memcpy(theValue, data, theAttrSize * theArraySize);
  129.     return true;
  130.   } else if(sz == 0){
  131.     setNULL();
  132.     return true;
  133.   }
  134.   return false;
  135. }
  136. NdbOut& operator<<(NdbOut& out, const NdbRecAttr &r)
  137. {
  138.   if (r.isNULL())
  139.   {
  140.     out << "[NULL]";
  141.     return out;
  142.   }
  143.   const NdbDictionary::Column* c = r.getColumn();
  144.   uint length = c->getLength();
  145.   if (length > 1)
  146.     out << "[";
  147.   for (Uint32 j = 0; j < length; j++) 
  148.   {
  149.     if (j > 0)
  150.       out << " ";
  151.     switch(r.getType())
  152.       {
  153.       case NdbDictionary::Column::Bigunsigned:
  154. out << r.u_64_value();
  155. break;
  156.       case NdbDictionary::Column::Unsigned:
  157. out << r.u_32_value();
  158. break;
  159.       case NdbDictionary::Column::Smallunsigned:
  160. out << r.u_short_value();
  161. break;
  162.       case NdbDictionary::Column::Tinyunsigned:
  163. out << (unsigned) r.u_char_value();
  164. break;
  165.       case NdbDictionary::Column::Bigint:
  166. out << r.int64_value();
  167. break;
  168.       case NdbDictionary::Column::Int:
  169. out << r.int32_value();
  170. break;
  171.       case NdbDictionary::Column::Smallint:
  172. out << r.short_value();
  173. break;
  174.       case NdbDictionary::Column::Tinyint:
  175. out << (int) r.char_value();
  176. break;
  177.       case NdbDictionary::Column::Char:
  178. out.print("%.*s", r.arraySize(), r.aRef());
  179. j = length;
  180. break;
  181.       case NdbDictionary::Column::Varchar:
  182. {
  183.   short len = ntohs(r.u_short_value());
  184.   out.print("%.*s", len, r.aRef()+2);
  185. }
  186. j = length;
  187.       break;
  188.       case NdbDictionary::Column::Float:
  189. out << r.float_value();
  190. break;
  191.       case NdbDictionary::Column::Double:
  192. out << r.double_value();
  193. break;
  194.       case NdbDictionary::Column::Olddecimal:
  195.         {
  196.           short len = 1 + c->getPrecision() + (c->getScale() > 0);
  197.           out.print("%.*s", len, r.aRef());
  198.         }
  199.         break;
  200.       case NdbDictionary::Column::Olddecimalunsigned:
  201.         {
  202.           short len = 0 + c->getPrecision() + (c->getScale() > 0);
  203.           out.print("%.*s", len, r.aRef());
  204.         }
  205. break;
  206.       // for dates cut-and-paste from field.cc
  207.       case NdbDictionary::Column::Datetime:
  208.         {
  209.           ulonglong tmp=r.u_64_value();
  210.           long part1,part2,part3;
  211.           part1=(long) (tmp/LL(1000000));
  212.           part2=(long) (tmp - (ulonglong) part1*LL(1000000));
  213.           char buf[40];
  214.           char* pos=(char*) buf+19;
  215.           *pos--=0;
  216.           *pos--= (char) ('0'+(char) (part2%10)); part2/=10; 
  217.           *pos--= (char) ('0'+(char) (part2%10)); part3= (int) (part2 / 10);
  218.           *pos--= ':';
  219.           *pos--= (char) ('0'+(char) (part3%10)); part3/=10;
  220.           *pos--= (char) ('0'+(char) (part3%10)); part3/=10;
  221.           *pos--= ':';
  222.           *pos--= (char) ('0'+(char) (part3%10)); part3/=10;
  223.           *pos--= (char) ('0'+(char) part3);
  224.           *pos--= '/';
  225.           *pos--= (char) ('0'+(char) (part1%10)); part1/=10;
  226.           *pos--= (char) ('0'+(char) (part1%10)); part1/=10;
  227.           *pos--= '-';
  228.           *pos--= (char) ('0'+(char) (part1%10)); part1/=10;
  229.           *pos--= (char) ('0'+(char) (part1%10)); part3= (int) (part1/10);
  230.           *pos--= '-';
  231.           *pos--= (char) ('0'+(char) (part3%10)); part3/=10;
  232.           *pos--= (char) ('0'+(char) (part3%10)); part3/=10;
  233.           *pos--= (char) ('0'+(char) (part3%10)); part3/=10;
  234.           *pos=(char) ('0'+(char) part3);
  235.           out << buf;
  236.         }
  237. break;
  238.       case NdbDictionary::Column::Date:
  239.         {
  240.           uint32 tmp=(uint32) uint3korr(r.aRef());
  241.           int part;
  242.           char buf[40];
  243.           char *pos=(char*) buf+10;
  244.           *pos--=0;
  245.           part=(int) (tmp & 31);
  246.           *pos--= (char) ('0'+part%10);
  247.           *pos--= (char) ('0'+part/10);
  248.           *pos--= '-';
  249.           part=(int) (tmp >> 5 & 15);
  250.           *pos--= (char) ('0'+part%10);
  251.           *pos--= (char) ('0'+part/10);
  252.           *pos--= '-';
  253.           part=(int) (tmp >> 9);
  254.           *pos--= (char) ('0'+part%10); part/=10;
  255.           *pos--= (char) ('0'+part%10); part/=10;
  256.           *pos--= (char) ('0'+part%10); part/=10;
  257.           *pos=   (char) ('0'+part);
  258.           out << buf;
  259.         }
  260. break;
  261.       case NdbDictionary::Column::Time:
  262.         {
  263.           long tmp=(long) sint3korr(r.aRef());
  264.           int hour=(uint) (tmp/10000);
  265.           int minute=(uint) (tmp/100 % 100);
  266.           int second=(uint) (tmp % 100);
  267.           char buf[40];
  268.           sprintf(buf, "%02d:%02d:%02d", hour, minute, second);
  269.           out << buf;
  270.         }
  271. break;
  272.       case NdbDictionary::Column::Year:
  273.         {
  274.           uint year = 1900 + r.u_char_value();
  275.           char buf[40];
  276.           sprintf(buf, "%04d", year);
  277.           out << buf;
  278.         }
  279. break;
  280.       case NdbDictionary::Column::Timestamp:
  281.         {
  282.           time_t time = r.u_32_value();
  283.           out << (uint)time;
  284.         }
  285. break;
  286.       case NdbDictionary::Column::Blob:
  287.         {
  288.           const NdbBlob::Head* h = (const NdbBlob::Head*)r.aRef();
  289.           out << h->length << ":";
  290.           const unsigned char* p = (const unsigned char*)(h + 1);
  291.           unsigned n = r.arraySize() - sizeof(*h);
  292.           for (unsigned k = 0; k < n && k < h->length; k++)
  293.             out.print("%02X", (int)p[k]);
  294.           j = length;
  295.         }
  296.         break;
  297.       case NdbDictionary::Column::Text:
  298.         {
  299.           const NdbBlob::Head* h = (const NdbBlob::Head*)r.aRef();
  300.           out << h->length << ":";
  301.           const unsigned char* p = (const unsigned char*)(h + 1);
  302.           unsigned n = r.arraySize() - sizeof(*h);
  303.           for (unsigned k = 0; k < n && k < h->length; k++)
  304.             out.print("%c", (int)p[k]);
  305.           j = length;
  306.         }
  307.         break;
  308.       default: /* no print functions for the rest, just print type */
  309. out << (int) r.getType();
  310. j = length;
  311. if (j > 1)
  312.   out << " " << j << " times";
  313. break;
  314.       }
  315.   }
  316.   if (length > 1)
  317.   {
  318.     out << "]";
  319.   }
  320.   return out;
  321. }
  322. Int64
  323. NdbRecAttr::int64_value() const 
  324. {
  325.   Int64 val;
  326.   memcpy(&val,theRef,8);
  327.   return val;
  328. }
  329. Uint64
  330. NdbRecAttr::u_64_value() const
  331. {
  332.   Uint64 val;
  333.   memcpy(&val,theRef,8);
  334.   return val;
  335. }
  336. float
  337. NdbRecAttr::float_value() const
  338. {
  339.   float val;
  340.   memcpy(&val,theRef,sizeof(val));
  341.   return val;
  342. }
  343. double
  344. NdbRecAttr::double_value() const
  345. {
  346.   double val;
  347.   memcpy(&val,theRef,sizeof(val));
  348.   return val;
  349. }