diff --git a/include/btree.h b/include/btree.h index 3e02583..cdcb1c9 100644 --- a/include/btree.h +++ b/include/btree.h @@ -12,7 +12,8 @@ typedef enum { BTREE_IO_ERROR, BTREE_DUPLICATE_KEY, BTREE_TABLE_FULL, - BTREE_CORRUPT + BTREE_CORRUPT, + BTREE_ROW_NOT_FOUND } BTreeResult; typedef struct BTree BTree; diff --git a/src/btree.c b/src/btree.c index bec39d2..8a1f144 100644 --- a/src/btree.c +++ b/src/btree.c @@ -779,7 +779,7 @@ BTreeResult btree_find(const BTree *tree, int id, Row *row) deserialize_row(row, const_leaf_cell(page, index)); return BTREE_OK; } - return BTREE_INVALID_ARGUMENT; + return BTREE_ROW_NOT_FOUND; } page_number = child_page_at(page, internal_child_index(page, id)); @@ -899,6 +899,8 @@ const char *btree_result_string(BTreeResult result) return "database capacity reached"; case BTREE_CORRUPT: return "database file is corrupt"; + case BTREE_ROW_NOT_FOUND: + return "row not found"; default: return "unknown error"; } diff --git a/src/database.c b/src/database.c index e4319a6..81eb884 100644 --- a/src/database.c +++ b/src/database.c @@ -93,7 +93,17 @@ Table *table_open(const char *filename, SqliteResult *result) btree_read_all(tree, table->rows, TABLE_ROW_CAPACITY, &table->size); if (read_result != BTREE_OK) { table_destroy(table); - *result = SQLITE_IO_ERROR; + switch (read_result) { + case BTREE_CORRUPT: + *result = SQLITE_CORRUPT; + break; + case BTREE_TABLE_FULL: + *result = SQLITE_TABLE_FULL; + break; + default: + *result = SQLITE_IO_ERROR; + break; + } return NULL; } @@ -222,11 +232,16 @@ SqliteResult table_find(const Table *table, int id, Row *row) return SQLITE_OK; } - if (result == BTREE_INVALID_ARGUMENT) { + switch (result) { + case BTREE_ROW_NOT_FOUND: return SQLITE_ROW_NOT_FOUND; + case BTREE_CORRUPT: + return SQLITE_CORRUPT; + case BTREE_TABLE_FULL: + return SQLITE_TABLE_FULL; + default: + return SQLITE_IO_ERROR; } - - return SQLITE_IO_ERROR; } const char *sqlite_result_string(SqliteResult result) diff --git a/tests/test_database.c b/tests/test_database.c index 04c5103..7b35f14 100644 --- a/tests/test_database.c +++ b/tests/test_database.c @@ -143,7 +143,7 @@ static void test_lookup(void) assert(found.id == 23); assert(strcmp(found.username, "user23") == 0); - assert(table_find(table, 99, &found) != SQLITE_OK); + assert(table_find(table, 99, &found) == SQLITE_ROW_NOT_FOUND); table_destroy(table); remove(filename);