Esempio n. 1
0
MenuItem::MenuItem(const char *capt, void *dataPointer, InputType inpType, int minVal, int maxVal, char **strList){
	subMenu = NULL;
	data = dataPointer;
	type = inpType;
	checked = false;
	stringList = strList;
	min = minVal;
	max = maxVal;

	unsigned int len = strlen(capt);
	caption = new char[len + 1];
	strcpy(caption, capt);
	if (dataPointer != NULL){
		if (inpType == INPUT_KEY){
			char *charString = getKeyString(*(unsigned int *) dataPointer);
			if (charString != NULL) setInputString(charString);
		} else if (inpType == INPUT_BOOL){
			setInputString(*(bool *) dataPointer? "True" : "False");
		} else if (inpType == INPUT_INTEGER){
			char str[16];
			if (stringList){
				setInputString(stringList[*(int *) dataPointer]);
			} else {
				sprintf(str, "%d", *(int *) dataPointer);
				setInputString(str);
			}
		}
	}
}
Esempio n. 2
0
File: main.c Progetto: sympe/microDB
/*
* callSelectRecord -- select文の構文解析とselectRecordの呼び出し
*
* 引数:
*	なし
*
* 返り値:
*	なし
*
* selectの書式:
*	select * from テーブル名 where 条件式
*	select フィールド名 , ... from テーブル名 where 条件式 (発展課題)
*/
void callSelectRecord()
{
	char *token;
	char *tableName;
	char *selectField;
	char *p;
	Condition condition;
	TableInfo *tableInfo;
	RecordSet *recordSet;
	int i, j;
	int numField;
	int allSelectFlag; /* *かどうかの判断 */
	char sendFieldName[MAX_FIELD][MAX_FIELD_NAME];

	for (i = 0; i < MAX_FIELD; i++){
		memset(&sendFieldName[i], '\0', MAX_FIELD_NAME);
	}

	/*selectの次のトークンを読み込み、distinctが存在するかをチェック */
	token = getNextToken();
	if (token == NULL) {
		/* 文法エラー */
		printf("入力行に間違いがあります。:%s\n", token);
		return;
	}

	if (strcmp(token, "distinct") == 0){
		condition.distinct = DISTINCT;

		/*次のトークンを読み込み、それが"*"かどうかをチェック */
		token = getNextToken();
		if (token == NULL) {
			/* 文法エラー */
			printf("入力行に間違いがあります。:%s\n", token);
			return;
		}
	}
	else{
		condition.distinct = NOT_DISTINCT;
	}

	selectField = (char *)malloc(sizeof(char)*MAX_FIELD_NAME*MAX_FIELD);
	p = selectField;
	numField = 0;
	if (strcmp(token, "*") != 0){
		allSelectFlag = 0;
		for (;;) {
			memcpy(p, token, strlen(token) + 1);
			p += strlen(token);

			/* フィールド数をカウントする */
			numField++;

			/* 次のトークンの読み込み */
			if ((token = getNextToken()) == NULL) {
				/* 文法エラー */
				printf("入力行に間違いがあります。%s\n", token);
				return;
			}

			/* 読み込んだトークンが"from"だったら、ループから抜ける */
			if (strcmp(token, "from") == 0) {
				break;
			}
			else if (strcmp(token, ",") == 0) {
				token = " ";
				memcpy(p, token, strlen(token) + 1);
				p += strlen(token);
				/* 次のトークンの読み込み */
				if ((token = getNextToken()) == NULL) {
					/* 文法エラー */
					printf("入力行に間違いがあります。%s\n", token);
					return;
				}
				continue;
			}
			else {
				/* 文法エラー */
				printf("入力行に間違いがあります。%s\n", token);
				return;
			}
		}
	}
	/* *だったら */
	else if (strcmp(token, "*") == 0){
		allSelectFlag = 1;
		token = getNextToken();
		if (strcmp(token, "from") != 0) {
			/* 文法エラー */
			printf("入力行に間違いがあります。:%s\n", token);
			return;
		}
	}
	/* テーブル名を読み込む */
	if ((tableName = getNextToken()) == NULL) {
		/* 文法エラー */
		printf("入力行に間違いがあります。:%s\n", tableName);
		return;
	}

	/*次のトークンを読み込み、それが"where"かどうかをチェック */
	token = getNextToken();

	/*条件が入力されなかったらすべてのレコードを表示*/
	if (token == NULL) {
		/* テーブルの情報を取得する */
		if ((tableInfo = getTableInfo(tableName)) == NULL) {
			/* エラー処理 */
			return;
		}
		numField = tableInfo->numField;
		printTableData(tableName, numField);
		freeTableInfo(tableInfo);
		free(selectField);
		return;
	}

	if (strcmp(token, "where") != 0) {
		/* 文法エラー */
		printf("入力行に間違いがあります。:%s\n", token);
		return;
	}

	/* 条件式のフィールド名を読み込む */
	if ((token = getNextToken()) == NULL){
		/* 文法エラー */
		printf("入力行に間違いがあります。:%s\n", token);
		return;
	}
	strcpy(condition.name, token);

	/* テーブルの情報を取得する */
	if ((tableInfo = getTableInfo(tableName)) == NULL) {
		/* エラー処理 */
		return;
	}

	/*条件式に指定されたフィールドのデータ型を調べる*/
	condition.dataType = TYPE_UNKNOWN;
	for (i = 0; i < tableInfo->numField; i++){
		if (strcmp(tableInfo->fieldInfo[i].name, condition.name) == 0){
			/* データ型をconditionにコピーしてループからぬける*/
			condition.dataType = tableInfo->fieldInfo[i].dataType;
			break;
		}
	}

	/*conditionを決定する*/
	conditionSet(token, &condition);

	/* selectRecordを呼び出し、レコードを検索 */
	if ((recordSet = selectRecord(tableName, &condition)) == NULL) {
		printf("レコードの検索に失敗しました。\n");
	}

	/*selectFieldがフィールド名にあるか調べる*/
	if (allSelectFlag == 0){
		setInputString(selectField);
		token = getNextToken();
		for (i = 0; i < MAX_FIELD; i++){
			if (token == NULL){
				break;
			}
			for (j = 0; j < tableInfo->numField; j++){
				/*tokenがフィールド名と一致したら*/
				if (strcmp(tableInfo->fieldInfo[j].name, token) == 0){
					strcpy(sendFieldName[i], token);
					token = getNextToken();
					break;
				}
				if (j == tableInfo->numField - 1){
					printf("そのフィールド名は存在しません%s\n", token);
					return;
				}
			}
		}

	}

	/* *の場合は */
	else{
		for (i = 0; i < tableInfo->numField; i++){
			strcpy(sendFieldName[i], tableInfo->fieldInfo[i].name);
		}
		numField = tableInfo->numField;
	}

	/*検索したレコード集合を表示*/
	printRecordSet(recordSet, sendFieldName, numField);

	/*解放*/
	free(selectField);
	freeTableInfo(tableInfo);
	freeRecordSet(recordSet);

}
Esempio n. 3
0
File: main.c Progetto: sympe/microDB
/*
* main -- マイクロDBシステムのエントリポイント
*/
int main()
{
	char input[MAX_INPUT];
	char *token;

	/* ファイルモジュールの初期化 */
	if (initializeFileModule() != OK) {
		fprintf(stderr, "Cannot initialize file module.\n");
		exit(1);
	}

	/* データ定義ジュールの初期化 */
	if (initializeDataDefModule() != OK) {
		fprintf(stderr, "Cannot initialize data definition module.\n");
		exit(1);
	}

	/* データ操作ジュールの初期化 */
	if (initializeDataManipModule() != OK) {
		fprintf(stderr, "Cannot initialize data manipulation module.\n");
		exit(1);
	}

	/* ウェルカムメッセージを出力 */
	printf("マイクロDBMSを起動しました。\n");

	/* 1行ずつ入力を読み込みながら、処理を行う */
	for (;;) {
		/* プロンプトの出力 */
		printf("\nDDLまたはDMLを入力してください。\n");
		printf("> ");

		/* キーボード入力を1行読み込む */
		fgets(input, MAX_INPUT, stdin);

		/* 入力の最後の改行を取り除く */
		if (strchr(input, '\n') != NULL) {
			*(strchr(input, '\n')) = '\0';
		}

		/* 字句解析するために入力文字列を設定する */
		setInputString(input);

		/* 最初のトークンを取り出す */
		token = getNextToken();

		/* 入力が空行だったら、ループの先頭に戻ってやり直し */
		if (token == NULL) {
			continue;
		}

		/* 入力が"quit"だったら、ループを抜けてプログラムを終了させる */
		if (strcmp(token, "quit") == 0) {
			printf("マイクロDBMSを終了します。\n\n");
			break;
		}

		/* 最初のトークンが何かによって、呼び出す関数を決める */
		if (strcmp(token, "create") == 0) {
			callCreateTable();
		}
		else if (strcmp(token, "drop") == 0) {
			callDropTable();
		}
		else if (strcmp(token, "insert") == 0) {
			callInsertRecord();
		}
		else if (strcmp(token, "select") == 0) {
			callSelectRecord();
		}
		else if (strcmp(token, "delete") == 0) {
			callDeleteRecord();
		}
		else if (strcmp(token, "show") == 0){
			showTables();
		}
		else if (strcmp(token, "test1") == 0){
			test1();
		}
		else {
			/* 入力に間違いがあった */
			printf("入力に間違いがあります。:%s\n", token);
			printf("もう一度入力し直してください。\n\n");
		}
	}

	/* 各モジュールの終了処理 */
	finalizeDataManipModule();
	finalizeDataDefModule();
	finalizeFileModule();
}