Beispiel #1
0
/*
* 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");
	}
}
JSObject* GetterSetterAccessCase::alternateBase() const
{
    if (customSlotBase())
        return customSlotBase();
    return conditionSet().slotBaseCondition().object();
}
Beispiel #3
0
/*
* 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);

}