lib/cdb++/cdb_get.cc
author "Tomas Zeman <tzeman@volny.cz>"
Sun, 20 Jan 2008 00:22:09 +0100
changeset 2 b3afb9f1e801
parent 0 6f7a81934006
permissions -rw-r--r--
Imported vmailmgr-0.97
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
6f7a81934006 Imported vmailmgr-0.96.9
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
     1
// Copyright (C) 1999,2000 Bruce Guenter <bruceg@em.ca>
6f7a81934006 Imported vmailmgr-0.96.9
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
     2
//
6f7a81934006 Imported vmailmgr-0.96.9
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
     3
// This program is free software; you can redistribute it and/or modify
6f7a81934006 Imported vmailmgr-0.96.9
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
     4
// it under the terms of the GNU General Public License as published by
6f7a81934006 Imported vmailmgr-0.96.9
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
     5
// the Free Software Foundation; either version 2 of the License, or
6f7a81934006 Imported vmailmgr-0.96.9
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
     6
// (at your option) any later version.
6f7a81934006 Imported vmailmgr-0.96.9
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
     7
//
6f7a81934006 Imported vmailmgr-0.96.9
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
     8
// This program is distributed in the hope that it will be useful,
6f7a81934006 Imported vmailmgr-0.96.9
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
     9
// but WITHOUT ANY WARRANTY; without even the implied warranty of
6f7a81934006 Imported vmailmgr-0.96.9
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    10
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
6f7a81934006 Imported vmailmgr-0.96.9
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    11
// GNU General Public License for more details.
6f7a81934006 Imported vmailmgr-0.96.9
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    12
//
6f7a81934006 Imported vmailmgr-0.96.9
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    13
// You should have received a copy of the GNU General Public License
6f7a81934006 Imported vmailmgr-0.96.9
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    14
// along with this program; if not, write to the Free Software
6f7a81934006 Imported vmailmgr-0.96.9
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    15
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
6f7a81934006 Imported vmailmgr-0.96.9
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    16
6f7a81934006 Imported vmailmgr-0.96.9
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    17
#include "cdb++.h"
6f7a81934006 Imported vmailmgr-0.96.9
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    18
#include "internal.h"
6f7a81934006 Imported vmailmgr-0.96.9
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    19
2
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents: 0
diff changeset
    20
char* cdb_reader::seek(const mystring& key, uint32& dlen)
0
6f7a81934006 Imported vmailmgr-0.96.9
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    21
{
6f7a81934006 Imported vmailmgr-0.96.9
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    22
  if(failed)
2
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents: 0
diff changeset
    23
    return 0;
0
6f7a81934006 Imported vmailmgr-0.96.9
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    24
  uint32 h = hash(key);
6f7a81934006 Imported vmailmgr-0.96.9
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    25
  uint32 pos = 8 * (h & 255);
6f7a81934006 Imported vmailmgr-0.96.9
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    26
2
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents: 0
diff changeset
    27
  uint32 poshash = unpack(map+pos); 
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents: 0
diff changeset
    28
  uint32 lenhash = unpack(map+pos+4);
0
6f7a81934006 Imported vmailmgr-0.96.9
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    29
  
2
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents: 0
diff changeset
    30
  if(!lenhash)
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents: 0
diff changeset
    31
    return 0;
0
6f7a81934006 Imported vmailmgr-0.96.9
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    32
  uint32 h2 = (h >> 8) % lenhash;
6f7a81934006 Imported vmailmgr-0.96.9
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    33
6f7a81934006 Imported vmailmgr-0.96.9
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    34
  for (uint32 loop = 0; loop < lenhash; ++loop) {
2
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents: 0
diff changeset
    35
    unsigned char* ptrhash = map + poshash + 8*h2;
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents: 0
diff changeset
    36
    uint32 poskd = unpack(ptrhash + 4);
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents: 0
diff changeset
    37
    if(!poskd)
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents: 0
diff changeset
    38
      return 0;
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents: 0
diff changeset
    39
    if(unpack(ptrhash) == h) {
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents: 0
diff changeset
    40
      unsigned char* ptrmatch = map + poskd;
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents: 0
diff changeset
    41
      if(unpack(ptrmatch) == key.length() &&
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents: 0
diff changeset
    42
	 !memcmp(ptrmatch+8, key.c_str(), key.length())) {
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents: 0
diff changeset
    43
	dlen = unpack(ptrmatch + 4);
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents: 0
diff changeset
    44
	return (char*)ptrmatch + 8 + key.length();
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents: 0
diff changeset
    45
      }
0
6f7a81934006 Imported vmailmgr-0.96.9
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    46
    }
6f7a81934006 Imported vmailmgr-0.96.9
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    47
    if(++h2 == lenhash) h2 = 0;
6f7a81934006 Imported vmailmgr-0.96.9
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    48
  }
6f7a81934006 Imported vmailmgr-0.96.9
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    49
  return 0;
6f7a81934006 Imported vmailmgr-0.96.9
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    50
}
6f7a81934006 Imported vmailmgr-0.96.9
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    51
6f7a81934006 Imported vmailmgr-0.96.9
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    52
datum* cdb_reader::get(const mystring& key)
6f7a81934006 Imported vmailmgr-0.96.9
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    53
{
6f7a81934006 Imported vmailmgr-0.96.9
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    54
  if(failed)
6f7a81934006 Imported vmailmgr-0.96.9
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    55
    return 0;
2
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents: 0
diff changeset
    56
  uint32 datalen;
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents: 0
diff changeset
    57
  char* dataptr = seek(key, datalen);
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents: 0
diff changeset
    58
  if(!dataptr)
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents: 0
diff changeset
    59
    return 0;
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents: 0
diff changeset
    60
  return new datum(key, mystring(dataptr, datalen));
0
6f7a81934006 Imported vmailmgr-0.96.9
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    61
}