lib/vpwtable/gdbm_write.cc
author "Tomas Zeman <tzeman@volny.cz>"
Sun, 20 Jan 2008 00:22:09 +0100
changeset 2 b3afb9f1e801
permissions -rw-r--r--
Imported vmailmgr-0.97
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
     1
// Copyright (C) 1999,2000 Bruce Guenter <bruceg@em.ca>
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
     2
//
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
     3
// This program is free software; you can redistribute it and/or modify
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
     4
// it under the terms of the GNU General Public License as published by
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
     5
// the Free Software Foundation; either version 2 of the License, or
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
     6
// (at your option) any later version.
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
     7
//
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
     8
// This program is distributed in the hope that it will be useful,
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
     9
// but WITHOUT ANY WARRANTY; without even the implied warranty of
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    10
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    11
// GNU General Public License for more details.
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    12
//
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    13
// You should have received a copy of the GNU General Public License
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    14
// along with this program; if not, write to the Free Software
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    15
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    16
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    17
#include <config.h>
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    18
#include <errno.h>
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    19
#include "vpwtable.h"
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    20
#include <gdbm.h>
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    21
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    22
class gdbm_vpwtable_writer : public vpwtable_writer
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    23
{
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    24
private:
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    25
  const mystring& tmpname;
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    26
  const mystring& destname;
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    27
  GDBM_FILE out;
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    28
  bool opened;
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    29
public:
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    30
  gdbm_vpwtable_writer(const mystring& filename);
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    31
  ~gdbm_vpwtable_writer();
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    32
  bool operator!() const;
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    33
  bool put(const vpwentry& vpw);
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    34
  bool end();
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    35
  bool abort();
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    36
};
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    37
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    38
vpwtable_writer* vpwtable::start_write() const
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    39
{
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    40
  return new gdbm_vpwtable_writer(filename);
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    41
}
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    42
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    43
gdbm_vpwtable_writer::gdbm_vpwtable_writer(const mystring& filename)
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    44
  : tmpname(filename + ".tmp"), destname(filename),
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    45
    out(gdbm_open((char*)filename.c_str(), 0, GDBM_NEWDB|GDBM_FAST, 0600, 0)),
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    46
    opened(true)
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    47
{
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    48
}
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    49
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    50
gdbm_vpwtable_writer::~gdbm_vpwtable_writer()
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    51
{
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    52
  end();
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    53
}
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    54
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    55
bool gdbm_vpwtable_writer::operator!() const
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    56
{
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    57
  return opened;
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    58
}
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    59
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    60
bool gdbm_vpwtable_writer::put(const vpwentry& vpw)
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    61
{
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    62
  mystring name = vpw->name.lower();
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    63
  datum key = { (char*)name.c_str(), name.length() };
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    64
  mystring binary = vpw->to_record();
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    65
  datum data = { (char*)binary.c_str(), binary.length() };
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    66
  return gdbm_store(out, key, data, GDBM_INSERT) == 0;
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    67
}
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    68
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    69
bool gdbm_vpwtable_writer::end() 
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    70
{
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    71
  if(!opened)
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    72
    return false;
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    73
  gdbm_sync(out);
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    74
  opened = false;
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    75
  return gdbm_close(out) == 0 &&
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    76
    rename(tmpname.c_str(), destname.c_str()) == 0;
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    77
}
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    78
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    79
bool gdbm_vpwtable_writer::abort()
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    80
{
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    81
  if(!opened)
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    82
    return false;
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    83
  opened = false;
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    84
  gdbm_close(out);
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    85
  return unlink(tmpname.c_str()) == 0;
b3afb9f1e801 Imported vmailmgr-0.97
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    86
}