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

📄 mserver5.c

📁 一个内存数据库的源代码这是服务器端还有客户端
💻 C
字号:
#line 74 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/tools/mserver5.mx"#include "mal_config.h"#include "mserver5.h"#include "mal_authorize.h"#include "mal_sabaoth.h"#include <stdio.h>#include <errno.h>#include <string.h> /* strerror */#ifdef _CRTDBG_MAP_ALLOC/* Windows only:   our definition of new and delete clashes with the one if   _CRTDBG_MAP_ALLOC is defined.*/#undef _CRTDBG_MAP_ALLOC#endif#line 104 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/tools/mserver5.mx"static int malloc_init = 1;/* NEEDED? */#if defined(_MSC_VER) && defined(__cplusplus)#include <eh.h>voidmserver_abort(){	fprintf(stderr, "\n! mserver_abort() was called by terminate(). !\n");	fflush(stderr);	MT_global_exit(0);}#endifvoidusage(char *prog){	fprintf(stderr, "Usage: %s [options] [script]\n", prog);	fprintf(stderr, "    --dbname=<database_name> \n");	fprintf(stderr, "    --dbfarm=<database_directory> \n");	fprintf(stderr, "    --help for more options \n");	exit(0);}voidusage2(char *prog){	fprintf(stderr, "Usage: %s [options] [script]\n", prog);	fprintf(stderr, "    --dbname=<database_name> \n");	fprintf(stderr, "    --dbfarm=<directory> \n");	fprintf(stderr, "    --dbinit=<stmt>           Server prepare statement\n");	fprintf(stderr, "    --user=<str>              Defaults to [monetdb]\n");	fprintf(stderr, "    --password=<str>          Defaults to [monetdb]\n");	fprintf(stderr, "    --config=<config_file> \n");	fprintf(stderr, "    --delay=<number>          cycle delay [300]\n");	fprintf(stderr, "    --debug=<number>          trace server actions[0]\n");	fprintf(stderr, "    --daemon=yes|no           run in background [no]\n");	fprintf(stderr, "    --set <option>=<value>    set environment value\n");	fprintf(stderr, "    --help                    this list of options \n");	exit(0);}#line 148 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/tools/mserver5.mx"voidmonet_hello(opt *set, int setlen){#ifdef STATIC	char *linkinfo = "statically";#else	char *linkinfo = "dynamically";#endif	char *msg = mo_find_option(set, setlen, "monet_welcome");	if (msg && strcmp(msg, "yes") == 0) {		printf("# MonetDB Server v%s\n", GDKgetenv("gdk_version"));		printf("# Copyright (c) 1993-2007 CWI, all rights reserved\n");		printf("# Compiled for %s/" SZFMT "bit with " SZFMT "bit OIDs %s linked\n", HOST, (size_t) (sizeof(ptr) * 8), (size_t) (sizeof(oid) * 8), linkinfo);#ifdef MONET_GLOBAL_DEBUG		printf("# config:%s\n", GDKgetenv("config"));		printf("# dbfarm:%s\n", GDKgetenv("gdk_dbfarm"));#endif		printf("# dbname:%s\n", GDKgetenv("gdk_dbname"));		printf("# Visit http://monetdb.cwi.nl/ for further information\n");	}}strabsolute_path(str s){	if (!MT_path_absolute(s)) {		str ret = (str) GDKmalloc(strlen(s) + strlen(monet_cwd) + 2);		sprintf(ret, "%s%c%s", monet_cwd, DIR_SEP, s);		return ret;	}	return GDKstrdup(s);}#line 187 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/tools/mserver5.mx"#define BSIZE 8192intmonet_init(opt *set, int setlen){	char *p;	opt *n = (opt *) malloc(setlen * sizeof(opt));	int i, j, nlen = 0;	char *dbname = mo_find_option(set, setlen, "gdk_dbname");	char *dbfarm = mo_find_option(set, setlen, "gdk_dbfarm");	char *alloc_map = mo_find_option(set, setlen, "gdk_alloc_map");	if (n == NULL || dbname == NULL || dbfarm == NULL || alloc_map == NULL) {		fprintf(stderr, "Error, no database name or directory\n");		if (n)			free(n);		return 0;	}	dbfarm = mo_substitute(set, setlen, dbfarm);	if ((p = mo_find_option(set, setlen, "gdk_debug")))		GDKdebug = strtol(p, NULL, 10);	/* determine Monet's kernel settings */	if (!GDKinit(dbname, dbfarm, strcasecmp(alloc_map, "yes") == 0) ) {		free(dbfarm);		free(n);		return 0;	}	free(dbfarm);#line 225 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/tools/mserver5.mx"	for (i = 0; i < setlen; i++) {		int done = 0;		for (j = 0; j < nlen; j++) {			if (strcmp(n[j].name, set[i].name) == 0) {				if (n[j].kind < set[i].kind) {					n[j] = set[i];				}				done = 1;				break;			}		}		if (!done) {			n[nlen] = set[i];			nlen++;		}	}	for (i = 0; i < nlen; i++) {		char *value;		value = mo_substitute(n, nlen, n[i].value);		GDKsetenv(n[i].name, value);		free(value);	}	free(n);	if ((p = GDKgetenv("gdk_mem_bigsize"))) {		/* when allocating >6% of all RAM; do so using vmalloc() iso malloc() */		lng max_mem_bigsize = GDK_mem_maxsize/16;		/* sanity check to avoid memory fragmentation */		GDK_mem_bigsize = (size_t) MIN(max_mem_bigsize, strtol(p, NULL, 10));	}	if ((p = GDKgetenv("gdk_vm_minsize"))){		/* when allocating HUGE regions, switch from vmalloc() to mmap() on a real file */		/* for 32-bits systems HUGE = RAM/8, for 64-bits systems HUGE = RAM/2 */		lng max_vm_minsize = ((lng)GDK_mem_maxsize*sizeof(void*)*sizeof(void*))/128;		/* sanity check to avoid running out of swap space */		GDK_vm_minsize = (size_t) MIN(max_vm_minsize, strtol(p, NULL, 10));	}	if (GDKgetenv_isyes("gdk_embedded") || GDKgetenv_isyes("embedded")) {		GDKembedded = 1;	}	if (GDKgetenv_isyes("monet_daemon") || GDKgetenv_isyes("daemon")) {		monet_daemon = 1;#ifdef HAVE_SETSID		setsid();#endif	}	monet_hello(set, setlen);	/* you don't need the commandline arguments anymore */	mo_free_options(set, setlen);	return 1;}intmain(int argc, char **av){	char *prog = *av;	opt *set = NULL;	int idx = 0, debug = 0, setlen = 0, listing = 0, i = 0;	str dbinit = NULL;	str err = MAL_SUCCEED;	static struct option long_options[12] = {		{"config", 1, 0, 'c'},		{"dbname", 1, 0, 0},		{"dbfarm", 1, 0, 0},		{"dbinit", 1, 0, 0},		{"daemon", 1, 0, 0},		{"debug", 2, 0, 'd'},		{"delay", 1, 0, 0},		{"help", 2, 0, 'h'},		{"help", 0, 0, '?'},		{"set", 1, 0, 's'},		{"trace", 0, 0, 't'},		{0, 0, 0, 0}	};#line 337 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/tools/mserver5.mx"#if defined(_MSC_VER) && defined(__cplusplus)	set_terminate(mserver_abort);#endif/* should be looked into        if (setlocale(LC_CTYPE, "") == NULL){                GDKfatal( "cannot set locale\n");        }*/#ifdef HAVE_MALLOPT	#line 323 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/tools/mserver5.mx"	if (malloc_init) {/* for (Red Hat) Linux (6.2) unused and ignored at least as of glibc-2.1.3-15 *//* for (Red Hat) Linux (8) used at least as of glibc-2.2.93-5 */            if (mallopt(M_MXFAST, 192)) {                fprintf(stderr, "!monet: mallopt(M_MXFAST,192) fails.\n");            }#ifdef M_BLKSZ            if (mallopt(M_BLKSZ, 8*1024)) {                fprintf(stderr, "!monet: mallopt(M_BLKSZ,8*1024) fails.\n");            }#endif        }	malloc_init=0;#line 348 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/tools/mserver5.mx"#else	(void) malloc_init;	/* still unused */#endif	if (getcwd(monet_cwd, PATHLENGTH - 1) == NULL) {		perror("pwd");		GDKfatal("monet_init: could not determine current directory\n");	}	if (!(setlen = mo_builtin_settings(&set)))		usage(prog);	setlen = mo_add_option(&set, setlen, opt_config, "prefix", MONETDBPREFIX);	setlen = mo_add_option(&set, setlen, opt_config, "config", MONETDBCONFIG);	for (;;) {		int option_index = 0;		int c = getopt_long(argc, av, "c:d:t:r:?s:",				    long_options, &option_index);		if (c == -1)			break;		switch (c) {		case 0:			if (strcmp(long_options[option_index].name, "dbname") == 0) {				setlen = mo_add_option(&set, setlen, opt_cmdline, "gdk_dbname", optarg);				break;			}			if (strcmp(long_options[option_index].name, "delay") == 0) {				setlen = mo_add_option(&set, setlen, opt_cmdline, "delay", optarg);				break;			}			if (strcmp(long_options[option_index].name, "dbfarm") == 0) {				setlen = mo_add_option(&set, setlen, opt_cmdline, "gdk_dbfarm", optarg);				break;			}			if (strcmp(long_options[option_index].name, "dbinit") == 0) {				if (dbinit)					fprintf(stderr, "#warning: ignoring multiple --dbinit argument\n");				else					dbinit = optarg;				break;			}			if (strcmp(long_options[option_index].name, "daemon") == 0) {				setlen = mo_add_option(&set, setlen, opt_cmdline, "gdk_daemon", optarg);				break;			}			usage(prog);			break;		case 'c':			setlen = mo_add_option(&set, setlen, opt_cmdline, "config", optarg);			break;		case 'd':			debug = 1;			if (optarg) {				setlen = mo_add_option(&set, setlen, opt_cmdline, "gdk_debug", optarg);			}			break;		case 's':{			/* should add option to a list */			char *tmp = strchr(optarg, '=');			if (tmp) {				*tmp = '\0';				setlen = mo_add_option(&set, setlen, opt_cmdline, optarg, tmp + 1);			} else {				fprintf(stderr, "ERROR: wrong format %s\n", optarg);			}		}			break;		case 't':	/* trace option, ignored to reduce testweb complaints			fprintf(stderr, "#warning: trace option not yet supported\n");			*/			break;		case 'h':			if(strcmp(long_options[option_index].name, "help") == 0) {				usage2(prog);				break;			}		case '?':			usage(prog);		default:			fprintf(stderr, "ERROR: getopt returned character code 0%o ??\n", c);			usage(prog);		}	}	if (!(setlen = mo_system_config(&set, setlen)))		usage(prog);	monet_script = (str *) GDKmalloc(sizeof(str) * (argc + 1));	monet_script[idx] = NULL;	while (optind < argc) {		monet_script[idx] = absolute_path(av[optind]);		monet_script[idx + 1] = NULL;		optind++;		idx++;	}	if (debug)		mo_print_options(set, setlen);#ifdef MONET_GLOBAL_DEBUG	else		mo_print_options(set, setlen);#endif	if (monet_init(set, setlen) == 0 || mal_init())		return 0;	/* configure sabaoth to use the right dbfarm and active database */	SABAOTHinit(GDKgetenv("gdk_dbfarm"), GDKgetenv("gdk_dbname"));	/* wipe out all cruft, if left over */	if ((err = SABAOTHwildRetreat(&i)) != MAL_SUCCEED) {		/* just swallow the error */		GDKfree(err);	}	/* From this point, the server should exit cleanly.  Discussion:	 * even earlier?  Sabaoth here registers the server has started up. */	if ((err = SABAOTHregisterStart(&i)) != MAL_SUCCEED) {		/* throw the error at the user, but don't die */		fprintf(stderr, "!%s\n", err);		GDKfree(err);	}	{		str lang = "mal";		/* we inited mal before, so publish its existence */		if ((err = SABAOTHmarchScenario(&i, &lang)) != MAL_SUCCEED) {			/* throw the error at the user, but don't die */			fprintf(stderr, "!%s\n", err);			GDKfree(err);		}	}	{		/* unlock the vault, first see if we can find the file which		 * holds the secret */		char* secret = alloca(sizeof(char) * 1024);		FILE* secretf;		size_t len;				if (GDKgetenv("monet_vault_key") == NULL) {			/* use a default (hard coded, non safe) key */			secret = "Xas632jsi2whjds8";			fprintf(stderr, "#warning: please don't forget to set your "					"vault key!\n#(see %s)\n", GDKgetenv("config"));		} else {			if ((secretf = fopen(GDKgetenv("monet_vault_key"), "r")) == NULL) {				snprintf(secret, 1023, "unable to open vault_key_file %s: %s",						GDKgetenv("monet_vault_key"), strerror(errno));				secret[1023] = '\0';				GDKfatal(secret);			}			len = fread(secret, 1, 1023, secretf);			secret[len] = '\0';			len = strlen(secret); /* secret can contain null-bytes */			if (len < 5) {				fprintf(stderr, "#warning: your vault key is too short "						"(" SZFMT "), enlarge your vault key!\n",						len); /* penis */			}			fclose(secretf);		}		if ((err = AUTHunlockVault(&secret)) != MAL_SUCCEED)			GDKfatal(err);	}	/* make sure the authorisation BATs are loaded */	if ((err = AUTHinitTables()) != MAL_SUCCEED)		GDKfatal(err);#line 525 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/tools/mserver5.mx"	MSinitClientPrg(mal_clients, "user","main");	if (dbinit == NULL)		dbinit = GDKgetenv("dbinit");	if (dbinit) {		str input = GDKstrdup(dbinit);		callString(mal_clients, input, listing);		GDKfree(input);	}	if (GDKgetenv("mal_listing"))		sscanf(GDKgetenv("mal_listing"), "%d", &listing);	for (i = 0; monet_script[i]; i++) {		evalFile(mal_clients, monet_script[i], listing);		GDKfree(monet_script[i]);		monet_script[i] = 0;	}	GDKfree(monet_script);	if (monet_daemon) {		while(1) 			MT_sleep_ms(5000);	} else		MSserveClient(mal_clients);	/* mal_exit calls MT_global_exit, so statements after this call will	 * never get reached */	mal_exit();	return 0;}#line 556 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/tools/mserver5.mx"

⌨️ 快捷键说明

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