⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 db_load.c

📁 这是linux下运行的mysql软件包,可用于linux 下安装 php + mysql + apach 的网络配置
💻 C
📖 第 1 页 / 共 2 页
字号:
/*- * See the file LICENSE for redistribution information. * * Copyright (c) 1996-2002 *	Sleepycat Software.  All rights reserved. */#include "db_config.h"#ifndef lintstatic const char copyright[] =    "Copyright (c) 1996-2002\nSleepycat Software Inc.  All rights reserved.\n";static const char revid[] =    "$Id: db_load.c,v 11.71 2002/08/08 03:50:36 bostic Exp $";#endif#ifndef NO_SYSTEM_INCLUDES#include <sys/types.h>#include <limits.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#endif#include "db_int.h"#include "dbinc/db_page.h"#include "dbinc/db_am.h"typedef struct {			/* XXX: Globals. */	const char *progname;		/* Program name. */	char	*hdrbuf;		/* Input file header. */	u_long	lineno;			/* Input file line number. */	u_long	origline;		/* Original file line number. */	int	endodata;		/* Reached the end of a database. */	int	endofile;		/* Reached the end of the input. */	int	version;		/* Input version. */	char	*home;			/* Env home. */	char	*passwd;		/* Env passwd. */	int	private;		/* Private env. */	u_int32_t cache;		/* Env cache size. */} LDG;void	badend __P((DB_ENV *));void	badnum __P((DB_ENV *));int	configure __P((DB_ENV *, DB *, char **, char **, int *));int	convprintable __P((DB_ENV *, char *, char **));int	db_init __P((DB_ENV *, char *, u_int32_t, int *));int	dbt_rdump __P((DB_ENV *, DBT *));int	dbt_rprint __P((DB_ENV *, DBT *));int	dbt_rrecno __P((DB_ENV *, DBT *, int));int	digitize __P((DB_ENV *, int, int *));int	env_create __P((DB_ENV **, LDG *));int	load __P((DB_ENV *, char *, DBTYPE, char **, u_int, LDG *, int *));int	main __P((int, char *[]));int	rheader __P((DB_ENV *, DB *, DBTYPE *, char **, int *, int *));int	usage __P((void));int	version_check __P((const char *));#define	G(f)	((LDG *)dbenv->app_private)->f					/* Flags to the load function. */#define	LDF_NOHEADER	0x01		/* No dump header. */#define	LDF_NOOVERWRITE	0x02		/* Don't overwrite existing rows. */#define	LDF_PASSWORD	0x04		/* Encrypt created databases. */intmain(argc, argv)	int argc;	char *argv[];{	extern char *optarg;	extern int optind;	DBTYPE dbtype;	DB_ENV	*dbenv;	LDG ldg;	u_int32_t ldf;	int ch, existed, exitval, ret;	char **clist, **clp;	ldg.progname = "db_load";	ldg.lineno = 0;	ldg.endodata = ldg.endofile = 0;	ldg.version = 1;	ldg.cache = MEGABYTE;	ldg.hdrbuf = NULL;	ldg.home = NULL;	ldg.passwd = NULL;	if ((ret = version_check(ldg.progname)) != 0)		return (ret);	ldf = 0;	exitval = 0;	dbtype = DB_UNKNOWN;	/* Allocate enough room for configuration arguments. */	if ((clp = clist = (char **)calloc(argc + 1, sizeof(char *))) == NULL) {		fprintf(stderr, "%s: %s\n", ldg.progname, strerror(ENOMEM));		return (EXIT_FAILURE);	}	while ((ch = getopt(argc, argv, "c:f:h:nP:Tt:V")) != EOF)		switch (ch) {		case 'c':			*clp++ = optarg;			break;		case 'f':			if (freopen(optarg, "r", stdin) == NULL) {				fprintf(stderr, "%s: %s: reopen: %s\n",				    ldg.progname, optarg, strerror(errno));				return (EXIT_FAILURE);			}			break;		case 'h':			ldg.home = optarg;			break;		case 'n':			ldf |= LDF_NOOVERWRITE;			break;		case 'P':			ldg.passwd = strdup(optarg);			memset(optarg, 0, strlen(optarg));			if (ldg.passwd == NULL) {				fprintf(stderr, "%s: strdup: %s\n",				    ldg.progname, strerror(errno));				return (EXIT_FAILURE);			}			ldf |= LDF_PASSWORD;			break;		case 'T':			ldf |= LDF_NOHEADER;			break;		case 't':			if (strcmp(optarg, "btree") == 0) {				dbtype = DB_BTREE;				break;			}			if (strcmp(optarg, "hash") == 0) {				dbtype = DB_HASH;				break;			}			if (strcmp(optarg, "recno") == 0) {				dbtype = DB_RECNO;				break;			}			if (strcmp(optarg, "queue") == 0) {				dbtype = DB_QUEUE;				break;			}			return (usage());		case 'V':			printf("%s\n", db_version(NULL, NULL, NULL));			return (EXIT_SUCCESS);		case '?':		default:			return (usage());		}	argc -= optind;	argv += optind;	if (argc != 1)		return (usage());	/* Handle possible interruptions. */	__db_util_siginit();	/*	 * Create an environment object initialized for error reporting, and	 * then open it.	 */	if (env_create(&dbenv, &ldg) != 0)		goto shutdown;	while (!ldg.endofile)		if (load(dbenv, argv[0], dbtype, clist, ldf,		    &ldg, &existed) != 0)			goto shutdown;	if (0) {shutdown:	exitval = 1;	}	if ((ret = dbenv->close(dbenv, 0)) != 0) {		exitval = 1;		fprintf(stderr,		    "%s: dbenv->close: %s\n", ldg.progname, db_strerror(ret));	}	/* Resend any caught signal. */	__db_util_sigresend();	free(clist);	/*	 * Return 0 on success, 1 if keys existed already, and 2 on failure.	 *	 * Technically, this is wrong, because exit of anything other than	 * 0 is implementation-defined by the ANSI C standard.  I don't see	 * any good solutions that don't involve API changes.	 */	return (exitval == 0 ? (existed == 0 ? 0 : 1) : 2);}/* * load -- *	Load a database. */intload(dbenv, name, argtype, clist, flags, ldg, existedp)	DB_ENV *dbenv;	char *name, **clist;	DBTYPE argtype;	u_int flags;	LDG *ldg;	int *existedp;{	DB *dbp;	DBT key, rkey, data, *readp, *writep;	DBTYPE dbtype;	DB_TXN *ctxn, *txn;	db_recno_t recno, datarecno;	u_int32_t put_flags;	int ascii_recno, checkprint, hexkeys, keyflag, keys, resize, ret, rval;	char *subdb;	*existedp = 0;	put_flags = LF_ISSET(LDF_NOOVERWRITE) ? DB_NOOVERWRITE : 0;	G(endodata) = 0;	subdb = NULL;	ctxn = txn = NULL;	memset(&key, 0, sizeof(DBT));	memset(&data, 0, sizeof(DBT));	memset(&rkey, 0, sizeof(DBT));retry_db:	/* Create the DB object. */	if ((ret = db_create(&dbp, dbenv, 0)) != 0) {		dbenv->err(dbenv, ret, "db_create");		goto err;	}	dbtype = DB_UNKNOWN;	keys = -1;	hexkeys = -1;	keyflag = -1;	/* Read the header -- if there's no header, we expect flat text. */	if (LF_ISSET(LDF_NOHEADER)) {		checkprint = 1;		dbtype = argtype;	} else {		if (rheader(dbenv,		    dbp, &dbtype, &subdb, &checkprint, &keys) != 0)			goto err;		if (G(endofile))			goto done;	}	/*	 * Apply command-line configuration changes.  (We apply command-line	 * configuration changes to all databases that are loaded, e.g., all	 * subdatabases.)	 */	if (configure(dbenv, dbp, clist, &subdb, &keyflag))		goto err;	if (keys != 1) {		if (keyflag == 1) {			dbp->err(dbp, EINVAL, "No keys specified in file");			goto err;		}	}	else if (keyflag == 0) {		dbp->err(dbp, EINVAL, "Keys specified in file");		goto err;	}	else		keyflag = 1;	if (dbtype == DB_BTREE || dbtype == DB_HASH) {		if (keyflag == 0)			dbp->err(dbp,			    EINVAL, "Btree and Hash must specify keys");		else			keyflag = 1;	}	if (argtype != DB_UNKNOWN) {		if (dbtype == DB_RECNO || dbtype == DB_QUEUE)			if (keyflag != 1 && argtype != DB_RECNO &&			    argtype != DB_QUEUE) {				dbenv->errx(dbenv,			   "improper database type conversion specified");				goto err;			}		dbtype = argtype;	}	if (dbtype == DB_UNKNOWN) {		dbenv->errx(dbenv, "no database type specified");		goto err;	}	if (keyflag == -1)		keyflag = 0;	/*	 * Recno keys have only been printed in hexadecimal starting	 * with db_dump format version 3 (DB 3.2).	 *	 * !!!	 * Note that version is set in rheader(), which must be called before	 * this assignment.	 */	hexkeys = (G(version) >= 3 && keyflag == 1 && checkprint == 0);	if (keyflag == 1 && (dbtype == DB_RECNO || dbtype == DB_QUEUE))		ascii_recno = 1;	else		ascii_recno = 0;	/* If configured with a password, encrypt databases we create. */	if (LF_ISSET(LDF_PASSWORD) &&	    (ret = dbp->set_flags(dbp, DB_ENCRYPT)) != 0) {		dbp->err(dbp, ret, "DB->set_flags: DB_ENCRYPT");		goto err;	}	/* Open the DB file. */	if ((ret = dbp->open(dbp, NULL, name, subdb, dbtype,	    DB_CREATE | (TXN_ON(dbenv) ? DB_AUTO_COMMIT : 0),	    __db_omode("rwrwrw"))) != 0) {		dbp->err(dbp, ret, "DB->open: %s", name);		goto err;	}	if (ldg->private != 0) {		if ((ret =		    __db_util_cache(dbenv, dbp, &ldg->cache, &resize)) != 0)			goto err;		if (resize) {			dbp->close(dbp, 0);			dbp = NULL;			dbenv->close(dbenv, 0);			if ((ret = env_create(&dbenv, ldg)) != 0)				goto err;			goto retry_db;		}	}	/* Initialize the key/data pair. */	readp = &key;	writep = &key;	if (dbtype == DB_RECNO || dbtype == DB_QUEUE) {		key.size = sizeof(recno);		if (keyflag) {			key.data = &datarecno;			if (checkprint) {				readp = &rkey;				goto key_data;			}		}		else			key.data = &recno;	} elsekey_data:	if ((readp->data =		    (void *)malloc(readp->ulen = 1024)) == NULL) {			dbenv->err(dbenv, ENOMEM, NULL);			goto err;		}	if ((data.data = (void *)malloc(data.ulen = 1024)) == NULL) {		dbenv->err(dbenv, ENOMEM, NULL);		goto err;	}	if (TXN_ON(dbenv) &&	    (ret = dbenv->txn_begin(dbenv, NULL, &txn, 0)) != 0)		goto err;	/* Get each key/data pair and add them to the database. */	for (recno = 1; !__db_util_interrupted(); ++recno) {		if (!keyflag)			if (checkprint) {				if (dbt_rprint(dbenv, &data))					goto err;			} else {				if (dbt_rdump(dbenv, &data))					goto err;			}		else			if (checkprint) {				if (dbt_rprint(dbenv, readp))					goto err;				if (!G(endodata) && dbt_rprint(dbenv, &data))					goto fmt;			} else {				if (ascii_recno) {					if (dbt_rrecno(dbenv, readp, hexkeys))						goto err;				} else					if (dbt_rdump(dbenv, readp))						goto err;				if (!G(endodata) && dbt_rdump(dbenv, &data)) {fmt:					dbenv->errx(dbenv,					    "odd number of key/data pairs");					goto err;				}			}		if (G(endodata))			break;		if (readp != writep) {			if (sscanf(readp->data, "%ud", &datarecno) != 1)				dbenv->errx(dbenv,				    "%s: non-integer key at line: %d",				    name, !keyflag ? recno : recno * 2 - 1);			if (datarecno == 0)				dbenv->errx(dbenv, "%s: zero key at line: %d",				    name,				    !keyflag ? recno : recno * 2 - 1);		}retry:		if (txn != NULL)			if ((ret = dbenv->txn_begin(dbenv, txn, &ctxn, 0)) != 0)				goto err;		switch (ret = dbp->put(dbp, ctxn, writep, &data, put_flags)) {		case 0:			if (ctxn != NULL) {				if ((ret =				    ctxn->commit(ctxn, DB_TXN_NOSYNC)) != 0)					goto err;				ctxn = NULL;			}			break;		case DB_KEYEXIST:			*existedp = 1;			dbenv->errx(dbenv,			    "%s: line %d: key already exists, not loaded:",			    name,			    !keyflag ? recno : recno * 2 - 1);			(void)__db_prdbt(&key, checkprint, 0, stderr,			    __db_verify_callback, 0, NULL);			break;		case DB_LOCK_DEADLOCK:			/* If we have a child txn, retry--else it's fatal. */			if (ctxn != NULL) {				if ((ret = ctxn->abort(ctxn)) != 0)					goto err;				ctxn = NULL;				goto retry;			}			/* FALLTHROUGH */		default:			dbenv->err(dbenv, ret, NULL);			if (ctxn != NULL) {				(void)ctxn->abort(ctxn);				ctxn = NULL;			}			goto err;		}		if (ctxn != NULL) {			if ((ret = ctxn->abort(ctxn)) != 0)				goto err;			ctxn = NULL;		}	}done:	rval = 0;	DB_ASSERT(ctxn == NULL);	if (txn != NULL && (ret = txn->commit(txn, 0)) != 0) {		txn = NULL;		goto err;	}	if (0) {err:		rval = 1;		DB_ASSERT(ctxn == NULL);		if (txn != NULL)			(void)txn->abort(txn);	}	/* Close the database. */	if (dbp != NULL && (ret = dbp->close(dbp, 0)) != 0) {		dbenv->err(dbenv, ret, "DB->close");		rval = 1;	}	if (G(hdrbuf) != NULL)		free(G(hdrbuf));	G(hdrbuf) = NULL;	/* Free allocated memory. */	if (subdb != NULL)		free(subdb);	if (dbtype != DB_RECNO && dbtype != DB_QUEUE)		free(key.data);	if (rkey.data != NULL)		free(rkey.data);	free(data.data);	return (rval);}/* * db_init -- *	Initialize the environment. */intdb_init(dbenv, home, cache, is_private)	DB_ENV *dbenv;	char *home;	u_int32_t cache;	int *is_private;{	u_int32_t flags;	int ret;	*is_private = 0;	/* We may be loading into a live environment.  Try and join. */	flags = DB_USE_ENVIRON |	    DB_INIT_LOCK | DB_INIT_LOG | DB_INIT_MPOOL | DB_INIT_TXN;	if (dbenv->open(dbenv, home, flags, 0) == 0)		return (0);	/*	 * We're trying to load a database.	 *	 * An environment is required because we may be trying to look at	 * databases in directories other than the current one.  We could	 * avoid using an environment iff the -h option wasn't specified,	 * but that seems like more work than it's worth.	 *	 * No environment exists (or, at least no environment that includes	 * an mpool region exists).  Create one, but make it private so that	 * no files are actually created.	 */	LF_CLR(DB_INIT_LOCK | DB_INIT_LOG | DB_INIT_TXN);	LF_SET(DB_CREATE | DB_PRIVATE);	*is_private = 1;	if ((ret = dbenv->set_cachesize(dbenv, 0, cache, 1)) != 0) {		dbenv->err(dbenv, ret, "set_cachesize");		return (1);	}	if ((ret = dbenv->open(dbenv, home, flags, 0)) == 0)		return (0);	/* An environment is required. */	dbenv->err(dbenv, ret, "DB_ENV->open");	return (1);}#define	FLAG(name, value, keyword, flag)				\	if (strcmp(name, keyword) == 0) {				\		switch (*value) {					\		case '1':						\			if ((ret = dbp->set_flags(dbp, flag)) != 0) {	\				dbp->err(dbp, ret, "%s: set_flags: %s",	\				    G(progname), name);			\				return (1);				\			}						\			break;						\		case '0':						\			break;						\		default:						\			badnum(dbenv);					\			return (1);					\		}							\		continue;						\	}#define	NUMBER(name, value, keyword, func)				\	if (strcmp(name, keyword) == 0) {				\		if (__db_getlong(dbp,					\		    NULL, value, 1, LONG_MAX, &val) != 0)		\			return (1);					\		if ((ret = dbp->func(dbp, val)) != 0)			\			goto nameerr;					\		continue;						\	}#define	STRING(name, value, keyword, func)				\	if (strcmp(name, keyword) == 0) {				\		if ((ret = dbp->func(dbp, value[0])) != 0)		\			goto nameerr;					\		continue;						\	}/* * configure -- *	Handle command-line configuration options. */intconfigure(dbenv, dbp, clp, subdbp, keysp)	DB_ENV *dbenv;	DB *dbp;	char **clp, **subdbp;	int *keysp;{	long val;	int ret, savech;	char *name, *value;	for (; (name = *clp) != NULL; *--value = savech, ++clp) {		if ((value = strchr(name, '=')) == NULL) {			dbp->errx(dbp,		    "command-line configuration uses name=value format");			return (1);		}		savech = *value;		*value++ = '\0';		if (strcmp(name, "database") == 0 ||		    strcmp(name, "subdatabase") == 0) {			if (*subdbp != NULL)				free(*subdbp);			if ((*subdbp = strdup(value)) == NULL) {				dbp->err(dbp, ENOMEM, NULL);				return (1);			}			continue;		}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -