You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

146 lines
3.9 KiB

#ifndef HAS_DATABASE_H
#define HAS_DATABASE_H 1
#define SIMDB_REC_LEN 48
#define SIMDB_VERSION 2
/* runtime flags */
#define SIMDB_FLAG_WRITE 1 << (0 + 0)
/* database capabilities */
#define SIMDB_CAP_BITMAP 1 << (8 + 0)
#define SIMDB_CAP_COLORS 1 << (8 + 1)
#define SIMDB_CAP_RATIO 1 << (8 + 2)
/* 3 used, 5 reserved */
#define SIMDB_SUCCESS 0
/* database errors */
#define SIMDB_ERR_SYSTEM -1 /* see errno for details */
#define SIMDB_ERR_OOM -2 /* can't allocate memory */
#define SIMDB_ERR_CORRUPTDB -3 /* empty or currupted database */
#define SIMDB_ERR_WRONGVERS -4 /* database version mismatch */
#define SIMDB_ERR_NXRECORD -5 /* no such record in database */
#define SIMDB_ERR_READONLY -6 /* database opened in read-only mode */
typedef struct _simdb_t simdb_t; /* opaque database type */
#define REC_OFF_RU 0 /* record is used */
#define REC_OFF_CR 1 /* color level: red */
#define REC_OFF_CG 2 /* color level: green */
#define REC_OFF_CB 3 /* color level: blue */
#define REC_OFF_IW 4 /* image width */
#define REC_OFF_IH 6 /* image height */
#define REC_OFF_BM 16 /* image bitmap */
/**
* block of sequental records of database
*/
typedef struct {
uint64_t start;
size_t records;
unsigned char *data;
} simdb_block_t;
/**
* database record
*/
typedef struct {
uint64_t num;
unsigned char data[SIMDB_REC_LEN];
} simdb_rec_t;
/**
* search parameters
* maxdiff_* fields should have value from 0.0 to 1.0 (0% - 100%)
*/
typedef struct {
uint8_t limit; /**< max results */
float maxdiff_bitmap; /**< max difference of luma bitmaps */
float maxdiff_ratio; /**< max difference of ratios, default - 7% */
} simdb_search_t;
/**
* search matches
*/
typedef struct {
uint64_t num; /**< record id */
float diff_ratio; /**< difference of ratio */
float diff_bitmap; /**< difference of bitmap */
} simdb_match_t;
/**
* @returns 1 on success, 0 if record missing and <0 on error
*/
int simdb_read_rec (simdb_t *db, simdb_rec_t *rec);
int simdb_write_rec(simdb_t *db, simdb_rec_t *rec);
int simdb_read_blk (simdb_t *db, simdb_block_t *blk);
int simdb_write_blk(simdb_t *db, simdb_block_t *blk);
/**
* @brief Creates empty database at given path
* @param path Path to database
* @returns true on success, and false on error
* @note See errno value for details
* @todo 2nd arg: caps
*/
bool simdb_create(const char *path);
/**
* @brief Open database at given path
* @param path Path to database
* @param mode Database open modes. See SIMDB_FLAG_* defines above
* @param error Pointer to error code storage
* @returns Pointer to database handle on success, NULL on error
* @note use @a simdb_error() to get error description
*/
simdb_t * simdb_open(const char *path, int mode, int *error);
/**
* @brief Close database and free associated resources
* @param db Database handle
*/
void simdb_close(simdb_t *db);
/**
* @brief Get error desctiption by error code
* @param error Error code, see SIMDB_ERR_* defines above
*/
const char * simdb_error(int code);
/**
* @returns: >0 if found some matches, 0 if nothing found, <0 on error
*/
int
simdb_search(simdb_t * const db,
simdb_rec_t * const sample,
simdb_search_t * const search,
simdb_match_t ** matches);
/**
* @returns: number of records in database
*/
uint64_t
simdb_records_count(simdb_t * const db);
/**
@brief Fills buffer 'map' according to records existense in database
@returns records processed (and also buffer size)
*/
uint64_t
simdb_usage_map(simdb_t * const db,
char ** const map);
/**
* @brief Fills buffer 'map' according to records existense in given range
* @param offset start of slice position
* @param limit slice size
* @returns records processed (and also buffer size)
*/
uint16_t
simdb_usage_slice(simdb_t * const db,
char ** const map,
uint64_t offset,
uint16_t limit);
#endif