/* * 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(); }
/* * 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); }