From bf7997b65c7887d2acda95f5201d818a19d81711 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Tue, 9 Jun 1998 15:16:55 +0000 Subject: Update. 1998-06-09 Ulrich Drepper * sysdeps/unix/sysv/linux/netinet/ip.h (struct ip_options): Define __data member only for gcc. Reported by ak@muc.de. * misc/mntent.h: Undo last patch. * sysdeps/unix/sysv/linux/fstatvfs.c (fstatvfs): Undo last patch. * misc/tst/mntent.c: Adjust code for this change. * io/fts.c: Updated from a slightly more recent BSD version. * io/fts.h: Likewise. * libc.map: Add __libc_stack_end. * db2/Makefile (routines): Add lock_region. * db2/config.h: Update from db-2.4.14. * db2/db.h: Likewise. * db2/db_185.h: Likewise. * db2/db_int.h: Likewise. * db2/bt_close.c: Likewise. * db2/bt_compare.c: Likewise. * db2/bt_conv.c: Likewise. * db2/bt_cursor.c: Likewise. * db2/bt_delete.c: Likewise. * db2/bt_open.c: Likewise. * db2/bt_page.c: Likewise. * db2/bt_put.c: Likewise. * db2/bt_rec.c: Likewise. * db2/bt_recno.c: Likewise. * db2/bt_rsearch.c: Likewise. * db2/bt_search.c: Likewise. * db2/bt_split.c: Likewise. * db2/bt_stat.c: Likewise. * db2/btree.src: Likewise. * db2/btree_auto.c: Likewise. * db2/getlong.c: Likewise. * db2/db_appinit.c: Likewise. * db2/db_apprec.c: Likewise. * db2/db_byteorder.c: Likewise. * db2/db_err.c: Likewise. * db2/db_log2.c: Likewise. * db2/db_region.c: Likewise. * db2/db_salloc.c: Likewise. * db2/db_shash.c: Likewise. * db2/db.c: Likewise. * db2/db.src: Likewise. * db2/db_auto.c: Likewise. * db2/db_conv.c: Likewise. * db2/db_dispatch.c: Likewise. * db2/db_dup.c: Likewise. * db2/db_overflow.c: Likewise. * db2/db_pr.c: Likewise. * db2/db_rec.c: Likewise. * db2/db_ret.c: Likewise. * db2/db_thread.c: Likewise. * db2/db185.c: Likewise. * db2/db185_int.h: Likewise. * db2/dbm.c: Likewise. * db2/hash.c: Likewise. * db2/hash.src: Likewise. * db2/hash_auto.c: Likewise. * db2/hash_conv.c: Likewise. * db2/hash_debug.c: Likewise. * db2/hash_dup.c: Likewise. * db2/hash_func.c: Likewise. * db2/hash_page.c: Likewise. * db2/hash_rec.c: Likewise. * db2/hash_stat.c: Likewise. * db2/btree.h: Likewise. * db2/btree_ext.h: Likewise. * db2/clib_ext.h: Likewise. * db2/common_ext.h: Likewise. * db2/cxx_int.h: Likewise. * db2/db.h.src: Likewise. * db2/db_185.h.src: Likewise. * db2/db_am.h: Likewise. * db2/db_auto.h: Likewise. * db2/db_cxx.h: Likewise. * db2/db_dispatch.h: Likewise. * db2/db_ext.h: Likewise. * db2/db_int.h.src: Likewise. * db2/db_page.h: Likewise. * db2/db_shash.h: Likewise. * db2/db_swap.h: Likewise. * db2/hash.h: Likewise. * db2/hash_ext.h: Likewise. * db2/lock.h: Likewise. * db2/lock_ext.h: Likewise. * db2/log.h: Likewise. * db2/log_ext.h: Likewise. * db2/mp.h: Likewise. * db2/mp_ext.h: Likewise. * db2/mutex_ext.h: Likewise. * db2/os_ext.h: Likewise. * db2/os_func.h: Likewise. * db2/queue.h: Likewise. * db2/shqueue.h: Likewise. * db2/txn.h: Likewise. * db2/lock.c: Likewise. * db2/lock_conflict.c: Likewise. * db2/lock_deadlock.c: Likewise. * db2/lock_region.c: Likewise. * db2/lock_util.c: Likewise. * db2/log.c: Likewise. * db2/log.src: Likewise. * db2/log_archive.c: Likewise. * db2/log_auto.c: Likewise. * db2/log_compare.c: Likewise. * db2/log_findckp.c: Likewise. * db2/log_get.c: Likewise. * db2/log_put.c: Likewise. * db2/log_rec.c: Likewise. * db2/log_register.c: Likewise. * db2/mp_bh.c: Likewise. * db2/mp_fget.c: Likewise. * db2/mp_fopen.c: Likewise. * db2/mp_fput.c: Likewise. * db2/mp_fset.c: Likewise. * db2/mp_open.c: Likewise. * db2/mp_pr.c: Likewise. * db2/mp_region.c: Likewise. * db2/mp_sync.c: Likewise. * db2/68020.gcc: Likewise. * db2/mutex.c: Likewise. * db2/parisc.gcc: Likewise. * db2/parisc.hp: Likewise. * db2/sco.cc: Likewise. * db2/os_abs.c: Likewise. * db2/os_alloc.c: Likewise. * db2/os_config.c: Likewise. * db2/os_dir.c: Likewise. * db2/os_fid.c: Likewise. * db2/os_fsync.c: Likewise. * db2/os_map.c: Likewise. * db2/os_oflags.c: Likewise. * db2/os_open.c: Likewise. * db2/os_rpath.c: Likewise. * db2/os_rw.c: Likewise. * db2/os_seek.c: Likewise. * db2/os_sleep.c: Likewise. * db2/os_spin.c: Likewise. * db2/os_stat.c: Likewise. * db2/os_unlink.c: Likewise. * db2/db_archive.c: Likewise. * db2/db_checkpoint.c: Likewise. * db2/db_deadlock.c: Likewise. * db2/db_dump.c: Likewise. * db2/db_dump185.c: Likewise. * db2/db_load.c: Likewise. * db2/db_printlog.c: Likewise. * db2/db_recover.c: Likewise. * db2/db_stat.c: Likewise. * db2/txn.c: Likewise. * db2/txn.src: Likewise. * db2/txn_auto.c: Likewise. * db2/txn_rec.c: Likewise. * elf/rtld.c: Move definition of __libc_stack_end to ... * sysdeps/generic/dl-sysdep.h: ...here. * sysdeps/unix/sysv/linux/fstatvfs.c: Handle nodiratime option. * sysdeps/unix/sysv/linux/bits/statvfs.h: Define ST_NODIRATIME. * sysdeps/unix/sysv/linux/sys/mount.h: Define MS_NODIRATIME. 1998-06-08 21:44 Ulrich Drepper * sysdeps/unix/sysv/linux/fstatvfs.c: Handle constant option string from mntent correctly. 1998-06-06 Andreas Jaeger * sunrpc/Makefile (generated): Correct typo. 1998-06-04 Philip Blundell * elf/elf.h (EM_ARM, et al.): New definitions. * sysdeps/arm/dl-machine.h: Update for new draft ARM ELF ABI. --- db2/progs/db_load/db_load.c | 193 +++++++++++++++++++++++++------------------- 1 file changed, 112 insertions(+), 81 deletions(-) (limited to 'db2/progs/db_load/db_load.c') diff --git a/db2/progs/db_load/db_load.c b/db2/progs/db_load/db_load.c index afa5730c25..5ac17753f5 100644 --- a/db2/progs/db_load/db_load.c +++ b/db2/progs/db_load/db_load.c @@ -1,7 +1,7 @@ /*- * See the file LICENSE for redistribution information. * - * Copyright (c) 1996, 1997 + * Copyright (c) 1996, 1997, 1998 * Sleepycat Software. All rights reserved. */ @@ -9,14 +9,13 @@ #ifndef lint static const char copyright[] = -"@(#) Copyright (c) 1997\n\ +"@(#) Copyright (c) 1996, 1997, 1998\n\ Sleepycat Software Inc. All rights reserved.\n"; -static const char sccsid[] = "@(#)db_load.c 10.15 (Sleepycat) 12/29/97"; +static const char sccsid[] = "@(#)db_load.c 10.20 (Sleepycat) 6/2/98"; #endif #ifndef NO_SYSTEM_INCLUDES #include -#include #include #include @@ -27,6 +26,8 @@ static const char sccsid[] = "@(#)db_load.c 10.15 (Sleepycat) 12/29/97"; #endif #include "db_int.h" +#include "db_page.h" +#include "db_am.h" #include "clib_ext.h" void badnum __P((void)); @@ -55,7 +56,8 @@ main(argc, argv) DB_ENV *dbenv; DB_INFO dbinfo; db_recno_t recno; - int ch, no_header, pflag; + u_int32_t db_nooverwrite; + int ch, checkprint, existed, no_header; char **clist, **clp, *home; /* Allocate enough room for configuration arguments. */ @@ -63,9 +65,10 @@ main(argc, argv) err(1, NULL); home = NULL; - no_header = 0; + db_nooverwrite = 0; + existed = checkprint = no_header = 0; argtype = dbtype = DB_UNKNOWN; - while ((ch = getopt(argc, argv, "c:f:h:Tt:")) != EOF) + while ((ch = getopt(argc, argv, "c:f:h:nTt:")) != EOF) switch (ch) { case 'c': *clp++ = optarg; @@ -77,8 +80,11 @@ main(argc, argv) case 'h': home = optarg; break; + case 'n': + db_nooverwrite = DB_NOOVERWRITE; + break; case 'T': - no_header = pflag = 1; + no_header = checkprint = 1; break; case 't': if (strcmp(optarg, "btree") == 0) { @@ -105,18 +111,18 @@ main(argc, argv) if (argc != 1) usage(); - /* Initialize the environment. */ - dbenv = db_init(home); - memset(&dbinfo, 0, sizeof(DB_INFO)); + /* Initialize the environment if the user specified one. */ + dbenv = home == NULL ? NULL : db_init(home); /* * Read the header. If there isn't any header, we're expecting flat - * text, set the pflag appropriately. + * text, set the checkprint flag appropriately. */ + memset(&dbinfo, 0, sizeof(DB_INFO)); if (no_header) dbtype = argtype; else { - rheader(&dbtype, &pflag, &dbinfo); + rheader(&dbtype, &checkprint, &dbinfo); if (argtype != DB_UNKNOWN) { /* Conversion to/from recno is prohibited. */ if ((dbtype == DB_RECNO && argtype != DB_RECNO) || @@ -133,17 +139,20 @@ main(argc, argv) configure(&dbinfo, clist); /* Open the DB file. */ - if ((errno = db_open(argv[0], dbtype, DB_CREATE | DB_TRUNCATE, - S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH, - dbenv, &dbinfo, &dbp)) != 0) + if ((errno = db_open(argv[0], dbtype, DB_CREATE, + __db_omode("rwrwrw"), dbenv, &dbinfo, &dbp)) != 0) err(1, "%s", argv[0]); /* Initialize the key/data pair. */ memset(&key, 0, sizeof(DBT)); - if ((key.data = (void *)malloc(key.ulen = 1024)) == NULL) { - errno = ENOMEM; - err(1, NULL); - } + if (dbtype == DB_RECNO) { + key.data = &recno; + key.size = sizeof(recno); + } else + if ((key.data = (void *)malloc(key.ulen = 1024)) == NULL) { + errno = ENOMEM; + err(1, NULL); + } memset(&data, 0, sizeof(DBT)); if ((data.data = (void *)malloc(data.ulen = 1024)) == NULL) { errno = ENOMEM; @@ -151,22 +160,17 @@ main(argc, argv) } /* Get each key/data pair and add them to the database. */ - if (dbtype == DB_RECNO) { - key.data = &recno; - key.size = sizeof(recno); - for (recno = 1;; ++recno) { - if (pflag) { + for (recno = 1;; ++recno) { + if (dbtype == DB_RECNO) + if (checkprint) { if (dbt_rprint(&data)) break; - } else + } else { if (dbt_rdump(&data)) break; - if ((errno = dbp->put(dbp, NULL, &key, &data, 0)) != 0) - err(1, "%s", argv[0]); - } - } else - for (;;) { - if (pflag) { + } + else + if (checkprint) { if (dbt_rprint(&key)) break; if (dbt_rprint(&data)) @@ -177,13 +181,26 @@ main(argc, argv) if (dbt_rdump(&data)) fmt: err(1, "odd number of key/data pairs"); } - if ((errno = dbp->put(dbp, NULL, &key, &data, 0)) != 0) - err(1, "%s", argv[0]); + switch (errno = + dbp->put(dbp, NULL, &key, &data, db_nooverwrite)) { + case 0: + break; + case DB_KEYEXIST: + existed = 1; + warnx("%s: line %d: key already exists, not loaded:", + argv[0], + dbtype == DB_RECNO ? recno : recno * 2 - 1); + (void)__db_prdbt(&key, checkprint, stderr); + break; + default: + err(1, "%s", argv[0]); + /* NOTREACHED */ } + } if ((errno = dbp->close(dbp, 0)) != 0) err(1, "%s", argv[0]); - return (0); + return (existed ? 1 : 0); } /* @@ -200,13 +217,26 @@ db_init(home) errno = ENOMEM; err(1, NULL); } - dbenv->db_errfile = stderr; - dbenv->db_errpfx = progname; - if ((errno = - db_appinit(home, NULL, dbenv, DB_CREATE | DB_USE_ENVIRON)) != 0) - err(1, "db_appinit"); - return (dbenv); + /* + * The database may be live, try and use the shared regions. + * + * If it works, we're done. Set the error output options so that + * future errors are correctly reported. + */ + if ((errno = db_appinit(home, NULL, dbenv, DB_INIT_LOCK | + DB_INIT_LOG | DB_INIT_MPOOL | DB_INIT_TXN | DB_USE_ENVIRON)) == 0) { + dbenv->db_errfile = stderr; + dbenv->db_errpfx = progname; + return (dbenv); + } + + /* + * If the db_appinit fails, assume the database isn't live, and don't + * bother with an environment. + */ + free(dbenv); + return (NULL); } #define FLAG(name, value, keyword, flag) \ @@ -279,16 +309,16 @@ configure(dbinfop, clp) * Read the header message. */ void -rheader(dbtypep, pflagp, dbinfop) +rheader(dbtypep, checkprintp, dbinfop) DBTYPE *dbtypep; - int *pflagp; + int *checkprintp; DB_INFO *dbinfop; { long lineno, val; char name[256], value[256]; *dbtypep = DB_UNKNOWN; - *pflagp = 0; + *checkprintp = 0; for (lineno = 1;; ++lineno) { /* If we don't see the expected information, it's an error. */ @@ -301,11 +331,11 @@ rheader(dbtypep, pflagp, dbinfop) if (strcmp(name, "format") == 0) { if (strcmp(value, "bytevalue") == 0) { - *pflagp = 0; + *checkprintp = 0; continue; } if (strcmp(value, "print") == 0) { - *pflagp = 1; + *checkprintp = 1; continue; } errx(1, "line %d: unknown format", lineno); @@ -389,39 +419,6 @@ dbt_rprint(dbtp) return (0); } -/* - * digitize -- - * Convert a character to an integer. - */ -int -digitize(c) - int c; -{ - switch (c) { /* Don't depend on ASCII ordering. */ - case '0': return (0); - case '1': return (1); - case '2': return (2); - case '3': return (3); - case '4': return (4); - case '5': return (5); - case '6': return (6); - case '7': return (7); - case '8': return (8); - case '9': return (9); - case 'a': return (10); - case 'b': return (11); - case 'c': return (12); - case 'd': return (13); - case 'e': return (14); - case 'f': return (15); - } - - err(1, "unexpected hexadecimal value"); - /* NOTREACHED */ - - return (0); -} - /* * dbt_rdump -- * Read a byte dump line into a DBT structure. @@ -458,6 +455,39 @@ dbt_rdump(dbtp) return (0); } +/* + * digitize -- + * Convert a character to an integer. + */ +int +digitize(c) + int c; +{ + switch (c) { /* Don't depend on ASCII ordering. */ + case '0': return (0); + case '1': return (1); + case '2': return (2); + case '3': return (3); + case '4': return (4); + case '5': return (5); + case '6': return (6); + case '7': return (7); + case '8': return (8); + case '9': return (9); + case 'a': return (10); + case 'b': return (11); + case 'c': return (12); + case 'd': return (13); + case 'e': return (14); + case 'f': return (15); + } + + err(1, "unexpected hexadecimal value"); + /* NOTREACHED */ + + return (0); +} + /* * badnum -- * Display the bad number message. @@ -475,7 +505,8 @@ badnum() void usage() { - (void)fprintf(stderr, -"usage: db_load [-T]\n\t[-c name=value] [-f file] [-h home] [-t btree | hash] db_file\n"); + (void)fprintf(stderr, "%s\n\t%s\n", + "usage: db_load [-nT]", + "[-c name=value] [-f file] [-h home] [-t btree | hash | recno] db_file"); exit(1); } -- cgit 1.4.1