示例#1
0
/*
 * printTableInfo -- テーブルのデータ定義情報を表示する(動作確認用)
 *
 * 引数:
 *  tableName: 情報を表示するテーブルの名前
 *
 * 返り値:
 *  なし
 */
void printTableInfo(char *tableName)
{
    TableInfo *tableInfo;
    int i;

    /* テーブル名を出力 */
    printf("\nTable %s\n", tableName);

    /* テーブルの定義情報を取得する */
    if ((tableInfo = getTableInfo(tableName)) == NULL) {
    /* テーブル情報の取得に失敗したので、処理をやめて返る */
    return;
    }

    /* フィールド数を出力 */
    printf("number of fields = %d\n", tableInfo->numField);

    /* フィールド情報を読み取って出力 */
    for (i = 0; i < tableInfo->numField; i++) {
    /* フィールド名の出力 */
    printf("  field %d: name = %s, ", i + 1, tableInfo->fieldInfo[i].name);

    /* データ型の出力 */
    printf("data type = ");
    switch (tableInfo->fieldInfo[i].dataType) {
    case TYPE_INTEGER:
        printf("integer\n");
        break;
    case TYPE_STRING:
        printf("string\n");
        break;
    default:
        printf("unknown\n");
    }
    }

    /* データ定義情報を解放する */
    freeTableInfo(tableInfo);

    return;
}
示例#2
0
文件: main.c 项目: sympe/microDB
/*
* callDeleteRecord -- delete文の構文解析とdeleteRecordの呼び出し
*
* 引数:
*	なし
*
* 返り値:
*	なし
*
* deleteの書式:
*	delete from テーブル名 where 条件式
*/
void callDeleteRecord()
{
	char *token;
	char *tableName;
	Condition condition;
	TableInfo *tableInfo;
	int i;

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


	/* テーブル名を読み込む */
	if ((tableName = getNextToken()) == NULL) {
		/* 文法エラー */
		printf("入力行に間違いがあります。:%s\n", tableName);
		return;
	}

	/*次のトークンを読み込み、それが"where"かどうかをチェック */
	token = getNextToken();
	if (token == NULL || 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;
		}
	}
	freeTableInfo(tableInfo);

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

	/* dereteRecordを呼び出し、レコードを削除 */
	if (deleteRecord(tableName, &condition) == OK) {
		printf("レコードを削除しました。\n");
	}
	else {
		printf("レコードの削除に失敗しました。\n");
	}
}
示例#3
0
文件: main.c 项目: 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);

}
示例#4
0
文件: main.c 项目: sympe/microDB
/*
* callInsertRecord -- insert文の構文解析とinsertRecordの呼び出し
*
* 引数:
*	なし
*
* 返り値:
*	なし
*
* insertの書式:
*	insert into テーブル名 values ( フィールド値 , ... )
*/
void callInsertRecord()
{
	char *token;
	char *tableName;
	int numField;
	RecordData *recordData;
	TableInfo *tableInfo;
	int i;

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

	/* テーブル名を読み込む */
	if ((tableName = getNextToken()) == NULL) {
		/* 文法エラー */
		printf("入力行に間違いがあります。:%s\n", tableName);
		return;
	}

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

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

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

	/*RecordData構造体のメモリを確保*/
	if ((recordData = (RecordData *)malloc(sizeof(RecordData))) == NULL){
		fprintf(stderr, "Malloc error.\n");
		return;
	}

	numField = 0;
	for (i = 0; i < tableInfo->numField; i++) {
		/* フィールド名の読み込み */
		if ((token = getNextToken()) == NULL) {
			/* 文法エラー */
			printf("入力行に間違いがあります。%s\n", token);
			freeTableInfo(tableInfo);
			return;
		}

		switch (tableInfo->fieldInfo[i].dataType) {
		case TYPE_INTEGER:
			recordData->fieldData[i].intValue = atoi(token);
			break;
		case TYPE_STRING:
			strcpy(recordData->fieldData[i].stringValue, token);
			break;
		default:
			freeTableInfo(tableInfo);
			return;
		}
		numField++;

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

		if (strcmp(token, ")") == 0){
			/*ループから出る*/
			break;
		}
		else if (strcmp(token, ",") == 0) {
			/* 次のフィールドを読み込むため、ループの先頭へ */
			continue;
		}
		else {
			/* 文法エラー */
			printf("入力行に間違いがあります。\n");
			freeTableInfo(tableInfo);
			return;
		}
	}

	if (numField != tableInfo->numField){
		return;
	}
	freeTableInfo(tableInfo);

	/* insertRecordを呼び出し、レコードを挿入 */
	if (insertRecord(tableName, recordData) == OK) {
		printf("レコードを挿入しました。\n");
	}
	else {
		printf("レコードの挿入に失敗しました。\n");
	}
	free(recordData);
}