コード例 #1
0
ファイル: main.c プロジェクト: wlgus3018/b-tree
/** Read and insert records into B+tree */
inline void Read_Data_And_Insert(char* buffer) {
    int rid = 0;
    int cur = 0;
    while (1) {
        while (cur < fsize && !('0' <= buffer[cur] && buffer[cur] <= '9')) cur++; // end of file
        if (cur == fsize) break;

        rid++;
      //  if (rid % 100000 == 0) printf("now inserting the %d th record ..\n", rid);
        new_key = 0;
        new_pos = cur;
        while (buffer[cur] != ' ' && buffer[cur] != '\t') {
            new_key = new_key * 10 + (buffer[cur] - '0');
            cur++;
        }
        cur++;
        new_len = 0;
        while (buffer[cur] == ' ') cur++; // util meet a character
        while (cur < fsize && buffer[cur] != '\n') {
            new_st[new_len++] = buffer[cur++];
        }
        new_st[new_len] = '\0';
        char* value = (char*)malloc(sizeof(char) * new_len);
        strcpy(value, new_st);
        keys[key_num++] = new_key;
        if (BPlusTree_Insert(new_key, new_pos, value) == true) validRecords++; // for "ex-data.txt", valid = 9950138
    }
    free(buffer);
    buffer = NULL;
}
コード例 #2
0
ファイル: main.c プロジェクト: Ryannnnnnn/B-Plus-Tree
void MainLoop() {
	double start_time, end_time;
	int built = false;

	// Read data to buffer
	Read_Buffer(input_file);
	// B+tree initialize
	BPlusTree_Init();
	while (1) {
		ShowHelp();
		int request;
		scanf("%d", &request);
		switch (request) {
			case 0: {
				// Read data to buffer
				if (buffer != NULL) free(buffer);
				Read_Buffer(input_file);
				// B+tree initialize
				BPlusTree_Init();
				// args
				built = false;
				validRecords = 0;
				break;
			}
			case 1: {
				// Set Depth
				printf("input depth: ");
				int depth;
				scanf("%d", &depth);
				int maxCh = 2;
				while (1) {
					int leaves = 1, i;
					for (i = 0; i < depth; i++) {
						leaves *= maxCh;
						if (leaves > TotalRecords) break;
					}
					if (leaves > TotalRecords) break;
					maxCh++;
				}
				printf("Desired depth = %d, calculated maxChildNumber = %d\n", depth, maxCh);
				BPlusTree_SetMaxChildNumber(maxCh);
				break;
			}
			case 2: {
				// Set MaxChildNumber
				printf("input MaxChildNumber: ");
				int maxCh;
				scanf("%d", &maxCh);
				BPlusTree_SetMaxChildNumber(maxCh);
				break;
			}
			case 3: {
				// Build B+tree
				if (built == true) {
					printf("You have built the B+tree\n");
					break;
				}
				built = true;
				start_time = clock();
				Read_Data_And_Insert();
				end_time = clock();
				printf("Valid Records inserted on B+tree = %d\n", validRecords);
				printf("Total number of B+tree nodes = %d\n", BPlusTree_GetTotalNodes());
				printf("Build B+tree costs %lf s\n", (end_time - start_time) / CLOCKS_PER_SEC);
				break;
			}
			case 4: {
				// Query on a key
				printf("input the key: ");
				int key;
				scanf("%d", &key);
				start_time = clock();
				BPlusTree_Query_Key(key);
				end_time = clock();
				printf("Query on a key, costs %lf s\n", (end_time - start_time) / CLOCKS_PER_SEC);
				break;
			}
			case 5: {
				// Query on a range [l, r]
				printf("input range [l, r]: ");
				int l, r;
				scanf("%d %d", &l, &r);
				if (l > r) {
					printf("input illegal\n");
					break;
				}
				start_time = clock();
				BPlusTree_Query_Range(l, r);
				end_time = clock();
				printf("Query on a range, costs %lf s\n", (end_time - start_time) / CLOCKS_PER_SEC);
				break;
			}
			case 6: {
				// Modify value on a key
				printf("input (key, value): ");
				scanf("%d %s", &new_key, new_st);
				char* value = (char*)malloc(sizeof(char) * strlen(new_st));
				strcpy(value, new_st);
				start_time = clock();
				int pos = BPlusTree_Find(new_key);
				if (pos != -1) { // found
					if (File_Modify(pos, new_key, new_st)) { // file modify success
						BPlusTree_Modify(new_key, value);
						printf("Modify success.\n");
					} else {
						printf("Modify failed, the new value is too long to store in file\n");
					}
				} else {
					printf("Modify failed, do not have the given key on B+tree.\n");
				}
				end_time = clock();
				printf("Modify value on a key, costs %lf s\n", (end_time - start_time) / CLOCKS_PER_SEC);
				break;
			}
			case 7: {
				// Delete value on a key
				printf("input key: ");
				int key;
				scanf("%d", &key);
				start_time = clock();
				int pos = BPlusTree_Find(key);
				if (pos != -1) { // found
					File_Delete(pos);
					BPlusTree_Delete(key);
					printf("Delete success.\n");
				} else {
					printf("Delete failed, do not have the given key on B+tree.\n");
				}
				end_time = clock();
				printf("Delete value on a key, costs %lf s\n", (end_time - start_time) / CLOCKS_PER_SEC);
				break;
			}
			case 8: {
				printf("input (key, value): ");
				scanf("%d %s", &new_key, new_st);
				char* value = (char*)malloc(sizeof(char) * new_len);
				strcpy(value, new_st);

				int pos = BPlusTree_Find(new_key);
				if (pos == -1) {
					new_pos = File_Insert(new_key, new_st);
					keys[key_num++] = new_key;
					BPlusTree_Insert(new_key, new_pos, value);
					validRecords++;
					printf("Insert success.\n");
				} else {
					printf("Insert failed, the key already exist.\n");
				}
				break;
			}
			case 9: return;
			default: break;
		}
	}
	BPlusTree_Destroy();
}