root/main/trunk/greenstone2/common-src/src/gdbmedit/gdbmset/gdbmset.cpp @ 22039

Revision 22039, 4.9 KB (checked in by davidb, 10 years ago)

Improved error reporting to GDBMedit utils

  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
Line 
1/**********************************************************************
2 *
3 * gdbmset -- add or replace a single value from the GDBM database
4 * Copyright (C) 1999  The New Zealand Digital Library Project
5 *
6 * A component of the Greenstone digital library software
7 * from the New Zealand Digital Library Project at the
8 * University of Waikato, New Zealand.
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 *
24 *********************************************************************/
25
26#ifdef __WIN32__
27#include "autoconf.h"
28#include "systems.h"
29#include "gdbmconst.h"
30#include "gdbm.h"
31
32#else
33#include <gdbm.h>
34#endif
35
36#include "gsdlconf.h"
37#include <stdlib.h>
38#include <cstring>
39
40#if defined(GSDL_USE_OBJECTSPACE)
41#include <ospace\std\iostream>
42#elif defined(GSDL_USE_IOS_H)
43#include <iostream.h>
44#else
45#include <iostream>
46#endif
47
48// use the standard namespace
49#if !defined (GSDL_NAMESPACE_BROKEN)
50#if defined(GSDL_USE_OBJECTSPACE)
51using namespace ospace::std;
52#else
53using namespace std;
54#endif
55#endif
56
57void
58print_usage (char *program_name)
59{
60  cerr << "usage: " << program_name << " <database_path> <key> [<value>] [append]" << endl;
61  cerr << "\t- if no value is given then the lexicon indicated by the key is removed" << endl;
62  cerr << "\t- if a value is given followed by 'append' then the value is " << endl;
63  cerr << "\t  added to the existing entry rather than overwriting it" << endl;
64  cerr << endl;
65}
66
67
68int main (int argc, char *argv[])
69{
70  // The block_size parameter  is  ignored unless the file is a new file.
71  // If it is less than 512, dbm will use the  stat  block size for the file system.
72  int block_size = 0;
73  GDBM_FILE dbf;
74  datum key;
75 
76  // sanity check
77  if ((argc < 3) || (argc>5)) {
78      print_usage (argv[0]);
79      exit (-1);
80  }
81 
82  // open the database
83#ifdef __WIN32__
84  // On Windows need to make sure the database is generated if it does not already exist
85  // GDBM_WRCREAT flag means: open database for read/write, create if necessary
86  // http://www.rt.com/man/gdbm.3.html is the Unix man page on gdbm_open
87  // http://trac.greenstone.org/changeset/928 - the 6th param of gdbm_open (only in the
88  // Windows version of the function) was set to 1 when using WRCREAT
89  // http://www.sfr-fresh.com/unix/misc/q-7.11.tar.gz:a/q-7.11/modules/gdbm/README-Gdbm
90  dbf = gdbm_open (argv[1], block_size, GDBM_WRCREAT, 00664, NULL, 1);
91#else
92  dbf = gdbm_open  (argv[1], block_size, GDBM_WRCREAT, 00664, NULL);
93  // dbf = gdbm_open  (argv[1], block_size, GDBM_WRITER, 00664, NULL);
94#endif
95  if (dbf == NULL)
96    {
97      cerr << argv[0] << ": couldn't open database connection to " << argv[1] << endl;
98      exit (-1);
99    }
100 
101  key.dsize = strlen(argv[2]);
102  key.dptr = argv[2];
103
104  if(argc == 5) {
105   
106    if (strcmp(argv[4],"append")==0) {
107      datum orig_content,concat_content;
108
109      //cerr << "Appending [" << argv[2] << "] to '" << argv[3] << "' (length " << strlen(argv[3]) << ")" << endl;
110      // get old value, then top up
111
112      orig_content = gdbm_fetch (dbf, key);
113
114      // append orig_content with argv[3]
115      concat_content.dsize = orig_content.dsize + strlen(argv[3]);
116      char* concat_data = new char[concat_content.dsize +1];//  make room for \0 at end
117      if (orig_content.dsize>0) {
118    strncpy(concat_data,orig_content.dptr,orig_content.dsize);
119    strcpy(&concat_data[orig_content.dsize],argv[3]); // ensures \0 at end
120      }
121      else {
122    // first time key has been used
123    strcpy(concat_data,argv[3]); // ensures \0 at end
124      }
125
126      concat_content.dptr = concat_data;
127      if(gdbm_store(dbf, key, concat_content, GDBM_REPLACE) != 0)
128        {
129          cerr << "failed to set [" << argv[2] << "] to '" << concat_data << "'" << endl;
130        }
131      delete [] concat_data;
132    }
133    else {
134      print_usage (argv[0]);
135      gdbm_close (dbf);
136      exit(-1);
137    }
138  }
139  else if (argc == 4) {
140      datum content;
141
142      //cerr << "Setting [" << argv[2] << "] to '" << argv[3] << "' (length " << strlen(argv[3]) << ")" << endl;
143      content.dsize = strlen(argv[3]);
144      content.dptr = argv[3];
145      if(gdbm_store(dbf, key, content, GDBM_REPLACE) != 0)
146        {
147          cerr << "failed to set [" << argv[2] << "] to '" << argv[3] << "'" << endl;
148        }
149    }
150  else
151    {
152      if(gdbm_delete(dbf, key) != 0)
153        {
154          cerr << "failed to remove [" << argv[2] << "]" << endl;
155        }
156    }
157  gdbm_close (dbf);
158
159  return 0;
160}
Note: See TracBrowser for help on using the browser.