home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 January / Chip_2001-01_cd1.bin / tema / mysql / mysql-3.23.28g-win-source.exe / sql / item_buff.cpp < prev    next >
C/C++ Source or Header  |  2000-08-31  |  3KB  |  120 lines

  1. /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2.    
  3.    This program is free software; you can redistribute it and/or modify
  4.    it under the terms of the GNU General Public License as published by
  5.    the Free Software Foundation; either version 2 of the License, or
  6.    (at your option) any later version.
  7.    
  8.    This program is distributed in the hope that it will be useful,
  9.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11.    GNU General Public License for more details.
  12.    
  13.    You should have received a copy of the GNU General Public License
  14.    along with this program; if not, write to the Free Software
  15.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  16.  
  17.  
  18. /* Buffers to save and compare item values */
  19.  
  20. #include "mysql_priv.h"
  21.  
  22. /*
  23. ** Create right type of item_buffer for an item
  24. */
  25.  
  26. Item_buff *new_Item_buff(Item *item)
  27. {
  28.   if (item->type() == Item::FIELD_ITEM &&
  29.       !(((Item_field *) item)->field->flags & BLOB_FLAG))
  30.     return new Item_field_buff((Item_field *) item);
  31.   if (item->result_type() == STRING_RESULT)
  32.     return new Item_str_buff((Item_field *) item);
  33.   if (item->result_type() == INT_RESULT)
  34.     return new Item_int_buff((Item_field *) item);
  35.   return new Item_real_buff(item);
  36. }
  37.  
  38. Item_buff::~Item_buff() {}
  39.  
  40. /*
  41. ** Compare with old value and replace value with new value
  42. ** Return true if values have changed
  43. */
  44.  
  45. bool Item_str_buff::cmp(void)
  46. {
  47.   String *res;
  48.   bool tmp;
  49.  
  50.   res=item->val_str(&tmp_value);
  51.   if (null_value != item->null_value)
  52.   {
  53.     if ((null_value= item->null_value))
  54.       return TRUE;                // New value was null
  55.     tmp=TRUE;
  56.   }
  57.   else if (null_value)
  58.     return 0;                    // new and old value was null
  59.   else if (!item->binary)
  60.     tmp= sortcmp(&value,res) != 0;
  61.   else
  62.     tmp= stringcmp(&value,res) != 0;
  63.   if (tmp)
  64.     value.copy(*res);                // Remember for next cmp
  65.   return tmp;
  66. }
  67.  
  68. Item_str_buff::~Item_str_buff()
  69. {
  70.   item=0;                    // Safety
  71. }
  72.  
  73. bool Item_real_buff::cmp(void)
  74. {
  75.   double nr=item->val();
  76.   if (null_value != item->null_value || nr != value)
  77.   {
  78.     null_value= item->null_value;
  79.     value=nr;
  80.     return TRUE;
  81.   }
  82.   return FALSE;
  83. }
  84.  
  85. bool Item_int_buff::cmp(void)
  86. {
  87.   longlong nr=item->val_int();
  88.   if (null_value != item->null_value || nr != value)
  89.   {
  90.     null_value= item->null_value;
  91.     value=nr;
  92.     return TRUE;
  93.   }
  94.   return FALSE;
  95. }
  96.  
  97.  
  98. bool Item_field_buff::cmp(void)
  99. {
  100.   bool tmp= field->cmp(buff) != 0;        // This is not a blob!
  101.   if (tmp)
  102.     field->get_image(buff,length);
  103.   if (null_value != field->is_null())
  104.   {
  105.     null_value= !null_value;
  106.     tmp=TRUE;
  107.   }
  108.   return tmp;
  109. }
  110.  
  111.  
  112. /*****************************************************************************
  113. ** Instansiate templates
  114. *****************************************************************************/
  115.  
  116. #ifdef __GNUC__
  117. template class List<Item_buff>;
  118. template class List_iterator<Item_buff>;
  119. #endif
  120.