// Copyright 2022 The Ip2Region Authors. All rights reserved. // Use of this source code is governed by a Apache2.0-style // license that can be found in the LICENSE file. // --- // @Author Lion // @Date 2022/06/27 #ifndef C_XDB_SEARCHER_H #define C_XDB_SEARCHER_H #include #include #include #if ( defined(WIN32) || defined(_WIN32) || defined(__WINDOWS_) || defined(WINNT) ) # define XDB_PUBLIC(type) extern __declspec(dllexport) type # define XDB_PRIVATE(type) static type # define XDB_WINDOWS #elif ( defined(linux) || defined(_UNIX) ) # define XDB_PUBLIC(type) extern type # define XDB_PRIVATE(type) static inline type # define XDB_LINUX #endif // memory allocation error #define XDB_ALLOCATE_ERROR(func, bytes) \ do { \ printf(": Allocate Error In Function <%s> For %lu Bytes.\n", func, (unsigned long int) bytes); \ return NULL; \ } while (0); #define xdb_calloc( _blocks, _bytes ) calloc( _blocks, _bytes ) #define xdb_malloc( _bytes ) malloc( _bytes ) #define xdb_free( _ptr ) free( _ptr ) #define field_size(type, field) sizeof(((type *)0)->field) #define sf_field_size(type, field) (sizeof(((type *)0)->field) - 1) // xdb searcher structure struct xdb_searcher_entry { FILE *handle; // header info const char *header; int io_count; // vector index buffer cache. // preload the vector index will reduce the number of IO operations // thus speedup the search process. const char *vector_index; // content buffer. // cache the whole xdb content. const char *content_buff; }; typedef struct xdb_searcher_entry xdb_searcher_t; // xdb searcher new api define XDB_PUBLIC(int) xdb_new_with_file_only(xdb_searcher_t *, char *); XDB_PUBLIC(int) xdb_new_with_vector_index(xdb_searcher_t *, char *, char *); XDB_PUBLIC(int) xdb_new_with_buffer(xdb_searcher_t *, char *); XDB_PUBLIC(void) xdb_close(xdb_searcher_t *); // xdb searcher search api define XDB_PUBLIC(int) xdb_search(unsigned int, char *); XDB_PUBLIC(int) xdb_search_by_string(const char *, char *); // get unsigned long (4bytes) from a specified buffer start from the specified offset with little-endian XDB_PUBLIC(unsigned int) get_unsigned_int(const char *, int); // get unsigned short (2bytes) from a specified buffer start from the specified offset with little-endian XDB_PUBLIC(unsigned int) get_unsigned_short(const char *, int); // check the specified string ip and convert it to an unsigned int XDB_PUBLIC(int) check_ip(const char *, unsigned int *); // unsigned int ip to string ip XDB_PUBLIC(void) long2ip(unsigned int, char *); #endif //C_XDB_SEARCHER_H