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

📄 dump.c

📁 这个是内存数据库的客户端
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "clients_config.h"#include <monet_options.h>#include "Mapi.h"#include <unistd.h>#include <stdlib.h>#include <string.h>#include "msqldump.h"static voidquoted_print(FILE *f, const char *s){	putc('"', f);	while (*s) {		switch (*s) {		case '\\':		case '"':			putc('\\', f);			putc(*s, f);			break;		case '\n':			putc('\\', f);			putc('n', f);			break;		case '\t':			putc('\\', f);			putc('t', f);			break;		default:			if ((0 < *s && *s < 32) || *s == '\377')				fprintf(f, "\\%03o", *s & 0377);			else				putc(*s, f);			break;		}		s++;	}	putc('"', f);}intdump_table(Mapi mid, char *tname, FILE *toConsole){	int cnt = 0, i;	MapiHdl hdl;	char *query;	size_t maxquerylen = BUFSIZ + strlen(tname);	int *string;	query = malloc(maxquerylen);	fprintf(toConsole, "CREATE TABLE ");	quoted_print(toConsole, tname);	fprintf(toConsole, " (\n");	snprintf(query, maxquerylen,		 "SELECT \"c\".\"name\","		/* 0 */			"\"c\".\"type\","		/* 1 */			"\"c\".\"type_digits\","	/* 2 */			"\"c\".\"type_scale\","		/* 3 */			"\"c\".\"null\","		/* 4 */			"\"c\".\"default\","		/* 5 */			"\"c\".\"number\" "		/* 6 */		 "FROM \"columns\" \"c\",\"tables\" \"t\" "		 "WHERE \"c\".\"table_id\" = \"t\".\"id\" "		 "AND '%s' = \"t\".\"name\" ORDER BY \"number\"", tname);	if ((hdl = mapi_query(mid, query)) == NULL || mapi_error(mid)) {		if (hdl) {			mapi_explain_query(hdl, stderr);			mapi_close_handle(hdl);		} else			mapi_explain(mid, stderr);		free(query);		return 1;	}	while ((mapi_fetch_row(hdl)) != 0) {		char *c_name = mapi_fetch_field(hdl, 0);		char *c_type = mapi_fetch_field(hdl, 1);		char *c_type_digits = mapi_fetch_field(hdl, 2);		char *c_type_scale = mapi_fetch_field(hdl, 3);		char *c_null = mapi_fetch_field(hdl, 4);		char *c_default = mapi_fetch_field(hdl, 5);		if (mapi_error(mid)) {			mapi_explain_query(hdl, stderr);			mapi_close_handle(hdl);			free(query);			return 1;		}		if (cnt)			fprintf(toConsole, ",\n");		putc('\t', toConsole);		quoted_print(toConsole, c_name);		putc(' ', toConsole);		if (strcmp(c_type, "boolean") == 0 ||		    strcmp(c_type, "int") == 0 ||		    strcmp(c_type, "smallint") == 0 ||		    strcmp(c_type, "bigint") == 0 ||		    strcmp(c_type, "double") == 0 ||		    strcmp(c_type, "real") == 0 ||		    strcmp(c_type, "date") == 0) {			fprintf(toConsole, "%s", c_type);		} else if (strcmp(c_type, "month_interval") == 0) {			if (*c_type_scale == '1') {				if (*c_type_digits == 1)					fprintf(toConsole, "INTERVAL YEAR");				else					fprintf(toConsole, "INTERVAL YEAR TO MONTH");			} else				fprintf(toConsole, "INTERVAL MONTH");		} else if (strcmp(c_type, "sec_interval") == 0) {			switch (*c_type_scale) {			case '3':				switch (*c_type_digits) {				case '3':					fprintf(toConsole, "INTERVAL DAY");					break;				case '4':					fprintf(toConsole, "INTERVAL DAY TO HOUR");					break;				case '5':					fprintf(toConsole, "INTERVAL DAY TO MINUTE");					break;				case '6':					fprintf(toConsole, "INTERVAL DAY TO SECOND");					break;				}				break;			case '4':				switch (*c_type_digits) {				case '4':					fprintf(toConsole, "INTERVAL HOUR");					break;				case '5':					fprintf(toConsole, "INTERVAL HOUR TO MINUTE");					break;				case '6':					fprintf(toConsole, "INTERVAL HOUR TO SECOND");					break;				}				break;			case '5':				switch (*c_type_digits) {				case '5':					fprintf(toConsole, "INTERVAL MINUTE");					break;				case '6':					fprintf(toConsole, "INTERVAL MINUTE TO SECOND");					break;				}				break;			case '6':				fprintf(toConsole, "INTERVAL SECOND");				break;			}				} else if (strcmp(c_type, "clob") == 0) {			fprintf(toConsole, "CHARACTER LARGE OBJECT");			if (strcmp(c_type_digits, "0") != 0)				fprintf(toConsole, "(%s)", c_type_digits);		} else if (strcmp(c_type, "timestamp") == 0 ||			   strcmp(c_type, "time") == 0) {			fprintf(toConsole, "%s", c_type);			if (strcmp(c_type_digits, "0") != 0)				fprintf(toConsole, "(%s)", c_type_digits);			if (strcmp(c_type_scale, "1") == 0)				fprintf(toConsole, " WITH TIME ZONE");		} else if (strcmp(c_type_digits, "0") == 0) {			fprintf(toConsole, "%s", c_type);		} else if (strcmp(c_type_scale, "0") == 0) {			fprintf(toConsole, "%s(%s)", c_type, c_type_digits);		} else {			fprintf(toConsole, "%s(%s,%s)", c_type, c_type_digits, c_type_scale);		}		if (strcmp(c_null, "false") == 0)			fprintf(toConsole, " NOT NULL");		if (c_default != NULL)			fprintf(toConsole, " DEFAULT %s", c_default);		cnt++;	}	if (mapi_error(mid)) {		mapi_explain_query(hdl, stderr);		mapi_close_handle(hdl);		free(query);		return 1;	}	mapi_close_handle(hdl);	snprintf(query, maxquerylen,		 "SELECT \"kc\".\"column\","		/* 0 */			"\"kc\".\"nr\", "		/* 1 */			"\"k\".\"name\" "		/* 2 */		 "FROM \"keycolumns\" \"kc\", "		      "\"keys\" \"k\", "		      "\"tables\" \"t\" "		 "WHERE \"kc\".\"id\" = \"k\".\"id\" AND "		       "\"k\".\"table_id\" = \"t\".\"id\" AND "		       "\"k\".\"type\" = 0 AND "		       "\"t\".\"name\" = '%s' "		 "ORDER BY \"nr\"", tname);	if ((hdl = mapi_query(mid, query)) == NULL || mapi_error(mid)) {		if (hdl) {			mapi_explain_query(hdl, stderr);			mapi_close_handle(hdl);		} else			mapi_explain(mid, stderr);		free(query);		return 1;	}	cnt = 0;	while ((mapi_fetch_row(hdl)) != 0) {		char *c_column = mapi_fetch_field(hdl, 0);		char *k_name = mapi_fetch_field(hdl, 2);		if (mapi_error(mid)) {			mapi_explain_query(hdl, stderr);			mapi_close_handle(hdl);			free(query);			return 1;		}		if (cnt == 0) {			fprintf(toConsole, ",\n\t");			if (k_name) {				fprintf(toConsole, "CONSTRAINT ");				quoted_print(toConsole, k_name);				putc(' ', toConsole);			}			fprintf(toConsole, "PRIMARY KEY (");		} else			fprintf(toConsole, ", ");		quoted_print(toConsole, c_column);		cnt++;	}	if (cnt)		fprintf(toConsole, ")");	if (mapi_error(mid)) {		mapi_explain_query(hdl, stderr);		mapi_close_handle(hdl);		free(query);		return 1;	}	mapi_close_handle(hdl);	snprintf(query, maxquerylen,		 "SELECT \"kc\".\"column\","		/* 0 */			"\"kc\".\"nr\", "		/* 1 */			"\"k\".\"name\" "		/* 2 */		 "FROM \"keycolumns\" \"kc\", "		      "\"keys\" \"k\", "		      "\"tables\" \"t\" "		 "WHERE \"kc\".\"id\" = \"k\".\"id\" AND "		       "\"k\".\"table_id\" = \"t\".\"id\" AND "		       "\"k\".\"type\" = 1 AND "		       "\"t\".\"name\" = '%s' "		 "ORDER BY \"nr\"", tname);	if ((hdl = mapi_query(mid, query)) == NULL || mapi_error(mid)) {		if (hdl) {			mapi_explain_query(hdl, stderr);			mapi_close_handle(hdl);		} else			mapi_explain(mid, stderr);		free(query);		return 1;	}	cnt = 0;	while ((mapi_fetch_row(hdl)) != 0) {		char *c_column = mapi_fetch_field(hdl, 0);		char *kc_nr = mapi_fetch_field(hdl, 1);		char *k_name = mapi_fetch_field(hdl, 2);		if (mapi_error(mid)) {			mapi_explain_query(hdl, stderr);			mapi_close_handle(hdl);			free(query);			return 1;		}		if (strcmp(kc_nr, "0") == 0) {			if (cnt)				putc(')', toConsole);			fprintf(toConsole, ",\n\t");			if (k_name) {				fprintf(toConsole, "CONSTRAINT ");				quoted_print(toConsole, k_name);				putc(' ', toConsole);			}			fprintf(toConsole, "UNIQUE (");			cnt = 1;		} else			fprintf(toConsole, ", ");		quoted_print(toConsole, c_column);	}	if (cnt)		putc(')', toConsole);	if (mapi_error(mid)) {		mapi_explain_query(hdl, stderr);		mapi_close_handle(hdl);		free(query);		return 1;	}	mapi_close_handle(hdl);	snprintf(query, maxquerylen,		 "SELECT \"pkt\".\"name\","		/* 0 */			"\"pkkc\".\"column\","		/* 1 */			"\"fkkc\".\"column\","		/* 2 */			"\"fkkc\".\"nr\","		/* 3 */			"\"fkk\".\"name\""		/* 4 */		 "FROM \"tables\" \"fkt\","		      "\"keycolumns\" \"fkkc\","		      "\"keys\" \"fkk\","		      "\"tables\" \"pkt\","		      "\"keycolumns\" \"pkkc\","		      "\"keys\" \"pkk\""		 "WHERE \"fkt\".\"id\" = \"fkk\".\"table_id\" AND "		       "\"pkt\".\"id\" = \"pkk\".\"table_id\" AND "		       "\"fkk\".\"id\" = \"fkkc\".\"id\" AND "		       "\"pkk\".\"id\" = \"pkkc\".\"id\" AND "		       "\"fkk\".\"rkey\" = \"pkk\".\"id\" AND "		       "\"fkkc\".\"nr\" = \"pkkc\".\"nr\" AND "		       "\"fkt\".\"name\" = '%s'"		 "ORDER BY \"fkk\".\"name\", \"nr\"", tname);	if ((hdl = mapi_query(mid, query)) == NULL || mapi_error(mid)) {		if (hdl) {			mapi_explain_query(hdl, stderr);			mapi_close_handle(hdl);		} else			mapi_explain(mid, stderr);		free(query);		return 1;	}	cnt = mapi_fetch_row(hdl);	while (cnt != 0) {		char *c_name = mapi_fetch_field(hdl, 0);		char *c_pcolumn = mapi_fetch_field(hdl, 1);		char *c_fcolumn = mapi_fetch_field(hdl, 2);		char *c_nr = mapi_fetch_field(hdl, 3);		char *c_fkname = mapi_fetch_field(hdl, 4);		char **fkeys, **pkeys;		int nkeys = 0;		if (mapi_error(mid)) {			mapi_explain_query(hdl, stderr);			mapi_close_handle(hdl);			free(query);			return 1;		}		assert(strcmp(c_nr, "0") == 0);		(void) c_nr;	/* pacify compilers in case assertions are disabled */		nkeys = 1;		fkeys = malloc(nkeys * sizeof(*fkeys));		pkeys = malloc(nkeys * sizeof(*pkeys));

⌨️ 快捷键说明

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