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

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. #include "HugoCalculator.hpp"
  14. #include <NDBT.hpp>
  15. /* *************************************************************
  16.  * HugoCalculator
  17.  *
  18.  *  Comon class for the Hugo test suite, provides the functions 
  19.  *  that is used for calculating values to load in to table and 
  20.  *  also knows how to verify a row that's been read from db 
  21.  *
  22.  * ************************************************************/
  23. HugoCalculator::HugoCalculator(const NdbDictionary::Table& tab) : m_tab(tab) {
  24.   // The "id" column of this table is found in the first integer column
  25.   int i;
  26.   for (i=0; i<m_tab.getNoOfColumns(); i++){ 
  27.     const NdbDictionary::Column* attr = m_tab.getColumn(i);
  28.     if (attr->getType() == NdbDictionary::Column::Unsigned){
  29.       m_idCol = i;
  30.       break;
  31.     }
  32.   }
  33.   
  34.   // The "number of updates" column for this table is found in the last column
  35.   for (i=m_tab.getNoOfColumns()-1; i>=0; i--){
  36.     const NdbDictionary::Column* attr = m_tab.getColumn(i);
  37.     if (attr->getType() == NdbDictionary::Column::Unsigned){
  38.       m_updatesCol = i;
  39.       break;
  40.     }
  41.   }
  42. #if 0
  43.   ndbout << "idCol = " << m_idCol << endl;
  44.   ndbout << "updatesCol = " << m_updatesCol << endl;
  45. #endif
  46.   // Check that idCol is not conflicting with updatesCol
  47.   assert(m_idCol != m_updatesCol && m_idCol != -1 && m_updatesCol != -1);
  48. }
  49. Int32
  50. HugoCalculator::calcValue(int record, 
  51.   int attrib, 
  52.   int updates) const {
  53.   const NdbDictionary::Column* attr = m_tab.getColumn(attrib);
  54.   // If this is the "id" column
  55.   if (attrib == m_idCol)
  56.     return record;
  57.  
  58.   // If this is the update column
  59.   if (attrib == m_updatesCol)
  60.     return updates;
  61.   Int32 val;
  62.   if (attr->getPrimaryKey())
  63.     val = record + attrib;
  64.   else
  65.     val = record + attrib + updates;
  66.   return val;
  67. }
  68. #if 0
  69. HugoCalculator::U_Int32 calcValue(int record, int attrib, int updates) const;
  70. HugoCalculator::U_Int64 calcValue(int record, int attrib, int updates) const;
  71. HugoCalculator::Int64 calcValue(int record, int attrib, int updates) const;
  72. HugoCalculator::float calcValue(int record, int attrib, int updates) const;
  73. HugoCalculator::double calcValue(int record, int attrib, int updates) const;
  74. #endif
  75. const char* 
  76. HugoCalculator::calcValue(int record, 
  77.   int attrib, 
  78.   int updates, 
  79.   char* buf) const {
  80.   const char a[26] = {"UAWBORCTDPEFQGNYHISJMKXLZ"};
  81.   const NdbDictionary::Column* attr = m_tab.getColumn(attrib);
  82.   int val = calcValue(record, attrib, updates);
  83.   int len;
  84.   if (attr->getPrimaryKey()){
  85.     // Create a string where val is printed as chars in the beginning
  86.     // of the string, then fill with other chars
  87.     // The string length is set to the same size as the attribute
  88.     len = attr->getLength();
  89.     BaseString::snprintf(buf, len, "%d", val);
  90.     for(int i=strlen(buf); i < len; i++)
  91.       buf[i] = a[((val^i)%25)]; 
  92.   } else{
  93.     
  94.     // Fill buf with some pattern so that we can detect
  95.     // anomalies in the area that we don't fill with chars
  96.     int i;
  97.     for (i = 0; i<attr->getLength(); i++)
  98.       buf[i] = ((i+2) % 255);
  99.     
  100.     // Calculate length of the string to create. We want the string 
  101.     // length to be varied between max and min of this attribute.
  102.     len = val % (attr->getLength() + 1);
  103.     // If len == 0 return NULL if this is a nullable attribute
  104.     if (len == 0){
  105.       if(attr->getNullable() == true)
  106. return NULL;
  107.       else
  108. len++;
  109.     }
  110.     for(i=0; i < len; i++)
  111.       buf[i] = a[((val^i)%25)];
  112.     buf[len] = 0;
  113.   }
  114.   return buf;
  115. }
  116. int
  117. HugoCalculator::verifyRowValues(NDBT_ResultRow* const  pRow) const{
  118.   int id, updates;
  119.   id = pRow->attributeStore(m_idCol)->u_32_value();
  120.   updates = pRow->attributeStore(m_updatesCol)->u_32_value();
  121.   // Check the values of each column
  122.   for (int i = 0; i<m_tab.getNoOfColumns(); i++){
  123.     if (i != m_updatesCol && id != m_idCol) {
  124.       
  125.       const NdbDictionary::Column* attr = m_tab.getColumn(i);      
  126.       switch (attr->getType()){
  127.       case NdbDictionary::Column::Char:
  128.       case NdbDictionary::Column::Varchar:
  129.       case NdbDictionary::Column::Binary:
  130.       case NdbDictionary::Column::Varbinary:{
  131. int result = 0;   
  132. char* buf = new char[attr->getLength()+1];
  133. const char* res = calcValue(id, i, updates, buf);
  134. if (res == NULL){
  135.   if (!pRow->attributeStore(i)->isNULL()){
  136.     g_err << "|- NULL ERROR: expected a NULL but the column was not null" << endl;
  137.     g_err << "|- The row: "" << (*pRow) << """ << endl;
  138.     result = -1;
  139.   }
  140. } else{
  141.   if (memcmp(res, pRow->attributeStore(i)->aRef(), pRow->attributeStore(i)->arraySize()) != 0){
  142.     //   if (memcmp(res, pRow->attributeStore(i)->aRef(), pRow->attributeStore(i)->getLength()) != 0){
  143.     g_err << "arraySize(): " 
  144.    << pRow->attributeStore(i)->arraySize()
  145.    << ", NdbDict::Column::getLength(): " << attr->getLength()
  146.    << endl;
  147.     const char* buf2 = pRow->attributeStore(i)->aRef();
  148.     for (Uint32 j = 0; j < pRow->attributeStore(i)->arraySize(); j++)
  149.     {
  150.       g_err << j << ":" << buf[j] << "[" << buf2[j] << "]";
  151.       if (buf[j] != buf2[j])
  152.       {
  153. g_err << "==>Match failed!";
  154.       }
  155.       g_err << endl;
  156.     }
  157.     g_err << endl;
  158.     g_err << "|- Invalid data found in attribute " << i << ": ""
  159.    << pRow->attributeStore(i)->aRef()
  160.    << "" != "" << res << """ << endl
  161.    << "Length of expected=" << (unsigned)strlen(res) << endl
  162.    << "Lenght of read="
  163.    << (unsigned)strlen(pRow->attributeStore(i)->aRef()) << endl;
  164.     g_err << "|- The row: "" << (* pRow) << """ << endl;
  165.     result = -1;
  166.   }
  167. }
  168. delete []buf;
  169. if (result != 0)
  170.   return result;
  171.       }
  172. break;
  173.       case NdbDictionary::Column::Int:
  174.       case NdbDictionary::Column::Unsigned:{
  175. Int32 cval = calcValue(id, i, updates);
  176. Int32 val = pRow->attributeStore(i)->int32_value();
  177. if (val != cval){
  178.   g_err << "|- Invalid data found: "" << val << "" != "" 
  179.  << cval << """ << endl;
  180.   g_err << "|- The row: "" << (* pRow) << """ << endl;
  181.   return -1;
  182. }
  183. break;
  184.       }
  185.       case NdbDictionary::Column::Bigint:
  186.       case NdbDictionary::Column::Bigunsigned:{
  187. Uint64 cval = calcValue(id, i, updates);
  188. Uint64 val = pRow->attributeStore(i)->u_64_value();
  189. if (val != cval){
  190.   g_err << "|- Invalid data found: "" << val << "" != "" 
  191.  << cval << """ 
  192.  << endl;
  193.   g_err << "|- The row: "" << (* pRow) << """ << endl;
  194.   return -1;
  195. }
  196.       }
  197. break;
  198.       case NdbDictionary::Column::Float:{
  199. float cval = calcValue(id, i, updates);
  200. float val = pRow->attributeStore(i)->float_value();
  201. if (val != cval){
  202.   g_err << "|- Invalid data found: "" << val << "" != "" 
  203.  << cval << """ << endl;
  204.   g_err << "|- The row: "" << (* pRow) << """ << endl;
  205.   return -1;
  206. }
  207.       }
  208. break;
  209.       case NdbDictionary::Column::Undefined:
  210.       default:
  211. assert(false);
  212. break;
  213.       }
  214.       
  215.     }
  216.   }
  217.   return 0;
  218. }
  219. int
  220. HugoCalculator::getIdValue(NDBT_ResultRow* const pRow) const {
  221.   return pRow->attributeStore(m_idCol)->u_32_value();
  222. }  
  223. int
  224. HugoCalculator::getUpdatesValue(NDBT_ResultRow* const pRow) const {
  225.   return pRow->attributeStore(m_updatesCol)->u_32_value();
  226. }