item_buff.cc
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

  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. /* Buffers to save and compare item values */
  17. #include "mysql_priv.h"
  18. /*
  19. ** Create right type of item_buffer for an item
  20. */
  21. Item_buff *new_Item_buff(Item *item)
  22. {
  23.   if (item->type() == Item::FIELD_ITEM &&
  24.       !(((Item_field *) item)->field->flags & BLOB_FLAG))
  25.     return new Item_field_buff((Item_field *) item);
  26.   if (item->result_type() == STRING_RESULT)
  27.     return new Item_str_buff((Item_field *) item);
  28.   if (item->result_type() == INT_RESULT)
  29.     return new Item_int_buff((Item_field *) item);
  30.   return new Item_real_buff(item);
  31. }
  32. Item_buff::~Item_buff() {}
  33. /*
  34. ** Compare with old value and replace value with new value
  35. ** Return true if values have changed
  36. */
  37. bool Item_str_buff::cmp(void)
  38. {
  39.   String *res;
  40.   bool tmp;
  41.   res=item->val_str(&tmp_value);
  42.   if (null_value != item->null_value)
  43.   {
  44.     if ((null_value= item->null_value))
  45.       return TRUE; // New value was null
  46.     tmp=TRUE;
  47.   }
  48.   else if (null_value)
  49.     return 0; // new and old value was null
  50.   else if (!item->binary)
  51.     tmp= sortcmp(&value,res) != 0;
  52.   else
  53.     tmp= stringcmp(&value,res) != 0;
  54.   if (tmp)
  55.     value.copy(*res); // Remember for next cmp
  56.   return tmp;
  57. }
  58. Item_str_buff::~Item_str_buff()
  59. {
  60.   item=0; // Safety
  61. }
  62. bool Item_real_buff::cmp(void)
  63. {
  64.   double nr=item->val();
  65.   if (null_value != item->null_value || nr != value)
  66.   {
  67.     null_value= item->null_value;
  68.     value=nr;
  69.     return TRUE;
  70.   }
  71.   return FALSE;
  72. }
  73. bool Item_int_buff::cmp(void)
  74. {
  75.   longlong nr=item->val_int();
  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. bool Item_field_buff::cmp(void)
  85. {
  86.   bool tmp= field->cmp(buff) != 0; // This is not a blob!
  87.   if (tmp)
  88.     field->get_image(buff,length);
  89.   if (null_value != field->is_null())
  90.   {
  91.     null_value= !null_value;
  92.     tmp=TRUE;
  93.   }
  94.   return tmp;
  95. }
  96. /*****************************************************************************
  97. ** Instansiate templates
  98. *****************************************************************************/
  99. #ifdef __GNUC__
  100. template class List<Item_buff>;
  101. template class List_iterator<Item_buff>;
  102. #endif