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

📄 tcl_env.c

📁 这是linux下运行的mysql软件包,可用于linux 下安装 php + mysql + apach 的网络配置
💻 C
📖 第 1 页 / 共 2 页
字号:
/*- * See the file LICENSE for redistribution information. * * Copyright (c) 1999-2002 *	Sleepycat Software.  All rights reserved. */#include "db_config.h"#ifndef lintstatic const char revid[] = "$Id: tcl_env.c,v 11.84 2002/08/06 06:21:03 bostic Exp $";#endif /* not lint */#ifndef NO_SYSTEM_INCLUDES#include <sys/types.h>#include <stdlib.h>#include <string.h>#include <tcl.h>#endif#include "db_int.h"#include "dbinc/tcl_db.h"/* * Prototypes for procedures defined later in this file: */static void _EnvInfoDelete __P((Tcl_Interp *, DBTCL_INFO *));static int  env_DbRemove __P((Tcl_Interp *, int, Tcl_Obj * CONST*, DB_ENV *));static int  env_DbRename __P((Tcl_Interp *, int, Tcl_Obj * CONST*, DB_ENV *));/* * PUBLIC: int env_Cmd __P((ClientData, Tcl_Interp *, int, Tcl_Obj * CONST*)); * * env_Cmd -- *	Implements the "env" command. */intenv_Cmd(clientData, interp, objc, objv)	ClientData clientData;		/* Env handle */	Tcl_Interp *interp;		/* Interpreter */	int objc;			/* How many arguments? */	Tcl_Obj *CONST objv[];		/* The argument objects */{	static char *envcmds[] = {#if CONFIG_TEST		"attributes",		"lock_detect",		"lock_id",		"lock_id_free",		"lock_id_set",		"lock_get",		"lock_stat",		"lock_timeout",		"lock_vec",		"log_archive",		"log_compare",		"log_cursor",		"log_file",		"log_flush",		"log_get",		"log_put",		"log_stat",		"mpool",		"mpool_stat",		"mpool_sync",		"mpool_trickle",		"mutex",		"rep_elect",		"rep_flush",		"rep_limit",		"rep_process_message",		"rep_request",		"rep_start",		"rep_stat",		"rpcid",		"test",		"txn_checkpoint",		"txn_id_set",		"txn_recover",		"txn_stat",		"txn_timeout",		"verbose",#endif		"close",		"dbremove",		"dbrename",		"txn",		NULL	};	enum envcmds {#if CONFIG_TEST		ENVATTR,		ENVLKDETECT,		ENVLKID,		ENVLKFREEID,		ENVLKSETID,		ENVLKGET,		ENVLKSTAT,		ENVLKTIMEOUT,		ENVLKVEC,		ENVLOGARCH,		ENVLOGCMP,		ENVLOGCURSOR,		ENVLOGFILE,		ENVLOGFLUSH,		ENVLOGGET,		ENVLOGPUT,		ENVLOGSTAT,		ENVMP,		ENVMPSTAT,		ENVMPSYNC,		ENVTRICKLE,		ENVMUTEX,		ENVREPELECT,		ENVREPFLUSH,		ENVREPLIMIT,		ENVREPPROCMESS,		ENVREPREQUEST,		ENVREPSTART,		ENVREPSTAT,		ENVRPCID,		ENVTEST,		ENVTXNCKP,		ENVTXNSETID,		ENVTXNRECOVER,		ENVTXNSTAT,		ENVTXNTIMEOUT,		ENVVERB,#endif		ENVCLOSE,		ENVDBREMOVE,		ENVDBRENAME,		ENVTXN	};	DBTCL_INFO *envip, *logcip;	DB_ENV *dbenv;	DB_LOGC *logc;	Tcl_Obj *res;	char newname[MSG_SIZE];	int cmdindex, result, ret;	u_int32_t newval;#if CONFIG_TEST	u_int32_t otherval;#endif	Tcl_ResetResult(interp);	dbenv = (DB_ENV *)clientData;	envip = _PtrToInfo((void *)dbenv);	result = TCL_OK;	memset(newname, 0, MSG_SIZE);	if (objc <= 1) {		Tcl_WrongNumArgs(interp, 1, objv, "command cmdargs");		return (TCL_ERROR);	}	if (dbenv == NULL) {		Tcl_SetResult(interp, "NULL env pointer", TCL_STATIC);		return (TCL_ERROR);	}	if (envip == NULL) {		Tcl_SetResult(interp, "NULL env info pointer", TCL_STATIC);		return (TCL_ERROR);	}	/*	 * Get the command name index from the object based on the berkdbcmds	 * defined above.	 */	if (Tcl_GetIndexFromObj(interp, objv[1], envcmds, "command",	    TCL_EXACT, &cmdindex) != TCL_OK)		return (IS_HELP(objv[1]));	res = NULL;	switch ((enum envcmds)cmdindex) {#if CONFIG_TEST	case ENVLKDETECT:		result = tcl_LockDetect(interp, objc, objv, dbenv);		break;	case ENVLKSTAT:		result = tcl_LockStat(interp, objc, objv, dbenv);		break;	case ENVLKTIMEOUT:		result = tcl_LockTimeout(interp, objc, objv, dbenv);		break;	case ENVLKID:		/*		 * No args for this.  Error if there are some.		 */		if (objc > 2) {			Tcl_WrongNumArgs(interp, 2, objv, NULL);			return (TCL_ERROR);		}		_debug_check();		ret = dbenv->lock_id(dbenv, &newval);		result = _ReturnSetup(interp, ret, DB_RETOK_STD(ret),		    "lock_id");		if (result == TCL_OK)			res = Tcl_NewLongObj((long)newval);		break;	case ENVLKFREEID:		if (objc != 3) {			Tcl_WrongNumArgs(interp, 3, objv, NULL);			return (TCL_ERROR);		}		result = Tcl_GetLongFromObj(interp, objv[2], (long *)&newval);		if (result != TCL_OK)			return (result);		ret = dbenv->lock_id_free(dbenv, newval);		result = _ReturnSetup(interp, ret, DB_RETOK_STD(ret),		    "lock id_free");		break;	case ENVLKSETID:		if (objc != 4) {			Tcl_WrongNumArgs(interp, 4, objv, "current max");			return (TCL_ERROR);		}		result = Tcl_GetLongFromObj(interp, objv[2], (long *)&newval);		if (result != TCL_OK)			return (result);		result = Tcl_GetLongFromObj(interp, objv[3], (long *)&otherval);		if (result != TCL_OK)			return (result);		ret = dbenv->lock_id_set(dbenv, newval, otherval);		result = _ReturnSetup(interp, ret, DB_RETOK_STD(ret),		    "lock id_free");		break;	case ENVLKGET:		result = tcl_LockGet(interp, objc, objv, dbenv);		break;	case ENVLKVEC:		result = tcl_LockVec(interp, objc, objv, dbenv);		break;	case ENVLOGARCH:		result = tcl_LogArchive(interp, objc, objv, dbenv);		break;	case ENVLOGCMP:		result = tcl_LogCompare(interp, objc, objv);		break;	case ENVLOGCURSOR:		snprintf(newname, sizeof(newname),		    "%s.logc%d", envip->i_name, envip->i_envlogcid);		logcip = _NewInfo(interp, NULL, newname, I_LOGC);		if (logcip != NULL) {			ret = dbenv->log_cursor(dbenv, &logc, 0);			if (ret == 0) {				result = TCL_OK;				envip->i_envlogcid++;				/*				 * We do NOT want to set i_parent to				 * envip here because log cursors are				 * not "tied" to the env.  That is, they				 * are NOT closed if the env is closed.				 */				Tcl_CreateObjCommand(interp, newname,				    (Tcl_ObjCmdProc *)logc_Cmd,				    (ClientData)logc, NULL);				res =				    Tcl_NewStringObj(newname, strlen(newname));				_SetInfoData(logcip, logc);			} else {				_DeleteInfo(logcip);				result = _ErrorSetup(interp, ret, "log cursor");			}		} else {			Tcl_SetResult(interp,			    "Could not set up info", TCL_STATIC);			result = TCL_ERROR;		}		break;	case ENVLOGFILE:		result = tcl_LogFile(interp, objc, objv, dbenv);		break;	case ENVLOGFLUSH:		result = tcl_LogFlush(interp, objc, objv, dbenv);		break;	case ENVLOGGET:		result = tcl_LogGet(interp, objc, objv, dbenv);		break;	case ENVLOGPUT:		result = tcl_LogPut(interp, objc, objv, dbenv);		break;	case ENVLOGSTAT:		result = tcl_LogStat(interp, objc, objv, dbenv);		break;	case ENVMPSTAT:		result = tcl_MpStat(interp, objc, objv, dbenv);		break;	case ENVMPSYNC:		result = tcl_MpSync(interp, objc, objv, dbenv);		break;	case ENVTRICKLE:		result = tcl_MpTrickle(interp, objc, objv, dbenv);		break;	case ENVMP:		result = tcl_Mp(interp, objc, objv, dbenv, envip);		break;	case ENVREPELECT:		result = tcl_RepElect(interp, objc, objv, dbenv);		break;	case ENVREPFLUSH:		result = tcl_RepFlush(interp, objc, objv, dbenv);		break;	case ENVREPLIMIT:		result = tcl_RepLimit(interp, objc, objv, dbenv);		break;	case ENVREPPROCMESS:		result = tcl_RepProcessMessage(interp, objc, objv, dbenv);		break;	case ENVREPREQUEST:		result = tcl_RepRequest(interp, objc, objv, dbenv);		break;	case ENVREPSTART:		result = tcl_RepStart(interp, objc, objv, dbenv);		break;	case ENVREPSTAT:		result = tcl_RepStat(interp, objc, objv, dbenv);		break;	case ENVRPCID:		/*		 * No args for this.  Error if there are some.		 */		if (objc > 2) {			Tcl_WrongNumArgs(interp, 2, objv, NULL);			return (TCL_ERROR);		}		/*		 * !!! Retrieve the client ID from the dbp handle directly.		 * This is for testing purposes only.  It is dbp-private data.		 */		res = Tcl_NewLongObj(dbenv->cl_id);		break;	case ENVTXNCKP:		result = tcl_TxnCheckpoint(interp, objc, objv, dbenv);		break;	case ENVTXNSETID:		if (objc != 4) {			Tcl_WrongNumArgs(interp, 4, objv, "current max");			return (TCL_ERROR);		}		result = Tcl_GetLongFromObj(interp, objv[2], (long *)&newval);		if (result != TCL_OK)			return (result);		result = Tcl_GetLongFromObj(interp, objv[3], (long *)&otherval);		if (result != TCL_OK)			return (result);		ret = dbenv->txn_id_set(dbenv, newval, otherval);		result = _ReturnSetup(interp, ret, DB_RETOK_STD(ret),		    "lock id_free");		break;	case ENVTXNRECOVER:		result = tcl_TxnRecover(interp, objc, objv, dbenv, envip);		break;	case ENVTXNSTAT:		result = tcl_TxnStat(interp, objc, objv, dbenv);		break;	case ENVTXNTIMEOUT:		result = tcl_TxnTimeout(interp, objc, objv, dbenv);		break;	case ENVMUTEX:		result = tcl_Mutex(interp, objc, objv, dbenv, envip);		break;	case ENVATTR:		result = tcl_EnvAttr(interp, objc, objv, dbenv);		break;	case ENVTEST:		result = tcl_EnvTest(interp, objc, objv, dbenv);		break;	case ENVVERB:		/*		 * Two args for this.  Error if different.		 */		if (objc != 4) {			Tcl_WrongNumArgs(interp, 2, objv, NULL);			return (TCL_ERROR);		}		result = tcl_EnvVerbose(interp, dbenv, objv[2], objv[3]);		break;#endif	case ENVCLOSE:		/*		 * No args for this.  Error if there are some.		 */		if (objc > 2) {			Tcl_WrongNumArgs(interp, 2, objv, NULL);			return (TCL_ERROR);		}		/*		 * Any transactions will be aborted, and an mpools		 * closed automatically.  We must delete any txn		 * and mp widgets we have here too for this env.		 * NOTE: envip is freed when we come back from		 * this function.  Set it to NULL to make sure no		 * one tries to use it later.		 */		_debug_check();		ret = dbenv->close(dbenv, 0);		result = _ReturnSetup(interp, ret, DB_RETOK_STD(ret),		    "env close");		_EnvInfoDelete(interp, envip);		envip = NULL;		break;	case ENVDBREMOVE:		result = env_DbRemove(interp, objc, objv, dbenv);		break;	case ENVDBRENAME:		result = env_DbRename(interp, objc, objv, dbenv);		break;	case ENVTXN:		result = tcl_Txn(interp, objc, objv, dbenv, envip);		break;	}	/*	 * Only set result if we have a res.  Otherwise, lower	 * functions have already done so.	 */	if (result == TCL_OK && res)		Tcl_SetObjResult(interp, res);	return (result);}/* * PUBLIC: int tcl_EnvRemove __P((Tcl_Interp *, int, Tcl_Obj * CONST*, * PUBLIC:      DB_ENV *, DBTCL_INFO *)); * * tcl_EnvRemove -- */inttcl_EnvRemove(interp, objc, objv, dbenv, envip)	Tcl_Interp *interp;		/* Interpreter */	int objc;			/* How many arguments? */	Tcl_Obj *CONST objv[];		/* The argument objects */	DB_ENV *dbenv;			/* Env pointer */	DBTCL_INFO *envip;		/* Info pointer */{	static char *envremopts[] = {#if CONFIG_TEST		"-overwrite",		"-server",#endif		"-data_dir",		"-encryptaes",		"-encryptany",		"-force",		"-home",		"-log_dir",		"-tmp_dir",		"-use_environ",		"-use_environ_root",		NULL	};	enum envremopts {#if CONFIG_TEST		ENVREM_OVERWRITE,		ENVREM_SERVER,#endif		ENVREM_DATADIR,		ENVREM_ENCRYPT_AES,		ENVREM_ENCRYPT_ANY,		ENVREM_FORCE,		ENVREM_HOME,		ENVREM_LOGDIR,		ENVREM_TMPDIR,		ENVREM_USE_ENVIRON,		ENVREM_USE_ENVIRON_ROOT	};	DB_ENV *e;	u_int32_t cflag, enc_flag, flag, forceflag, sflag;	int i, optindex, result, ret;	char *datadir, *home, *logdir, *passwd, *server, *tmpdir;	result = TCL_OK;	cflag = flag = forceflag = sflag = 0;	home = NULL;	passwd = NULL;	datadir = logdir = tmpdir = NULL;	server = NULL;	enc_flag = 0;	if (objc < 2) {		Tcl_WrongNumArgs(interp, 2, objv, "?args?");		return (TCL_ERROR);	}	i = 2;	while (i < objc) {		if (Tcl_GetIndexFromObj(interp, objv[i], envremopts, "option",		    TCL_EXACT, &optindex) != TCL_OK) {			result = IS_HELP(objv[i]);			goto error;		}		i++;		switch ((enum envremopts)optindex) {#if CONFIG_TEST		case ENVREM_SERVER:			/* Make sure we have an arg to check against! */			if (i >= objc) {				Tcl_WrongNumArgs(interp, 2, objv,				    "?-server name?");				result = TCL_ERROR;				break;			}			server = Tcl_GetStringFromObj(objv[i++], NULL);			cflag = DB_CLIENT;			break;#endif		case ENVREM_ENCRYPT_AES:			/* Make sure we have an arg to check against! */			if (i >= objc) {				Tcl_WrongNumArgs(interp, 2, objv,				    "?-encryptaes passwd?");				result = TCL_ERROR;				break;			}			passwd = Tcl_GetStringFromObj(objv[i++], NULL);			enc_flag = DB_ENCRYPT_AES;			break;		case ENVREM_ENCRYPT_ANY:			/* Make sure we have an arg to check against! */			if (i >= objc) {				Tcl_WrongNumArgs(interp, 2, objv,				    "?-encryptany passwd?");				result = TCL_ERROR;				break;			}			passwd = Tcl_GetStringFromObj(objv[i++], NULL);			enc_flag = 0;			break;		case ENVREM_FORCE:			forceflag |= DB_FORCE;			break;		case ENVREM_HOME:			/* Make sure we have an arg to check against! */			if (i >= objc) {				Tcl_WrongNumArgs(interp, 2, objv,				    "?-home dir?");				result = TCL_ERROR;				break;			}			home = Tcl_GetStringFromObj(objv[i++], NULL);			break;#if CONFIG_TEST		case ENVREM_OVERWRITE:			sflag |= DB_OVERWRITE;			break;#endif		case ENVREM_USE_ENVIRON:			flag |= DB_USE_ENVIRON;			break;		case ENVREM_USE_ENVIRON_ROOT:			flag |= DB_USE_ENVIRON_ROOT;			break;		case ENVREM_DATADIR:			if (i >= objc) {				Tcl_WrongNumArgs(interp, 2, objv,				    "-data_dir dir");				result = TCL_ERROR;				break;			}			datadir = Tcl_GetStringFromObj(objv[i++], NULL);			break;		case ENVREM_LOGDIR:			if (i >= objc) {				Tcl_WrongNumArgs(interp, 2, objv,				    "-log_dir dir");				result = TCL_ERROR;				break;			}			logdir = Tcl_GetStringFromObj(objv[i++], NULL);			break;		case ENVREM_TMPDIR:			if (i >= objc) {				Tcl_WrongNumArgs(interp, 2, objv,				    "-tmp_dir dir");				result = TCL_ERROR;				break;			}			tmpdir = Tcl_GetStringFromObj(objv[i++], NULL);			break;		}		/*		 * If, at any time, parsing the args we get an error,		 * bail out and return.		 */		if (result != TCL_OK)			goto error;	}	/*	 * If dbenv is NULL, we don't have an open env and we need to open	 * one of the user.  Don't bother with the info stuff.	 */	if (dbenv == NULL) {		if ((ret = db_env_create(&e, cflag)) != 0) {			result = _ReturnSetup(interp, ret, DB_RETOK_STD(ret),			    "db_env_create");			goto error;		}		if (server != NULL) {			_debug_check();			ret = e->set_rpc_server(e, NULL, server, 0, 0, 0);			result = _ReturnSetup(interp, ret, DB_RETOK_STD(ret),			    "set_rpc_server");			if (result != TCL_OK)				goto error;		}		if (datadir != NULL) {			_debug_check();			ret = e->set_data_dir(e, datadir);			result = _ReturnSetup(interp, ret, DB_RETOK_STD(ret),			    "set_data_dir");			if (result != TCL_OK)				goto error;		}		if (logdir != NULL) {			_debug_check();			ret = e->set_lg_dir(e, logdir);			result = _ReturnSetup(interp, ret, DB_RETOK_STD(ret),			    "set_log_dir");			if (result != TCL_OK)				goto error;		}		if (tmpdir != NULL) {			_debug_check();			ret = e->set_tmp_dir(e, tmpdir);			result = _ReturnSetup(interp, ret, DB_RETOK_STD(ret),			    "set_tmp_dir");			if (result != TCL_OK)				goto error;		}		if (passwd != NULL) {			ret = e->set_encrypt(e, passwd, enc_flag);			result = _ReturnSetup(interp, ret, DB_RETOK_STD(ret),			    "set_encrypt");		}		if (sflag != 0 && (ret = e->set_flags(e, sflag, 1)) != 0) {			_debug_check();			result = _ReturnSetup(interp, ret, DB_RETOK_STD(ret),			    "set_flags");			if (result != TCL_OK)				goto error;		}	} else {		/*		 * We have to clean up any info associated with this env,		 * regardless of the result of the remove so do it first.		 * NOTE: envip is freed when we come back from this function.		 */		_EnvInfoDelete(interp, envip);		envip = NULL;		e = dbenv;	}	flag |= forceflag;	/*	 * When we get here we have parsed all the args.  Now remove	 * the environment.

⌨️ 快捷键说明

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