Drizzled Public API Documentation

mi_checksum.cc
1 /* Copyright (C) 2000-2001, 2003-2004 MySQL 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; version 2 of the License.
6 
7  This program is distributed in the hope that it will be useful,
8  but WITHOUT ANY WARRANTY; without even the implied warranty of
9  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  GNU General Public License for more details.
11 
12  You should have received a copy of the GNU General Public License
13  along with this program; if not, write to the Free Software
14  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
15 
16 /* Calculate a checksum for a row */
17 
18 #include "myisam_priv.h"
19 #include <zlib.h>
20 
21 using namespace drizzled;
22 
23 /*
24  Calculate a long checksum for a memoryblock.
25 
26  SYNOPSIS
27  my_checksum()
28  crc start value for crc
29  pos pointer to memory block
30  length length of the block
31 */
32 
33 static ha_checksum my_checksum(ha_checksum crc, const unsigned char *pos, size_t length)
34 {
35  return ha_checksum(crc32((uint32_t)crc, pos, uInt(length)));
36 }
37 
38 ha_checksum mi_checksum(MI_INFO *info, const unsigned char *buf)
39 {
40  uint32_t i;
41  ha_checksum crc=0;
42  MI_COLUMNDEF *rec=info->s->rec;
43 
44  for (i=info->s->base.fields ; i-- ; buf+=(rec++)->length)
45  {
46  const unsigned char *pos;
47  ulong length;
48  switch (rec->type) {
49  case FIELD_BLOB:
50  {
51  length=_mi_calc_blob_length(rec->length-
52  portable_sizeof_char_ptr,
53  buf);
54  memcpy(&pos, buf+rec->length - portable_sizeof_char_ptr, sizeof(char*));
55  break;
56  }
57  case FIELD_VARCHAR:
58  {
59  uint32_t pack_length= ha_varchar_packlength(rec->length-1);
60  if (pack_length == 1)
61  length= (ulong) *(unsigned char*) buf;
62  else
63  length= uint2korr(buf);
64  pos= buf+pack_length;
65  break;
66  }
67  default:
68  length=rec->length;
69  pos=buf;
70  break;
71  }
72  crc=my_checksum(crc, pos ? pos : (unsigned char*) "", length);
73  }
74  return crc;
75 }
76 
77 
78 ha_checksum mi_static_checksum(MI_INFO *info, const unsigned char *pos)
79 {
80  return my_checksum(0, pos, info->s->base.reclength);
81 }
TODO: Rename this file - func.h is stupid.