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