summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorGreg Stein <gstein@apache.org>2000-11-26 15:27:33 +0000
committerGreg Stein <gstein@apache.org>2000-11-26 15:27:33 +0000
commitd9f25a3c133f7de85d8cbdacdbf0e14d39a4ed4d (patch)
tree85dc68f5c40899bf74ab6b77d61df30cb8157af5 /test
parent5ab185a99767d89d56446ff518a5c82292867ae9 (diff)
downloadhttpd-d9f25a3c133f7de85d8cbdacdbf0e14d39a4ed4d.tar.gz
*) Put lib/aputil/ into the INCLUDES path
*) add a Makefile.in to test/ to help with building test programs (these are not part of the build; just manual compiles right now) *) add test/dbu.c as a quick test of apu_dbm [ dbu.c originally came from the SDBM package ] git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@87082 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'test')
-rw-r--r--test/Makefile.in15
-rw-r--r--test/dbu.c321
2 files changed, 336 insertions, 0 deletions
diff --git a/test/Makefile.in b/test/Makefile.in
new file mode 100644
index 0000000000..e7770f7fbb
--- /dev/null
+++ b/test/Makefile.in
@@ -0,0 +1,15 @@
+
+PROGRAMS = dbu
+targets = $(PROGRAMS)
+
+PROGRAM_LDADD = $(EXTRA_LDFLAGS) $(PROGRAM_DEPENDENCIES) $(EXTRA_LIBS)
+PROGRAM_DEPENDENCIES = ../ap/libap.la \
+ ../lib/aputil/libaputil.la \
+ ../lib/sdbm/libsdbm.la \
+ ../lib/apr/$(LIBPRE)apr.a
+
+include $(top_srcdir)/build/rules.mk
+
+dbu_OBJECTS = dbu.lo
+dbu: $(dbu_OBJECTS)
+ $(LINK) $(dbu_OBJECTS) $(PROGRAM_LDADD)
diff --git a/test/dbu.c b/test/dbu.c
new file mode 100644
index 0000000000..167454d1db
--- /dev/null
+++ b/test/dbu.c
@@ -0,0 +1,321 @@
+/* ====================================================================
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 2000 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Apache" and "Apache Software Foundation" must
+ * not be used to endorse or promote products derived from this
+ * software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * nor may "Apache" appear in their name, without prior written
+ * permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ * This file came from the SDBM package (written by oz@nexus.yorku.ca).
+ * That package was under public domain. This file has been ported to
+ * APR, updated to ANSI C and other, newer idioms, and added to the Apache
+ * codebase under the above copyright and license.
+ */
+
+#include "apr.h"
+#include "apr_general.h"
+#include "apr_pools.h"
+#include "apr_errno.h"
+#include "apr_getopt.h"
+#include "apr_time.h"
+
+#if APR_HAVE_STDIO_H
+#include <stdio.h>
+#endif
+#include <unistd.h>
+#include <stdlib.h> /* for atexit(), malloc() */
+#include <string.h>
+
+#include "apu_dbm.h"
+
+static const char *progname;
+static int rflag;
+static const char *usage = "%s [-R] cat | look |... dbmname";
+
+#define DERROR 0
+#define DLOOK 1
+#define DINSERT 2
+#define DDELETE 3
+#define DCAT 4
+#define DBUILD 5
+#define DPRESS 6
+#define DCREAT 7
+
+#define LINEMAX 8192
+
+typedef struct {
+ const char *sname;
+ int scode;
+ int flags;
+} cmd;
+
+static const cmd cmds[] = {
+
+ { "fetch", DLOOK, APU_DBM_READONLY, },
+ { "get", DLOOK, APU_DBM_READONLY, },
+ { "look", DLOOK, APU_DBM_READONLY, },
+ { "add", DINSERT, APU_DBM_READWRITE, },
+ { "insert", DINSERT, APU_DBM_READWRITE, },
+ { "store", DINSERT, APU_DBM_READWRITE, },
+ { "delete", DDELETE, APU_DBM_READWRITE, },
+ { "remove", DDELETE, APU_DBM_READWRITE, },
+ { "dump", DCAT, APU_DBM_READONLY, },
+ { "list", DCAT, APU_DBM_READONLY, },
+ { "cat", DCAT, APU_DBM_READONLY, },
+#if 0
+ { "creat", DCREAT, APU_DBM_RWCREATE | O_TRUNC, },
+ { "new", DCREAT, APU_DBM_RWCREATE | O_TRUNC, },
+#endif
+ { "build", DBUILD, APU_DBM_RWCREATE, },
+ { "squash", DPRESS, APU_DBM_READWRITE, },
+ { "compact", DPRESS, APU_DBM_READWRITE, },
+ { "compress", DPRESS, APU_DBM_READWRITE, },
+};
+
+#define CTABSIZ (sizeof (cmds)/sizeof (cmd))
+
+static void doit(const cmd *act, const char *file, apr_pool_t *pool);
+static void badk(const char *word);
+static const cmd *parse(const char *str);
+static void prdatum(FILE *stream, apu_datum_t d);
+static void oops(const char *s1, const char *s2);
+
+
+int main(int argc, const char * const * argv)
+{
+ apr_pool_t *pool;
+ const cmd *act;
+ apr_getopt_t *os;
+ char optch;
+ const char *optarg;
+
+ (void) apr_initialize();
+ atexit(apr_terminate);
+
+ apr_create_pool(&pool, NULL);
+
+ (void) apr_initopt(&os, pool, argc, argv);
+
+ progname = argv[0];
+
+ while (apr_getopt(os, "R", &optch, &optarg) == APR_SUCCESS)
+ switch (optch) {
+ case 'R': /* raw processing */
+ rflag++;
+ break;
+
+ default:
+ oops("(unknown option) usage: %s", usage);
+ break;
+ }
+
+ if (os->ind + 2 > argc)
+ oops("usage: %s", usage);
+
+ if ((act = parse(argv[os->ind])) == NULL)
+ badk(argv[os->ind]);
+ os->ind++;
+ doit(act, argv[os->ind], pool);
+ return 0;
+}
+
+static void doit(const cmd *act, const char *file, apr_pool_t *pool)
+{
+ apr_status_t rv;
+ apu_datum_t key;
+ apu_datum_t val;
+ apu_dbm_t *db;
+ char *op;
+ int n;
+ char *line;
+#ifdef TIME
+ long start;
+ extern long time();
+#endif
+
+ if (apu_dbm_open(file, pool, act->flags, &db) != APR_SUCCESS)
+ oops("cannot open: %s", file);
+
+ if ((line = (char *) malloc(LINEMAX)) == NULL)
+ oops("%s: cannot get memory", "line alloc");
+
+ switch (act->scode) {
+
+ case DLOOK:
+ while (fgets(line, LINEMAX, stdin) != NULL) {
+ n = strlen(line) - 1;
+ line[n] = 0;
+ key.dptr = line;
+ key.dsize = n;
+ rv = apu_dbm_fetch(db, key, &val);
+ if (rv == APR_SUCCESS) {
+ prdatum(stdout, val);
+ putchar('\n');
+ continue;
+ }
+ prdatum(stderr, key);
+ fprintf(stderr, ": not found.\n");
+ }
+ break;
+ case DINSERT:
+ break;
+ case DDELETE:
+ while (fgets(line, LINEMAX, stdin) != NULL) {
+ n = strlen(line) - 1;
+ line[n] = 0;
+ key.dptr = line;
+ key.dsize = n;
+ if (apu_dbm_delete(db, key) != APR_SUCCESS) {
+ prdatum(stderr, key);
+ fprintf(stderr, ": not found.\n");
+ }
+ }
+ break;
+ case DCAT:
+ if (apu_dbm_firstkey(db, &key) != APR_SUCCESS)
+ oops("could not fetch first key: %s", file);
+
+ for (; key.dptr != 0; (void) apu_dbm_nextkey(db, &key)) {
+ prdatum(stdout, key);
+ putchar('\t');
+ (void) apu_dbm_fetch(db, key, &val);
+ prdatum(stdout, val);
+ putchar('\n');
+ }
+ break;
+ case DBUILD:
+#ifdef TIME
+ start = time(0);
+#endif
+ while (fgets(line, LINEMAX, stdin) != NULL) {
+ n = strlen(line) - 1;
+ line[n] = 0;
+ key.dptr = line;
+ if ((op = strchr(line, '\t')) != 0) {
+ key.dsize = op - line;
+ *op++ = 0;
+ val.dptr = op;
+ val.dsize = line + n - op;
+ }
+ else
+ oops("bad input: %s", line);
+
+ if (apu_dbm_store(db, key, val) != APR_SUCCESS) {
+ prdatum(stderr, key);
+ fprintf(stderr, ": ");
+ oops("store: %s", "failed");
+ }
+ }
+#ifdef TIME
+ printf("done: %d seconds.\n", time(0) - start);
+#endif
+ break;
+ case DPRESS:
+ break;
+ case DCREAT:
+ break;
+ }
+
+ apu_dbm_close(db);
+}
+
+static void badk(const char *word)
+{
+ int i;
+
+ if (progname)
+ fprintf(stderr, "%s: ", progname);
+ fprintf(stderr, "bad keywd %s. use one of\n", word);
+ for (i = 0; i < (int)CTABSIZ; i++)
+ fprintf(stderr, "%-8s%c", cmds[i].sname,
+ ((i + 1) % 6 == 0) ? '\n' : ' ');
+ fprintf(stderr, "\n");
+ exit(1);
+ /*NOTREACHED*/
+}
+
+static const cmd *parse(const char *str)
+{
+ int i = CTABSIZ;
+ const cmd *p;
+
+ for (p = cmds; i--; p++)
+ if (strcmp(p->sname, str) == 0)
+ return p;
+ return NULL;
+}
+
+static void prdatum(FILE *stream, apu_datum_t d)
+{
+ int c;
+ const char *p = d.dptr;
+ int n = d.dsize;
+
+ while (n--) {
+ c = *p++ & 0377;
+ if (c & 0200) {
+ fprintf(stream, "M-");
+ c &= 0177;
+ }
+ if (c == 0177 || c < ' ')
+ fprintf(stream, "^%c", (c == 0177) ? '?' : c + '@');
+ else
+ putc(c, stream);
+ }
+}
+
+static void oops(const char *s1, const char *s2)
+{
+ if (progname)
+ fprintf(stderr, "%s: ", progname);
+ fprintf(stderr, s1, s2);
+ if (errno > 0 && errno < sys_nerr)
+ fprintf(stderr, " (%s)", sys_errlist[errno]);
+ fprintf(stderr, "\n");
+ exit(1);
+}