diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 08a8e8e..48619eb 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -15,15 +15,7 @@ if (WITH_TOOLS) add_executable("simdb-1to2" "simdb-1to2.c") install(TARGETS "simdb-1to2" RUNTIME DESTINATION "bin") - add_executable("simdb-query" "simdb-query.c") - target_link_libraries("simdb-query" "simdb") - install(TARGETS "simdb-query" RUNTIME DESTINATION "bin") - - if (${SAMPLER} STREQUAL "dummy") - message(STATUS "Sampler set to 'dummy', not building 'simdb-write' tool") - else () - add_executable("simdb-write" "simdb-write.c") - target_link_libraries("simdb-write" "simdb") - install(TARGETS "simdb-write" RUNTIME DESTINATION "bin") - endif () + add_executable("simdb-tool" "simdb-tool.c") + target_link_libraries("simdb-tool" "simdb") + install(TARGETS "simdb-tool" RUNTIME DESTINATION "bin") endif () diff --git a/src/simdb-query.c b/src/simdb-tool.c similarity index 82% rename from src/simdb-query.c rename to src/simdb-tool.c index 6ede835..749bf4c 100644 --- a/src/simdb-query.c +++ b/src/simdb-tool.c @@ -30,9 +30,12 @@ void usage(int exitcode) { " -t Maximum difference pct (0 - 50, default: 10%%)\n" ); fprintf(stderr, +" -A , Add sample from 'path' as record 'num'\n" " -B Show bitmap for this sample\n" " -C , Show difference percent for this samples\n" +" -D Delete record \n" " -F , Show difference bitmap for this samples\n" +" -I Create database (init)\n" " -S Search for images similar ot this sample\n" " -U Show db usage map, entries per column\n" " Special case - 0, output will be single line\n" @@ -45,8 +48,9 @@ void usage(int exitcode) { /** * @brief Print bitmap to stdout as ascii-square * @param map Source bitmap - * @note Height of "square" is equals to BITMAP_SIDE, - * but width is BITMAP_SIDE x 2, for ease of reading + * @parma side Side of the bitmap side + * @note Height of "square" is equals to @a side, + * but width is side x 2, for ease of reading */ void bitmap_print(const char *map, size_t side) { @@ -93,8 +97,7 @@ int search_similar(simdb_t *db, int num, float maxdiff) { return 0; } -int db_usage_map(simdb_t *db, unsigned short int cols) -{ +int db_usage_map(simdb_t *db, unsigned short int cols) { char *map = NULL; char *m = NULL; char row[256]; @@ -133,8 +136,7 @@ int db_usage_map(simdb_t *db, unsigned short int cols) return 0; } -int db_usage_slice(simdb_t *db, int offset, uint16_t limit) -{ +int db_usage_slice(simdb_t *db, int offset, uint16_t limit) { char *map = NULL; limit = simdb_usage_slice(db, &map, offset, limit); @@ -219,12 +221,12 @@ int rec_diff(simdb_t *db, int a, int b, unsigned short int showmap) { return ret; } -int main(int argc, char **argv) -{ - enum { undef, search, bitmap, usage_map, usage_slice, diff } mode = undef; +int main(int argc, char **argv) { + enum { undef, add, del, init, search, bitmap, usage_map, usage_slice, diff } mode = undef; const char *db_path = NULL; float maxdiff = 0.10; unsigned short int cols = 64, map = 0, ret = 0; + char *sample = NULL; simdb_t *db = NULL; int a = 0, b = 0; char *c = NULL; @@ -234,7 +236,7 @@ int main(int argc, char **argv) if (argc < 3) usage(EXIT_FAILURE); - while ((opt = getopt(argc, argv, "b:t:B:C:F:S:U:W:")) != -1) { + while ((opt = getopt(argc, argv, "b:t:A:B:C:D:F:IS:U:W:")) != -1) { switch (opt) { case 'b' : db_path = optarg; @@ -247,10 +249,24 @@ int main(int argc, char **argv) } maxdiff /= 100; break; + case 'A' : + mode = add; + if ((c = strchr(optarg, ',')) == NULL) + usage(EXIT_FAILURE); + a = atoll(optarg); + sample = c + 1; + break; case 'B' : mode = bitmap; a = atoll(optarg); break; + case 'D' : + mode = del; + a = atoll(optarg); + break; + case 'I' : + mode = init; + break; case 'F' : map = 1; case 'C' : @@ -288,12 +304,37 @@ int main(int argc, char **argv) exit(EXIT_FAILURE); } + if (mode == init) { + if (!simdb_create(db_path)) { + fprintf(stderr, "database init: %s\n", strerror(errno)); + exit(EXIT_FAILURE); + } + } if ((db = simdb_open(db_path, 0, &err)) == NULL) { fprintf(stderr, "database open: %d\n", err); exit(EXIT_FAILURE); } switch (mode) { + case add : + if (a == 0 || sample == NULL) + usage(EXIT_FAILURE); + if ((err = simdb_record_add(db, a, sample, 0)) < 0) { + fprintf(stderr, "%s\n", simdb_error(err)); + exit(EXIT_FAILURE); + } else { + fprintf(stderr, "added as record #%d", err); + } + break; + case del : + if ((err = simdb_record_del(db, a)) < 0) { + fprintf(stderr, "%s\n", simdb_error(err)); + exit(EXIT_FAILURE); + } + break; + case init : + /* this case already handled above */ + break; case search : if (a <= 0) { fprintf(stderr, "can't parse number\n"); diff --git a/src/simdb-write.c b/src/simdb-write.c deleted file mode 100644 index da8ad72..0000000 --- a/src/simdb-write.c +++ /dev/null @@ -1,103 +0,0 @@ -#include "common.h" -#include "simdb.h" - -#include - -void usage(int exitcode) { - fprintf(stderr, -"Usage: simdb-write \n" -" -b Path to database\n" -); - fprintf(stderr, -" -A , Add sample from 'path' as record 'num'\n" -" -D Delete record \n" -" -I Create database (init)\n" -); - exit(exitcode); -} - -int main(int argc, char **argv) -{ - enum { undef, add, del, init } mode = undef; - char opt; - const char *db_path = NULL; - const char *sample = NULL; - const char *c = NULL; - simdb_t *db = NULL; - int num = 0, err = 0; - - if (argc < 3) - usage(EXIT_FAILURE); - - while ((opt = getopt(argc, argv, "b:A:D:I")) != -1) { - switch (opt) { - case 'b' : - db_path = optarg; - break; - case 'h' : - usage(EXIT_SUCCESS); - break; - case 'A' : - mode = add; - if ((c = strchr(optarg, ',')) == NULL) - usage(EXIT_FAILURE); - num = atoll(optarg); - sample = c + 1; - break; - case 'D' : - mode = del; - num = atoll(optarg); - break; - case 'I' : - mode = init; - break; - default : - usage(EXIT_FAILURE); - break; - } - } - - if (db_path == NULL) { - fprintf(stderr, "error: db path not set\n"); - usage(EXIT_FAILURE); - } - - if (mode == init) { - if (!simdb_create(db_path)) { - fprintf(stderr, "database init: %s\n", strerror(errno)); - exit(EXIT_FAILURE); - } - } - if ((db = simdb_open(db_path, 1, &err)) == NULL) { - fprintf(stderr, "can't open database: %d\n", err); - exit(EXIT_FAILURE); - } - - switch (mode) { - case add : - if (num == 0 || sample == NULL) - usage(EXIT_FAILURE); - if ((err = simdb_record_add(db, num, sample, 0)) < 0) { - fprintf(stderr, "%s\n", simdb_error(err)); - exit(EXIT_FAILURE); - } else { - fprintf(stderr, "added as record #%d", err); - } - break; - case del : - if ((err = simdb_record_del(db, num)) < 0) { - fprintf(stderr, "%s\n", simdb_error(err)); - exit(EXIT_FAILURE); - } - break; - case init : - /* this case already handled above */ - break; - default: - usage(EXIT_FAILURE); - break; - } - simdb_close(db); - - exit(EXIT_SUCCESS); -}