Example #1
0
/*
 * test3 -- 削除
 */
Result test3()
{
    Condition condition;

    /*
     * 以下のクエリを実行
     * delete from TABLE_NAME where name != 'Mickey'
     */
    strcpy(condition.name, "name");
    condition.dataType = TYPE_VARCHAR;
    condition.operator = OPR_NOT_EQUAL;
    strcpy(condition.val.stringVal, "Mickey");

    if (deleteRecord(TABLE_NAME, &condition) != OK) {
        fprintf(stderr, "Cannot delete records.\n");
        return NG;
    }

    printf("delete from TABLE_NAME where name != 'Mickey'\n");
    /* データを表示する */
    printTableData(TABLE_NAME);

    printf("\n");

    /*
     * 以下のクエリを実行
     * delete from TABLE_NAME
     */
    strcpy(condition.name, "");
    condition.dataType = TYPE_UNKNOWN;
    condition.operator = OPR_UNKNOWN;
    strcpy(condition.val.stringVal, "");
    condition.val.intVal = 0;

    if (deleteRecord(TABLE_NAME, &condition) != OK) {
        fprintf(stderr, "Cannot delete records.\n");
        return NG;
    }

    printf("delete from TABLE_NAME\n");
    /* データを表示する */
    printTableData(TABLE_NAME);

    return OK;
}
Example #2
0
/*
 * test1 -- レコードの挿入
 */
Result test1()
{
    RecordData record;
    int i;

    /*
     * 以下のレコードを挿入
     * ('i04001', 'Mickey', 20, 'Urayasu')
     */
    i = 0;
    strcpy(record.fieldData[i].name, "id");
    record.fieldData[i].dataType = TYPE_VARCHAR;
    strcpy(record.fieldData[i].val.stringVal, "i04001");
    i++;

    strcpy(record.fieldData[i].name, "name");
    record.fieldData[i].dataType = TYPE_VARCHAR;
    strcpy(record.fieldData[i].val.stringVal, "Mickey");
    i++;

    strcpy(record.fieldData[i].name, "age");
    record.fieldData[i].dataType = TYPE_INT;
    record.fieldData[i].val.intVal = 20;
    i++;

    strcpy(record.fieldData[i].name, "weight");
    record.fieldData[i].dataType = TYPE_DOUBLE;
    record.fieldData[i].val.doubleVal = 65.4;
    i++;

    strcpy(record.fieldData[i].name, "address");
    record.fieldData[i].dataType = TYPE_VARCHAR;
    strcpy(record.fieldData[i].val.stringVal, "Urayasu");
    i++;

    record.numField = i;

    if (insertRecord(TABLE_NAME, &record) != OK) {
        fprintf(stderr, "Cannot insert record.\n");
        return NG;
    }

    /*
     * 以下のレコードを挿入
     * ('i04001', 'Mickey', 20, 'Urayasu')
     */
    i = 0;
    strcpy(record.fieldData[i].name, "id");
    record.fieldData[i].dataType = TYPE_VARCHAR;
    strcpy(record.fieldData[i].val.stringVal, "i04001");
    i++;

    strcpy(record.fieldData[i].name, "name");
    record.fieldData[i].dataType = TYPE_VARCHAR;
    strcpy(record.fieldData[i].val.stringVal, "Mickey");
    i++;

    strcpy(record.fieldData[i].name, "age");
    record.fieldData[i].dataType = TYPE_INT;
    record.fieldData[i].val.intVal = 20;
    i++;

    strcpy(record.fieldData[i].name, "weight");
    record.fieldData[i].dataType = TYPE_DOUBLE;
    record.fieldData[i].val.doubleVal = 65.4;
    i++;

    strcpy(record.fieldData[i].name, "address");
    record.fieldData[i].dataType = TYPE_VARCHAR;
    strcpy(record.fieldData[i].val.stringVal, "Urayasu");
    i++;

    record.numField = i;

    if (insertRecord(TABLE_NAME, &record) != OK) {
        fprintf(stderr, "Cannot insert record.\n");
        return NG;
    }

    /*
     * 以下のレコードを挿入
     * ('i04002', 'Minnie', 19, 'Urayasu')
     */
    i = 0;
    strcpy(record.fieldData[i].name, "id");
    record.fieldData[i].dataType = TYPE_VARCHAR;
    strcpy(record.fieldData[i].val.stringVal, "i04002");
    i++;

    strcpy(record.fieldData[i].name, "name");
    record.fieldData[i].dataType = TYPE_VARCHAR;
    strcpy(record.fieldData[i].val.stringVal, "Minnie");
    i++;

    strcpy(record.fieldData[i].name, "age");
    record.fieldData[i].dataType = TYPE_INT;
    record.fieldData[i].val.intVal = 19;
    i++;

    strcpy(record.fieldData[i].name, "weight");
    record.fieldData[i].dataType = TYPE_DOUBLE;
    record.fieldData[i].val.doubleVal = 46.8;
    i++;

    strcpy(record.fieldData[i].name, "address");
    record.fieldData[i].dataType = TYPE_VARCHAR;
    strcpy(record.fieldData[i].val.stringVal, "Urayasu");
    i++;

    record.numField = i;

    if (insertRecord(TABLE_NAME, &record) != OK) {
        fprintf(stderr, "Cannot insert record.\n");
        return NG;
    }

    /*
     * 以下のレコードを挿入
     * ('i04003', 'Donald', 17, 'Florida')
     */
    i = 0;
    strcpy(record.fieldData[i].name, "id");
    record.fieldData[i].dataType = TYPE_VARCHAR;
    strcpy(record.fieldData[i].val.stringVal, "i04003");
    i++;

    strcpy(record.fieldData[i].name, "name");
    record.fieldData[i].dataType = TYPE_VARCHAR;
    strcpy(record.fieldData[i].val.stringVal, "Donald");
    i++;

    strcpy(record.fieldData[i].name, "age");
    record.fieldData[i].dataType = TYPE_INT;
    record.fieldData[i].val.intVal = 17;
    i++;

    strcpy(record.fieldData[i].name, "weight");
    record.fieldData[i].dataType = TYPE_DOUBLE;
    record.fieldData[i].val.doubleVal = 98.34;
    i++;

    strcpy(record.fieldData[i].name, "address");
    record.fieldData[i].dataType = TYPE_VARCHAR;
    strcpy(record.fieldData[i].val.stringVal, "Florida");
    i++;

    record.numField = i;

    if (insertRecord(TABLE_NAME, &record) != OK) {
        fprintf(stderr, "Cannot insert record.\n");
        return NG;
    }

    /*
     * 以下のレコードを挿入
     * ('i04003', 'Donald', 17, 'Florida')
     */
    i = 0;
    strcpy(record.fieldData[i].name, "id");
    record.fieldData[i].dataType = TYPE_VARCHAR;
    strcpy(record.fieldData[i].val.stringVal, "i04003");
    i++;

    strcpy(record.fieldData[i].name, "name");
    record.fieldData[i].dataType = TYPE_VARCHAR;
    strcpy(record.fieldData[i].val.stringVal, "Donald");
    i++;

    strcpy(record.fieldData[i].name, "age");
    record.fieldData[i].dataType = TYPE_INT;
    record.fieldData[i].val.intVal = 17;
    i++;

    strcpy(record.fieldData[i].name, "weight");
    record.fieldData[i].dataType = TYPE_DOUBLE;
    record.fieldData[i].val.doubleVal = 98.34;
    i++;

    strcpy(record.fieldData[i].name, "address");
    record.fieldData[i].dataType = TYPE_VARCHAR;
    strcpy(record.fieldData[i].val.stringVal, "Florida");
    i++;

    record.numField = i;

    if (insertRecord(TABLE_NAME, &record) != OK) {
        fprintf(stderr, "Cannot insert record.\n");
        return NG;
    }

    /*
     * 以下のレコードを挿入
     * ('i04004', 'Daisy', 15, 'Florida')
     */
    i = 0;
    strcpy(record.fieldData[i].name, "id");
    record.fieldData[i].dataType = TYPE_VARCHAR;
    strcpy(record.fieldData[i].val.stringVal, "i04004");
    i++;

    strcpy(record.fieldData[i].name, "name");
    record.fieldData[i].dataType = TYPE_VARCHAR;
    strcpy(record.fieldData[i].val.stringVal, "Daisy");
    i++;

    strcpy(record.fieldData[i].name, "age");
    record.fieldData[i].dataType = TYPE_INT;
    record.fieldData[i].val.intVal = 15;
    i++;

    strcpy(record.fieldData[i].name, "weight");
    record.fieldData[i].dataType = TYPE_DOUBLE;
    record.fieldData[i].val.doubleVal = 39.1;
    i++;

    strcpy(record.fieldData[i].name, "address");
    record.fieldData[i].dataType = TYPE_VARCHAR;
    strcpy(record.fieldData[i].val.stringVal, "Florida");
    i++;

    record.numField = i;

    if (insertRecord(TABLE_NAME, &record) != OK) {
        fprintf(stderr, "Cannot insert record.\n");
        return NG;
    }

    /* データを表示する */
    printTableData(TABLE_NAME);

    return OK;
}
Example #3
0
File: main.c Project: 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);

}