github.com/cellofellow/gopkg@v0.0.0-20140722061823-eec0544a62ad/database/unqlite/unqlite.h (about)

     1  /* This file was automatically generated.  Do not edit (Except for compile time directives)! */ 
     2  #ifndef _UNQLITE_H_
     3  #define _UNQLITE_H_
     4  /*
     5   * Symisc UnQLite: An Embeddable NoSQL (Post Modern) Database Engine.
     6   * Copyright (C) 2012-2013, Symisc Systems http://unqlite.org/
     7   * Version 1.1.6
     8   * For information on licensing, redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES
     9   * please contact Symisc Systems via:
    10   *       legal@symisc.net
    11   *       licensing@symisc.net
    12   *       contact@symisc.net
    13   * or visit:
    14   *      http://unqlite.org/licensing.html
    15   */
    16  /*
    17   * Copyright (C) 2012, 2013 Symisc Systems, S.U.A.R.L [M.I.A.G Mrad Chems Eddine <chm@symisc.net>].
    18   * All rights reserved.
    19   *
    20   * Redistribution and use in source and binary forms, with or without
    21   * modification, are permitted provided that the following conditions
    22   * are met:
    23   * 1. Redistributions of source code must retain the above copyright
    24   *    notice, this list of conditions and the following disclaimer.
    25   * 2. Redistributions in binary form must reproduce the above copyright
    26   *    notice, this list of conditions and the following disclaimer in the
    27   *    documentation and/or other materials provided with the distribution.
    28   *
    29   * THIS SOFTWARE IS PROVIDED BY SYMISC SYSTEMS ``AS IS'' AND ANY EXPRESS
    30   * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
    31   * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
    32   * NON-INFRINGEMENT, ARE DISCLAIMED.  IN NO EVENT SHALL SYMISC SYSTEMS
    33   * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    34   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    35   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
    36   * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
    37   * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
    38   * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
    39   * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    40   */
    41   /* $SymiscID: unqlite.h v1.1 UNIX|WIN32/64 2012-11-02 02:10 stable <chm@symisc.net> $ */
    42  #include <stdarg.h> /* needed for the definition of va_list */
    43  /*
    44   * Compile time engine version, signature, identification in the symisc source tree
    45   * and copyright notice.
    46   * Each macro have an equivalent C interface associated with it that provide the same
    47   * information but are associated with the library instead of the header file.
    48   * Refer to [unqlite_lib_version()], [unqlite_lib_signature()], [unqlite_lib_ident()] and
    49   * [unqlite_lib_copyright()] for more information.
    50   */
    51  /*
    52   * The UNQLITE_VERSION C preprocessor macroevaluates to a string literal
    53   * that is the unqlite version in the format "X.Y.Z" where X is the major
    54   * version number and Y is the minor version number and Z is the release
    55   * number.
    56   */
    57  #define UNQLITE_VERSION "1.1.6"
    58  /*
    59   * The UNQLITE_VERSION_NUMBER C preprocessor macro resolves to an integer
    60   * with the value (X*1000000 + Y*1000 + Z) where X, Y, and Z are the same
    61   * numbers used in [UNQLITE_VERSION].
    62   */
    63  #define UNQLITE_VERSION_NUMBER 1001006
    64  /*
    65   * The UNQLITE_SIG C preprocessor macro evaluates to a string
    66   * literal which is the public signature of the unqlite engine.
    67   * This signature could be included for example in a host-application
    68   * generated Server MIME header as follows:
    69   *   Server: YourWebServer/x.x unqlite/x.x.x \r\n
    70   */
    71  #define UNQLITE_SIG "unqlite/1.1.6"
    72  /*
    73   * UnQLite identification in the Symisc source tree:
    74   * Each particular check-in of a particular software released
    75   * by symisc systems have an unique identifier associated with it.
    76   * This macro hold the one associated with unqlite.
    77   */
    78  #define UNQLITE_IDENT "unqlite:b172a1e2c3f62fb35c8e1fb2795121f82356cad6"
    79  /*
    80   * Copyright notice.
    81   * If you have any questions about the licensing situation, please
    82   * visit http://unqlite.org/licensing.html
    83   * or contact Symisc Systems via:
    84   *   legal@symisc.net
    85   *   licensing@symisc.net
    86   *   contact@symisc.net
    87   */
    88  #define UNQLITE_COPYRIGHT "Copyright (C) Symisc Systems, S.U.A.R.L [Mrad Chems Eddine <chm@symisc.net>] 2012-2013, http://unqlite.org/"
    89  
    90  /* Forward declaration to public objects */
    91  typedef struct unqlite_io_methods unqlite_io_methods;
    92  typedef struct unqlite_kv_methods unqlite_kv_methods;
    93  typedef struct unqlite_kv_engine unqlite_kv_engine;
    94  typedef struct jx9_io_stream unqlite_io_stream;
    95  typedef struct jx9_context unqlite_context;
    96  typedef struct jx9_value unqlite_value;
    97  typedef struct unqlite_vfs unqlite_vfs;
    98  typedef struct unqlite_vm unqlite_vm;
    99  typedef struct unqlite unqlite;
   100  /*
   101   * ------------------------------
   102   * Compile time directives
   103   * ------------------------------
   104   * For most purposes, UnQLite can be built just fine using the default compilation options.
   105   * However, if required, the compile-time options documented below can be used to omit UnQLite
   106   * features (resulting in a smaller compiled library size) or to change the default values
   107   * of some parameters.
   108   * Every effort has been made to ensure that the various combinations of compilation options
   109   * work harmoniously and produce a working library.
   110   *
   111   * UNQLITE_ENABLE_THREADS
   112   *  This option controls whether or not code is included in UnQLite to enable it to operate
   113   *  safely in a multithreaded environment. The default is not. All mutexing code is omitted
   114   *  and it is unsafe to use UnQLite in a multithreaded program. When compiled with the
   115   *  UNQLITE_ENABLE_THREADS directive enabled, UnQLite can be used in a multithreaded program
   116   *  and it is safe to share the same virtual machine and engine handle between two or more threads.
   117   *  The value of UNQLITE_ENABLE_THREADS can be determined at run-time using the unqlite_lib_is_threadsafe()
   118   *  interface.
   119   *  When UnQLite has been compiled with threading support then the threading mode can be altered
   120   * at run-time using the unqlite_lib_config() interface together with one of these verbs:
   121   *    UNQLITE_LIB_CONFIG_THREAD_LEVEL_SINGLE
   122   *    UNQLITE_LIB_CONFIG_THREAD_LEVEL_MULTI
   123   *  Platforms others than Windows and UNIX systems must install their own mutex subsystem via 
   124   *  unqlite_lib_config() with a configuration verb set to UNQLITE_LIB_CONFIG_USER_MUTEX.
   125   *  Otherwise the library is not threadsafe.
   126   *  Note that you must link UnQLite with the POSIX threads library under UNIX systems (i.e: -lpthread).
   127   *
   128   * Options To Omit/Enable Features
   129   *
   130   * The following options can be used to reduce the size of the compiled library by omitting optional
   131   * features. This is probably only useful in embedded systems where space is especially tight, as even
   132   * with all features included the UnQLite library is relatively small. Don't forget to tell your
   133   * compiler to optimize for binary size! (the -Os option if using GCC). Telling your compiler
   134   * to optimize for size usually has a much larger impact on library footprint than employing
   135   * any of these compile-time options.
   136   *
   137   * JX9_DISABLE_BUILTIN_FUNC
   138   *  Jx9 is shipped with more than 312 built-in functions suitable for most purposes like 
   139   *  string and INI processing, ZIP extracting, Base64 encoding/decoding, JSON encoding/decoding
   140   *  and so forth.
   141   *  If this directive is enabled, then all built-in Jx9 functions are omitted from the build.
   142   *  Note that special functions such as db_create(), db_store(), db_fetch(), etc. are not omitted
   143   *  from the build and are not affected by this directive.
   144   *
   145   * JX9_ENABLE_MATH_FUNC
   146   *  If this directive is enabled, built-in math functions such as sqrt(), abs(), log(), ceil(), etc.
   147   *  are included in the build. Note that you may need to link UnQLite with the math library in same
   148   *  Linux/BSD flavor (i.e: -lm).
   149   *
   150   * JX9_DISABLE_DISK_IO
   151   *  If this directive is enabled, built-in VFS functions such as chdir(), mkdir(), chroot(), unlink(),
   152   *  sleep(), etc. are omitted from the build.
   153   *
   154   * UNQLITE_ENABLE_JX9_HASH_IO
   155   * If this directive is enabled, built-in hash functions such as md5(), sha1(), md5_file(), crc32(), etc.
   156   * are included in the build.
   157   */
   158  /* Symisc public definitions */
   159  #if !defined(SYMISC_STANDARD_DEFS)
   160  #define SYMISC_STANDARD_DEFS
   161  #if defined (_WIN32) || defined (WIN32) || defined(__MINGW32__) || defined (_MSC_VER) || defined (_WIN32_WCE)
   162  /* Windows Systems */
   163  #if !defined(__WINNT__)
   164  #define __WINNT__
   165  #endif 
   166  /*
   167   * Determine if we are dealing with WindowsCE - which has a much
   168   * reduced API.
   169   */
   170  #if defined(_WIN32_WCE)
   171  #ifndef __WIN_CE__
   172  #define __WIN_CE__
   173  #endif /* __WIN_CE__ */
   174  #endif /* _WIN32_WCE */
   175  #else
   176  /*
   177   * By default we will assume that we are compiling on a UNIX systems.
   178   * Otherwise the OS_OTHER directive must be defined.
   179   */
   180  #if !defined(OS_OTHER)
   181  #if !defined(__UNIXES__)
   182  #define __UNIXES__
   183  #endif /* __UNIXES__ */
   184  #else
   185  #endif /* OS_OTHER */
   186  #endif /* __WINNT__/__UNIXES__ */
   187  #if defined(_MSC_VER) || defined(__BORLANDC__)
   188  typedef signed __int64     sxi64; /* 64 bits(8 bytes) signed int64 */
   189  typedef unsigned __int64   sxu64; /* 64 bits(8 bytes) unsigned int64 */
   190  #else
   191  typedef signed long long int   sxi64; /* 64 bits(8 bytes) signed int64 */
   192  typedef unsigned long long int sxu64; /* 64 bits(8 bytes) unsigned int64 */
   193  #endif /* _MSC_VER */
   194  /* Signature of the consumer routine */
   195  typedef int (*ProcConsumer)(const void *, unsigned int, void *);
   196  /* Forward reference */
   197  typedef struct SyMutexMethods SyMutexMethods;
   198  typedef struct SyMemMethods SyMemMethods;
   199  typedef struct SyString SyString;
   200  typedef struct syiovec syiovec;
   201  typedef struct SyMutex SyMutex;
   202  typedef struct Sytm Sytm;
   203  /* Scatter and gather array. */
   204  struct syiovec
   205  {
   206  #if defined (__WINNT__)
   207  	/* Same fields type and offset as WSABUF structure defined one winsock2 header */
   208  	unsigned long nLen;
   209  	char *pBase;
   210  #else
   211  	void *pBase;
   212  	unsigned long nLen;
   213  #endif
   214  };
   215  struct SyString
   216  {
   217  	const char *zString;  /* Raw string (may not be null terminated) */
   218  	unsigned int nByte;   /* Raw string length */
   219  };
   220  /* Time structure. */
   221  struct Sytm
   222  {
   223    int tm_sec;     /* seconds (0 - 60) */
   224    int tm_min;     /* minutes (0 - 59) */
   225    int tm_hour;    /* hours (0 - 23) */
   226    int tm_mday;    /* day of month (1 - 31) */
   227    int tm_mon;     /* month of year (0 - 11) */
   228    int tm_year;    /* year + 1900 */
   229    int tm_wday;    /* day of week (Sunday = 0) */
   230    int tm_yday;    /* day of year (0 - 365) */
   231    int tm_isdst;   /* is summer time in effect? */
   232    char *tm_zone;  /* abbreviation of timezone name */
   233    long tm_gmtoff; /* offset from UTC in seconds */
   234  };
   235  /* Convert a tm structure (struct tm *) found in <time.h> to a Sytm structure */
   236  #define STRUCT_TM_TO_SYTM(pTM, pSYTM) \
   237  	(pSYTM)->tm_hour = (pTM)->tm_hour;\
   238  	(pSYTM)->tm_min	 = (pTM)->tm_min;\
   239  	(pSYTM)->tm_sec	 = (pTM)->tm_sec;\
   240  	(pSYTM)->tm_mon	 = (pTM)->tm_mon;\
   241  	(pSYTM)->tm_mday = (pTM)->tm_mday;\
   242  	(pSYTM)->tm_year = (pTM)->tm_year + 1900;\
   243  	(pSYTM)->tm_yday = (pTM)->tm_yday;\
   244  	(pSYTM)->tm_wday = (pTM)->tm_wday;\
   245  	(pSYTM)->tm_isdst = (pTM)->tm_isdst;\
   246  	(pSYTM)->tm_gmtoff = 0;\
   247  	(pSYTM)->tm_zone = 0;
   248  
   249  /* Convert a SYSTEMTIME structure (LPSYSTEMTIME: Windows Systems only ) to a Sytm structure */
   250  #define SYSTEMTIME_TO_SYTM(pSYSTIME, pSYTM) \
   251  	 (pSYTM)->tm_hour = (pSYSTIME)->wHour;\
   252  	 (pSYTM)->tm_min  = (pSYSTIME)->wMinute;\
   253  	 (pSYTM)->tm_sec  = (pSYSTIME)->wSecond;\
   254  	 (pSYTM)->tm_mon  = (pSYSTIME)->wMonth - 1;\
   255  	 (pSYTM)->tm_mday = (pSYSTIME)->wDay;\
   256  	 (pSYTM)->tm_year = (pSYSTIME)->wYear;\
   257  	 (pSYTM)->tm_yday = 0;\
   258  	 (pSYTM)->tm_wday = (pSYSTIME)->wDayOfWeek;\
   259  	 (pSYTM)->tm_gmtoff = 0;\
   260  	 (pSYTM)->tm_isdst = -1;\
   261  	 (pSYTM)->tm_zone = 0;
   262  
   263  /* Dynamic memory allocation methods. */
   264  struct SyMemMethods 
   265  {
   266  	void * (*xAlloc)(unsigned int);          /* [Required:] Allocate a memory chunk */
   267  	void * (*xRealloc)(void *, unsigned int); /* [Required:] Re-allocate a memory chunk */
   268  	void   (*xFree)(void *);                 /* [Required:] Release a memory chunk */
   269  	unsigned int  (*xChunkSize)(void *);     /* [Optional:] Return chunk size */
   270  	int    (*xInit)(void *);                 /* [Optional:] Initialization callback */
   271  	void   (*xRelease)(void *);              /* [Optional:] Release callback */
   272  	void  *pUserData;                        /* [Optional:] First argument to xInit() and xRelease() */
   273  };
   274  /* Out of memory callback signature. */
   275  typedef int (*ProcMemError)(void *);
   276  /* Mutex methods. */
   277  struct SyMutexMethods 
   278  {
   279  	int (*xGlobalInit)(void);		/* [Optional:] Global mutex initialization */
   280  	void  (*xGlobalRelease)(void);	/* [Optional:] Global Release callback () */
   281  	SyMutex * (*xNew)(int);	        /* [Required:] Request a new mutex */
   282  	void  (*xRelease)(SyMutex *);	/* [Optional:] Release a mutex  */
   283  	void  (*xEnter)(SyMutex *);	    /* [Required:] Enter mutex */
   284  	int (*xTryEnter)(SyMutex *);    /* [Optional:] Try to enter a mutex */
   285  	void  (*xLeave)(SyMutex *);	    /* [Required:] Leave a locked mutex */
   286  };
   287  #if defined (_MSC_VER) || defined (__MINGW32__) ||  defined (__GNUC__) && defined (__declspec)
   288  #define SX_APIIMPORT	__declspec(dllimport)
   289  #define SX_APIEXPORT	__declspec(dllexport)
   290  #else
   291  #define	SX_APIIMPORT
   292  #define	SX_APIEXPORT
   293  #endif
   294  /* Standard return values from Symisc public interfaces */
   295  #define SXRET_OK       0      /* Not an error */	
   296  #define SXERR_MEM      (-1)   /* Out of memory */
   297  #define SXERR_IO       (-2)   /* IO error */
   298  #define SXERR_EMPTY    (-3)   /* Empty field */
   299  #define SXERR_LOCKED   (-4)   /* Locked operation */
   300  #define SXERR_ORANGE   (-5)   /* Out of range value */
   301  #define SXERR_NOTFOUND (-6)   /* Item not found */
   302  #define SXERR_LIMIT    (-7)   /* Limit reached */
   303  #define SXERR_MORE     (-8)   /* Need more input */
   304  #define SXERR_INVALID  (-9)   /* Invalid parameter */
   305  #define SXERR_ABORT    (-10)  /* User callback request an operation abort */
   306  #define SXERR_EXISTS   (-11)  /* Item exists */
   307  #define SXERR_SYNTAX   (-12)  /* Syntax error */
   308  #define SXERR_UNKNOWN  (-13)  /* Unknown error */
   309  #define SXERR_BUSY     (-14)  /* Busy operation */
   310  #define SXERR_OVERFLOW (-15)  /* Stack or buffer overflow */
   311  #define SXERR_WILLBLOCK (-16) /* Operation will block */
   312  #define SXERR_NOTIMPLEMENTED  (-17) /* Operation not implemented */
   313  #define SXERR_EOF      (-18) /* End of input */
   314  #define SXERR_PERM     (-19) /* Permission error */
   315  #define SXERR_NOOP     (-20) /* No-op */	
   316  #define SXERR_FORMAT   (-21) /* Invalid format */
   317  #define SXERR_NEXT     (-22) /* Not an error */
   318  #define SXERR_OS       (-23) /* System call return an error */
   319  #define SXERR_CORRUPT  (-24) /* Corrupted pointer */
   320  #define SXERR_CONTINUE (-25) /* Not an error: Operation in progress */
   321  #define SXERR_NOMATCH  (-26) /* No match */
   322  #define SXERR_RESET    (-27) /* Operation reset */
   323  #define SXERR_DONE     (-28) /* Not an error */
   324  #define SXERR_SHORT    (-29) /* Buffer too short */
   325  #define SXERR_PATH     (-30) /* Path error */
   326  #define SXERR_TIMEOUT  (-31) /* Timeout */
   327  #define SXERR_BIG      (-32) /* Too big for processing */
   328  #define SXERR_RETRY    (-33) /* Retry your call */
   329  #define SXERR_IGNORE   (-63) /* Ignore */
   330  #endif /* SYMISC_PUBLIC_DEFS */
   331  /* 
   332   * Marker for exported interfaces. 
   333   */
   334  #define UNQLITE_APIEXPORT SX_APIEXPORT
   335  /*
   336   * If compiling for a processor that lacks floating point
   337   * support, substitute integer for floating-point.
   338   */
   339  #ifdef UNQLITE_OMIT_FLOATING_POINT
   340  typedef sxi64 uqlite_real;
   341  #else
   342  typedef double unqlite_real;
   343  #endif
   344  typedef sxi64 unqlite_int64;
   345  /* Standard UnQLite return values */
   346  #define UNQLITE_OK      SXRET_OK      /* Successful result */
   347  /* Beginning of error codes */
   348  #define UNQLITE_NOMEM    SXERR_MEM     /* Out of memory */
   349  #define UNQLITE_ABORT    SXERR_ABORT   /* Another thread have released this instance */
   350  #define UNQLITE_IOERR    SXERR_IO      /* IO error */
   351  #define UNQLITE_CORRUPT  SXERR_CORRUPT /* Corrupt pointer */
   352  #define UNQLITE_LOCKED   SXERR_LOCKED  /* Forbidden Operation */ 
   353  #define UNQLITE_BUSY	 SXERR_BUSY    /* The database file is locked */
   354  #define UNQLITE_DONE	 SXERR_DONE    /* Operation done */
   355  #define UNQLITE_PERM     SXERR_PERM    /* Permission error */
   356  #define UNQLITE_NOTIMPLEMENTED SXERR_NOTIMPLEMENTED /* Method not implemented by the underlying Key/Value storage engine */
   357  #define UNQLITE_NOTFOUND SXERR_NOTFOUND /* No such record */
   358  #define UNQLITE_NOOP     SXERR_NOOP     /* No such method */
   359  #define UNQLITE_INVALID  SXERR_INVALID  /* Invalid parameter */
   360  #define UNQLITE_EOF      SXERR_EOF      /* End Of Input */
   361  #define UNQLITE_UNKNOWN  SXERR_UNKNOWN  /* Unknown configuration option */
   362  #define UNQLITE_LIMIT    SXERR_LIMIT    /* Database limit reached */
   363  #define UNQLITE_EXISTS   SXERR_EXISTS   /* Record exists */
   364  #define UNQLITE_EMPTY    SXERR_EMPTY    /* Empty record */
   365  #define UNQLITE_COMPILE_ERR (-70)       /* Compilation error */
   366  #define UNQLITE_VM_ERR      (-71)       /* Virtual machine error */
   367  #define UNQLITE_FULL        (-73)       /* Full database (unlikely) */
   368  #define UNQLITE_CANTOPEN    (-74)       /* Unable to open the database file */
   369  #define UNQLITE_READ_ONLY   (-75)       /* Read only Key/Value storage engine */
   370  #define UNQLITE_LOCKERR     (-76)       /* Locking protocol error */
   371  /* end-of-error-codes */
   372  /*
   373   * Database Handle Configuration Commands.
   374   *
   375   * The following set of constants are the available configuration verbs that can
   376   * be used by the host-application to configure an UnQLite database handle.
   377   * These constants must be passed as the second argument to [unqlite_config()].
   378   *
   379   * Each options require a variable number of arguments.
   380   * The [unqlite_config()] interface will return UNQLITE_OK on success, any other
   381   * return value indicates failure.
   382   * For a full discussion on the configuration verbs and their expected 
   383   * parameters, please refer to this page:
   384   *      http://unqlite.org/c_api/unqlite_config.html
   385   */
   386  #define UNQLITE_CONFIG_JX9_ERR_LOG         1  /* TWO ARGUMENTS: const char **pzBuf, int *pLen */
   387  #define UNQLITE_CONFIG_MAX_PAGE_CACHE      2  /* ONE ARGUMENT: int nMaxPage */
   388  #define UNQLITE_CONFIG_ERR_LOG             3  /* TWO ARGUMENTS: const char **pzBuf, int *pLen */
   389  #define UNQLITE_CONFIG_KV_ENGINE           4  /* ONE ARGUMENT: const char *zKvName */
   390  #define UNQLITE_CONFIG_DISABLE_AUTO_COMMIT 5  /* NO ARGUMENTS */
   391  #define UNQLITE_CONFIG_GET_KV_NAME         6  /* ONE ARGUMENT: const char **pzPtr */
   392  /*
   393   * UnQLite/Jx9 Virtual Machine Configuration Commands.
   394   *
   395   * The following set of constants are the available configuration verbs that can
   396   * be used by the host-application to configure the Jx9 (Via UnQLite) Virtual machine.
   397   * These constants must be passed as the second argument to the [unqlite_vm_config()] 
   398   * interface.
   399   * Each options require a variable number of arguments.
   400   * The [unqlite_vm_config()] interface will return UNQLITE_OK on success, any other return
   401   * value indicates failure.
   402   * There are many options but the most importants are: UNQLITE_VM_CONFIG_OUTPUT which install
   403   * a VM output consumer callback, UNQLITE_VM_CONFIG_HTTP_REQUEST which parse and register
   404   * a HTTP request and UNQLITE_VM_CONFIG_ARGV_ENTRY which populate the $argv array.
   405   * For a full discussion on the configuration verbs and their expected parameters, please
   406   * refer to this page:
   407   *      http://unqlite.org/c_api/unqlite_vm_config.html
   408   */
   409  #define UNQLITE_VM_CONFIG_OUTPUT           1  /* TWO ARGUMENTS: int (*xConsumer)(const void *pOut, unsigned int nLen, void *pUserData), void *pUserData */
   410  #define UNQLITE_VM_CONFIG_IMPORT_PATH      2  /* ONE ARGUMENT: const char *zIncludePath */
   411  #define UNQLITE_VM_CONFIG_ERR_REPORT       3  /* NO ARGUMENTS: Report all run-time errors in the VM output */
   412  #define UNQLITE_VM_CONFIG_RECURSION_DEPTH  4  /* ONE ARGUMENT: int nMaxDepth */
   413  #define UNQLITE_VM_OUTPUT_LENGTH           5  /* ONE ARGUMENT: unsigned int *pLength */
   414  #define UNQLITE_VM_CONFIG_CREATE_VAR       6  /* TWO ARGUMENTS: const char *zName, unqlite_value *pValue */
   415  #define UNQLITE_VM_CONFIG_HTTP_REQUEST     7  /* TWO ARGUMENTS: const char *zRawRequest, int nRequestLength */
   416  #define UNQLITE_VM_CONFIG_SERVER_ATTR      8  /* THREE ARGUMENTS: const char *zKey, const char *zValue, int nLen */
   417  #define UNQLITE_VM_CONFIG_ENV_ATTR         9  /* THREE ARGUMENTS: const char *zKey, const char *zValue, int nLen */
   418  #define UNQLITE_VM_CONFIG_EXEC_VALUE      10  /* ONE ARGUMENT: unqlite_value **ppValue */
   419  #define UNQLITE_VM_CONFIG_IO_STREAM       11  /* ONE ARGUMENT: const unqlite_io_stream *pStream */
   420  #define UNQLITE_VM_CONFIG_ARGV_ENTRY      12  /* ONE ARGUMENT: const char *zValue */
   421  #define UNQLITE_VM_CONFIG_EXTRACT_OUTPUT  13  /* TWO ARGUMENTS: const void **ppOut, unsigned int *pOutputLen */
   422  /*
   423   * Storage engine configuration commands.
   424   *
   425   * The following set of constants are the available configuration verbs that can
   426   * be used by the host-application to configure the underlying storage engine (i.e Hash, B+tree, R+tree).
   427   * These constants must be passed as the first argument to [unqlite_kv_config()].
   428   * Each options require a variable number of arguments.
   429   * The [unqlite_kv_config()] interface will return UNQLITE_OK on success, any other return
   430   * value indicates failure.
   431   * For a full discussion on the configuration verbs and their expected parameters, please
   432   * refer to this page:
   433   *      http://unqlite.org/c_api/unqlite_kv_config.html
   434   */
   435  #define UNQLITE_KV_CONFIG_HASH_FUNC  1 /* ONE ARGUMENT: unsigned int (*xHash)(const void *,unsigned int) */
   436  #define UNQLITE_KV_CONFIG_CMP_FUNC   2 /* ONE ARGUMENT: int (*xCmp)(const void *,const void *,unsigned int) */
   437  /*
   438   * Global Library Configuration Commands.
   439   *
   440   * The following set of constants are the available configuration verbs that can
   441   * be used by the host-application to configure the whole library.
   442   * These constants must be passed as the first argument to [unqlite_lib_config()].
   443   *
   444   * Each options require a variable number of arguments.
   445   * The [unqlite_lib_config()] interface will return UNQLITE_OK on success, any other return
   446   * value indicates failure.
   447   * Notes:
   448   * The default configuration is recommended for most applications and so the call to
   449   * [unqlite_lib_config()] is usually not necessary. It is provided to support rare 
   450   * applications with unusual needs. 
   451   * The [unqlite_lib_config()] interface is not threadsafe. The application must insure that
   452   * no other [unqlite_*()] interfaces are invoked by other threads while [unqlite_lib_config()]
   453   * is running. Furthermore, [unqlite_lib_config()] may only be invoked prior to library
   454   * initialization using [unqlite_lib_init()] or [unqlite_init()] or after shutdown
   455   * by [unqlite_lib_shutdown()]. If [unqlite_lib_config()] is called after [unqlite_lib_init()]
   456   * or [unqlite_init()] and before [unqlite_lib_shutdown()] then it will return UNQLITE_LOCKED.
   457   * For a full discussion on the configuration verbs and their expected parameters, please
   458   * refer to this page:
   459   *      http://unqlite.org/c_api/unqlite_lib.html
   460   */
   461  #define UNQLITE_LIB_CONFIG_USER_MALLOC            1 /* ONE ARGUMENT: const SyMemMethods *pMemMethods */ 
   462  #define UNQLITE_LIB_CONFIG_MEM_ERR_CALLBACK       2 /* TWO ARGUMENTS: int (*xMemError)(void *), void *pUserData */
   463  #define UNQLITE_LIB_CONFIG_USER_MUTEX             3 /* ONE ARGUMENT: const SyMutexMethods *pMutexMethods */ 
   464  #define UNQLITE_LIB_CONFIG_THREAD_LEVEL_SINGLE    4 /* NO ARGUMENTS */ 
   465  #define UNQLITE_LIB_CONFIG_THREAD_LEVEL_MULTI     5 /* NO ARGUMENTS */ 
   466  #define UNQLITE_LIB_CONFIG_VFS                    6 /* ONE ARGUMENT: const unqlite_vfs *pVfs */
   467  #define UNQLITE_LIB_CONFIG_STORAGE_ENGINE         7 /* ONE ARGUMENT: unqlite_kv_methods *pStorage */
   468  #define UNQLITE_LIB_CONFIG_PAGE_SIZE              8 /* ONE ARGUMENT: int iPageSize */
   469  /*
   470   * These bit values are intended for use in the 3rd parameter to the [unqlite_open()] interface
   471   * and in the 4th parameter to the xOpen method of the [unqlite_vfs] object.
   472   */
   473  #define UNQLITE_OPEN_READONLY         0x00000001  /* Read only mode. Ok for [unqlite_open] */
   474  #define UNQLITE_OPEN_READWRITE        0x00000002  /* Ok for [unqlite_open] */
   475  #define UNQLITE_OPEN_CREATE           0x00000004  /* Ok for [unqlite_open] */
   476  #define UNQLITE_OPEN_EXCLUSIVE        0x00000008  /* VFS only */
   477  #define UNQLITE_OPEN_TEMP_DB          0x00000010  /* VFS only */
   478  #define UNQLITE_OPEN_NOMUTEX          0x00000020  /* Ok for [unqlite_open] */
   479  #define UNQLITE_OPEN_OMIT_JOURNALING  0x00000040  /* Omit journaling for this database. Ok for [unqlite_open] */
   480  #define UNQLITE_OPEN_IN_MEMORY        0x00000080  /* An in memory database. Ok for [unqlite_open]*/
   481  #define UNQLITE_OPEN_MMAP             0x00000100  /* Obtain a memory view of the whole file. Ok for [unqlite_open] */
   482  /*
   483   * Synchronization Type Flags
   484   *
   485   * When UnQLite invokes the xSync() method of an [unqlite_io_methods] object it uses
   486   * a combination of these integer values as the second argument.
   487   *
   488   * When the UNQLITE_SYNC_DATAONLY flag is used, it means that the sync operation only
   489   * needs to flush data to mass storage.  Inode information need not be flushed.
   490   * If the lower four bits of the flag equal UNQLITE_SYNC_NORMAL, that means to use normal
   491   * fsync() semantics. If the lower four bits equal UNQLITE_SYNC_FULL, that means to use
   492   * Mac OS X style fullsync instead of fsync().
   493   */
   494  #define UNQLITE_SYNC_NORMAL        0x00002
   495  #define UNQLITE_SYNC_FULL          0x00003
   496  #define UNQLITE_SYNC_DATAONLY      0x00010
   497  /*
   498   * File Locking Levels
   499   *
   500   * UnQLite uses one of these integer values as the second
   501   * argument to calls it makes to the xLock() and xUnlock() methods
   502   * of an [unqlite_io_methods] object.
   503   */
   504  #define UNQLITE_LOCK_NONE          0
   505  #define UNQLITE_LOCK_SHARED        1
   506  #define UNQLITE_LOCK_RESERVED      2
   507  #define UNQLITE_LOCK_PENDING       3
   508  #define UNQLITE_LOCK_EXCLUSIVE     4
   509  /*
   510   * CAPIREF: OS Interface: Open File Handle
   511   *
   512   * An [unqlite_file] object represents an open file in the [unqlite_vfs] OS interface
   513   * layer.
   514   * Individual OS interface implementations will want to subclass this object by appending
   515   * additional fields for their own use. The pMethods entry is a pointer to an
   516   * [unqlite_io_methods] object that defines methods for performing
   517   * I/O operations on the open file.
   518  */
   519  typedef struct unqlite_file unqlite_file;
   520  struct unqlite_file {
   521    const unqlite_io_methods *pMethods;  /* Methods for an open file. MUST BE FIRST */
   522  };
   523  /*
   524   * CAPIREF: OS Interface: File Methods Object
   525   *
   526   * Every file opened by the [unqlite_vfs] xOpen method populates an
   527   * [unqlite_file] object (or, more commonly, a subclass of the
   528   * [unqlite_file] object) with a pointer to an instance of this object.
   529   * This object defines the methods used to perform various operations
   530   * against the open file represented by the [unqlite_file] object.
   531   *
   532   * If the xOpen method sets the unqlite_file.pMethods element 
   533   * to a non-NULL pointer, then the unqlite_io_methods.xClose method
   534   * may be invoked even if the xOpen reported that it failed.  The
   535   * only way to prevent a call to xClose following a failed xOpen
   536   * is for the xOpen to set the unqlite_file.pMethods element to NULL.
   537   *
   538   * The flags argument to xSync may be one of [UNQLITE_SYNC_NORMAL] or
   539   * [UNQLITE_SYNC_FULL]. The first choice is the normal fsync().
   540   * The second choice is a Mac OS X style fullsync. The [UNQLITE_SYNC_DATAONLY]
   541   * flag may be ORed in to indicate that only the data of the file
   542   * and not its inode needs to be synced.
   543   *
   544   * The integer values to xLock() and xUnlock() are one of
   545   *
   546   * UNQLITE_LOCK_NONE
   547   * UNQLITE_LOCK_SHARED
   548   * UNQLITE_LOCK_RESERVED
   549   * UNQLITE_LOCK_PENDING
   550   * UNQLITE_LOCK_EXCLUSIVE
   551   * 
   552   * xLock() increases the lock. xUnlock() decreases the lock.
   553   * The xCheckReservedLock() method checks whether any database connection,
   554   * either in this process or in some other process, is holding a RESERVED,
   555   * PENDING, or EXCLUSIVE lock on the file. It returns true if such a lock exists
   556   * and false otherwise.
   557   * 
   558   * The xSectorSize() method returns the sector size of the device that underlies
   559   * the file. The sector size is the minimum write that can be performed without
   560   * disturbing other bytes in the file.
   561   *
   562   */
   563  struct unqlite_io_methods {
   564    int iVersion;                 /* Structure version number (currently 1) */
   565    int (*xClose)(unqlite_file*);
   566    int (*xRead)(unqlite_file*, void*, unqlite_int64 iAmt, unqlite_int64 iOfst);
   567    int (*xWrite)(unqlite_file*, const void*, unqlite_int64 iAmt, unqlite_int64 iOfst);
   568    int (*xTruncate)(unqlite_file*, unqlite_int64 size);
   569    int (*xSync)(unqlite_file*, int flags);
   570    int (*xFileSize)(unqlite_file*, unqlite_int64 *pSize);
   571    int (*xLock)(unqlite_file*, int);
   572    int (*xUnlock)(unqlite_file*, int);
   573    int (*xCheckReservedLock)(unqlite_file*, int *pResOut);
   574    int (*xSectorSize)(unqlite_file*);
   575  };
   576  /*
   577   * CAPIREF: OS Interface Object
   578   *
   579   * An instance of the unqlite_vfs object defines the interface between
   580   * the UnQLite core and the underlying operating system.  The "vfs"
   581   * in the name of the object stands for "Virtual File System".
   582   *
   583   * Only a single vfs can be registered within the UnQLite core.
   584   * Vfs registration is done using the [unqlite_lib_config()] interface
   585   * with a configuration verb set to UNQLITE_LIB_CONFIG_VFS.
   586   * Note that Windows and UNIX (Linux, FreeBSD, Solaris, Mac OS X, etc.) users
   587   * does not have to worry about registering and installing a vfs since UnQLite
   588   * come with a built-in vfs for these platforms that implements most the methods
   589   * defined below.
   590   *
   591   * Clients running on exotic systems (ie: Other than Windows and UNIX systems)
   592   * must register their own vfs in order to be able to use the UnQLite library.
   593   *
   594   * The value of the iVersion field is initially 1 but may be larger in
   595   * future versions of UnQLite. 
   596   *
   597   * The szOsFile field is the size of the subclassed [unqlite_file] structure
   598   * used by this VFS. mxPathname is the maximum length of a pathname in this VFS.
   599   * 
   600   * At least szOsFile bytes of memory are allocated by UnQLite to hold the [unqlite_file]
   601   * structure passed as the third argument to xOpen. The xOpen method does not have to
   602   * allocate the structure; it should just fill it in. Note that the xOpen method must
   603   * set the unqlite_file.pMethods to either a valid [unqlite_io_methods] object or to NULL.
   604   * xOpen must do this even if the open fails. UnQLite expects that the unqlite_file.pMethods
   605   * element will be valid after xOpen returns regardless of the success or failure of the
   606   * xOpen call.
   607   *
   608   */
   609  struct unqlite_vfs {
   610    const char *zName;       /* Name of this virtual file system [i.e: Windows, UNIX, etc.] */
   611    int iVersion;            /* Structure version number (currently 1) */
   612    int szOsFile;            /* Size of subclassed unqlite_file */
   613    int mxPathname;          /* Maximum file pathname length */
   614    int (*xOpen)(unqlite_vfs*, const char *zName, unqlite_file*,unsigned int flags);
   615    int (*xDelete)(unqlite_vfs*, const char *zName, int syncDir);
   616    int (*xAccess)(unqlite_vfs*, const char *zName, int flags, int *pResOut);
   617    int (*xFullPathname)(unqlite_vfs*, const char *zName,int buf_len,char *zBuf);
   618    int (*xTmpDir)(unqlite_vfs*,char *zBuf,int buf_len);
   619    int (*xSleep)(unqlite_vfs*, int microseconds);
   620    int (*xCurrentTime)(unqlite_vfs*,Sytm *pOut);
   621    int (*xGetLastError)(unqlite_vfs*, int, char *);
   622  };
   623  /*
   624   * Flags for the xAccess VFS method
   625   *
   626   * These integer constants can be used as the third parameter to
   627   * the xAccess method of an [unqlite_vfs] object.  They determine
   628   * what kind of permissions the xAccess method is looking for.
   629   * With UNQLITE_ACCESS_EXISTS, the xAccess method
   630   * simply checks whether the file exists.
   631   * With UNQLITE_ACCESS_READWRITE, the xAccess method
   632   * checks whether the named directory is both readable and writable
   633   * (in other words, if files can be added, removed, and renamed within
   634   * the directory).
   635   * The UNQLITE_ACCESS_READWRITE constant is currently used only by the
   636   * [temp_store_directory pragma], though this could change in a future
   637   * release of UnQLite.
   638   * With UNQLITE_ACCESS_READ, the xAccess method
   639   * checks whether the file is readable.  The UNQLITE_ACCESS_READ constant is
   640   * currently unused, though it might be used in a future release of
   641   * UnQLite.
   642   */
   643  #define UNQLITE_ACCESS_EXISTS    0
   644  #define UNQLITE_ACCESS_READWRITE 1   
   645  #define UNQLITE_ACCESS_READ      2 
   646  /*
   647   * The type used to represent a page number.  The first page in a file
   648   * is called page 1.  0 is used to represent "not a page".
   649   * A page number is an unsigned 64-bit integer.
   650   */
   651  typedef sxu64 pgno;
   652  /*
   653   * A database disk page is represented by an instance
   654   * of the follwoing structure.
   655   */
   656  typedef struct unqlite_page unqlite_page;
   657  struct unqlite_page
   658  {
   659    unsigned char *zData;       /* Content of this page */
   660    void *pUserData;            /* Extra content */
   661    pgno pgno;                  /* Page number for this page */
   662  };
   663  /*
   664   * UnQLite handle to the underlying Key/Value Storage Engine (See below).
   665   */
   666  typedef void * unqlite_kv_handle;
   667  /*
   668   * UnQLite pager IO methods.
   669   *
   670   * An instance of the following structure define the exported methods of the UnQLite pager
   671   * to the underlying Key/Value storage engine.
   672   */
   673  typedef struct unqlite_kv_io unqlite_kv_io;
   674  struct unqlite_kv_io
   675  {
   676  	unqlite_kv_handle  pHandle;     /* UnQLite handle passed as the first parameter to the
   677  									 * method defined below.
   678  									 */
   679  	unqlite_kv_methods *pMethods;   /* Underlying storage engine */
   680  	/* Pager methods */
   681  	int (*xGet)(unqlite_kv_handle,pgno,unqlite_page **);
   682  	int (*xLookup)(unqlite_kv_handle,pgno,unqlite_page **);
   683  	int (*xNew)(unqlite_kv_handle,unqlite_page **);
   684  	int (*xWrite)(unqlite_page *);
   685  	int (*xDontWrite)(unqlite_page *);
   686  	int (*xDontJournal)(unqlite_page *);
   687  	int (*xDontMkHot)(unqlite_page *);
   688  	int (*xPageRef)(unqlite_page *);
   689  	int (*xPageUnref)(unqlite_page *);
   690  	int (*xPageSize)(unqlite_kv_handle);
   691  	int (*xReadOnly)(unqlite_kv_handle);
   692  	unsigned char * (*xTmpPage)(unqlite_kv_handle);
   693  	void (*xSetUnpin)(unqlite_kv_handle,void (*xPageUnpin)(void *)); 
   694  	void (*xSetReload)(unqlite_kv_handle,void (*xPageReload)(void *));
   695  	void (*xErr)(unqlite_kv_handle,const char *);
   696  };
   697  /*
   698   * Key/Value Storage Engine Cursor Object
   699   *
   700   * An instance of a subclass of the following object defines a cursor
   701   * used to scan through a key-value storage engine.
   702   */
   703  typedef struct unqlite_kv_cursor unqlite_kv_cursor;
   704  struct unqlite_kv_cursor
   705  {
   706    unqlite_kv_engine *pStore; /* Must be first */
   707    /* Subclasses will typically add additional fields */
   708  };
   709  /*
   710   * Possible seek positions.
   711   */
   712  #define UNQLITE_CURSOR_MATCH_EXACT  1
   713  #define UNQLITE_CURSOR_MATCH_LE     2
   714  #define UNQLITE_CURSOR_MATCH_GE     3
   715  /*
   716   * Key/Value Storage Engine.
   717   *
   718   * A Key-Value storage engine is defined by an instance of the following
   719   * object.
   720   * UnQLite works with run-time interchangeable storage engines (i.e. Hash, B+Tree, R+Tree, LSM, etc.).
   721   * The storage engine works with key/value pairs where both the key
   722   * and the value are byte arrays of arbitrary length and with no restrictions on content.
   723   * UnQLite come with two built-in KV storage engine: A Virtual Linear Hash (VLH) storage
   724   * engine is used for persistent on-disk databases with O(1) lookup time and an in-memory
   725   * hash-table or Red-black tree storage engine is used for in-memory databases.
   726   * Future versions of UnQLite might add other built-in storage engines (i.e. LSM). 
   727   * Registration of a Key/Value storage engine at run-time is done via [unqlite_lib_config()]
   728   * with a configuration verb set to UNQLITE_LIB_CONFIG_STORAGE_ENGINE.
   729   */
   730  struct unqlite_kv_engine
   731  {
   732    const unqlite_kv_io *pIo; /* IO methods: MUST be first */
   733     /* Subclasses will typically add additional fields */
   734  };
   735  /*
   736   * Key/Value Storage Engine Virtual Method Table.
   737   *
   738   * Key/Value storage engine methods is defined by an instance of the following
   739   * object.
   740   * Registration of a Key/Value storage engine at run-time is done via [unqlite_lib_config()]
   741   * with a configuration verb set to UNQLITE_LIB_CONFIG_STORAGE_ENGINE.
   742   */
   743  struct unqlite_kv_methods
   744  {
   745    const char *zName; /* Storage engine name [i.e. Hash, B+tree, LSM, R-tree, Mem, etc.]*/
   746    int szKv;          /* 'unqlite_kv_engine' subclass size */
   747    int szCursor;      /* 'unqlite_kv_cursor' subclass size */
   748    int iVersion;      /* Structure version, currently 1 */
   749    /* Storage engine methods */
   750    int (*xInit)(unqlite_kv_engine *,int iPageSize);
   751    void (*xRelease)(unqlite_kv_engine *);
   752    int (*xConfig)(unqlite_kv_engine *,int op,va_list ap);
   753    int (*xOpen)(unqlite_kv_engine *,pgno);
   754    int (*xReplace)(
   755  	  unqlite_kv_engine *,
   756  	  const void *pKey,int nKeyLen,
   757  	  const void *pData,unqlite_int64 nDataLen
   758  	  ); 
   759      int (*xAppend)(
   760  	  unqlite_kv_engine *,
   761  	  const void *pKey,int nKeyLen,
   762  	  const void *pData,unqlite_int64 nDataLen
   763  	  );
   764    void (*xCursorInit)(unqlite_kv_cursor *);
   765    int (*xSeek)(unqlite_kv_cursor *,const void *pKey,int nByte,int iPos); /* Mandatory */
   766    int (*xFirst)(unqlite_kv_cursor *);
   767    int (*xLast)(unqlite_kv_cursor *);
   768    int (*xValid)(unqlite_kv_cursor *);
   769    int (*xNext)(unqlite_kv_cursor *);
   770    int (*xPrev)(unqlite_kv_cursor *);
   771    int (*xDelete)(unqlite_kv_cursor *);
   772    int (*xKeyLength)(unqlite_kv_cursor *,int *);
   773    int (*xKey)(unqlite_kv_cursor *,int (*xConsumer)(const void *,unsigned int,void *),void *pUserData);
   774    int (*xDataLength)(unqlite_kv_cursor *,unqlite_int64 *);
   775    int (*xData)(unqlite_kv_cursor *,int (*xConsumer)(const void *,unsigned int,void *),void *pUserData);
   776    void (*xReset)(unqlite_kv_cursor *);
   777    void (*xCursorRelease)(unqlite_kv_cursor *);
   778  };
   779  /*
   780   * UnQLite journal file suffix.
   781   */
   782  #ifndef UNQLITE_JOURNAL_FILE_SUFFIX
   783  #define UNQLITE_JOURNAL_FILE_SUFFIX "_unqlite_journal"
   784  #endif
   785  /*
   786   * Call Context - Error Message Serverity Level.
   787   *
   788   * The following constans are the allowed severity level that can
   789   * passed as the second argument to the [unqlite_context_throw_error()] or
   790   * [unqlite_context_throw_error_format()] interfaces.
   791   * Refer to the official documentation for additional information.
   792   */
   793  #define UNQLITE_CTX_ERR       1 /* Call context error such as unexpected number of arguments, invalid types and so on. */
   794  #define UNQLITE_CTX_WARNING   2 /* Call context Warning */
   795  #define UNQLITE_CTX_NOTICE    3 /* Call context Notice */
   796  /* 
   797   * C-API-REF: Please refer to the official documentation for interfaces
   798   * purpose and expected parameters. 
   799   */ 
   800  
   801  /* Database Engine Handle */
   802  UNQLITE_APIEXPORT int unqlite_open(unqlite **ppDB,const char *zFilename,unsigned int iMode);
   803  UNQLITE_APIEXPORT int unqlite_config(unqlite *pDb,int nOp,...);
   804  UNQLITE_APIEXPORT int unqlite_close(unqlite *pDb);
   805  
   806  /* Key/Value (KV) Store Interfaces */
   807  UNQLITE_APIEXPORT int unqlite_kv_store(unqlite *pDb,const void *pKey,int nKeyLen,const void *pData,unqlite_int64 nDataLen);
   808  UNQLITE_APIEXPORT int unqlite_kv_append(unqlite *pDb,const void *pKey,int nKeyLen,const void *pData,unqlite_int64 nDataLen);
   809  UNQLITE_APIEXPORT int unqlite_kv_store_fmt(unqlite *pDb,const void *pKey,int nKeyLen,const char *zFormat,...);
   810  UNQLITE_APIEXPORT int unqlite_kv_append_fmt(unqlite *pDb,const void *pKey,int nKeyLen,const char *zFormat,...);
   811  UNQLITE_APIEXPORT int unqlite_kv_fetch(unqlite *pDb,const void *pKey,int nKeyLen,void *pBuf,unqlite_int64 /* in|out */*pBufLen);
   812  UNQLITE_APIEXPORT int unqlite_kv_fetch_callback(unqlite *pDb,const void *pKey,
   813  	                    int nKeyLen,int (*xConsumer)(const void *,unsigned int,void *),void *pUserData);
   814  UNQLITE_APIEXPORT int unqlite_kv_delete(unqlite *pDb,const void *pKey,int nKeyLen);
   815  UNQLITE_APIEXPORT int unqlite_kv_config(unqlite *pDb,int iOp,...);
   816  
   817  /* Document (JSON) Store Interfaces powered by the Jx9 Scripting Language */
   818  UNQLITE_APIEXPORT int unqlite_compile(unqlite *pDb,const char *zJx9,int nByte,unqlite_vm **ppOut);
   819  UNQLITE_APIEXPORT int unqlite_compile_file(unqlite *pDb,const char *zPath,unqlite_vm **ppOut);
   820  UNQLITE_APIEXPORT int unqlite_vm_config(unqlite_vm *pVm,int iOp,...);
   821  UNQLITE_APIEXPORT int unqlite_vm_exec(unqlite_vm *pVm);
   822  UNQLITE_APIEXPORT int unqlite_vm_reset(unqlite_vm *pVm);
   823  UNQLITE_APIEXPORT int unqlite_vm_release(unqlite_vm *pVm);
   824  UNQLITE_APIEXPORT int unqlite_vm_dump(unqlite_vm *pVm, int (*xConsumer)(const void *, unsigned int, void *), void *pUserData);
   825  UNQLITE_APIEXPORT unqlite_value * unqlite_vm_extract_variable(unqlite_vm *pVm,const char *zVarname);
   826  
   827  /*  Cursor Iterator Interfaces */
   828  UNQLITE_APIEXPORT int unqlite_kv_cursor_init(unqlite *pDb,unqlite_kv_cursor **ppOut);
   829  UNQLITE_APIEXPORT int unqlite_kv_cursor_release(unqlite *pDb,unqlite_kv_cursor *pCur);
   830  UNQLITE_APIEXPORT int unqlite_kv_cursor_seek(unqlite_kv_cursor *pCursor,const void *pKey,int nKeyLen,int iPos);
   831  UNQLITE_APIEXPORT int unqlite_kv_cursor_first_entry(unqlite_kv_cursor *pCursor);
   832  UNQLITE_APIEXPORT int unqlite_kv_cursor_last_entry(unqlite_kv_cursor *pCursor);
   833  UNQLITE_APIEXPORT int unqlite_kv_cursor_valid_entry(unqlite_kv_cursor *pCursor);
   834  UNQLITE_APIEXPORT int unqlite_kv_cursor_next_entry(unqlite_kv_cursor *pCursor);
   835  UNQLITE_APIEXPORT int unqlite_kv_cursor_prev_entry(unqlite_kv_cursor *pCursor);
   836  UNQLITE_APIEXPORT int unqlite_kv_cursor_key(unqlite_kv_cursor *pCursor,void *pBuf,int *pnByte);
   837  UNQLITE_APIEXPORT int unqlite_kv_cursor_key_callback(unqlite_kv_cursor *pCursor,int (*xConsumer)(const void *,unsigned int,void *),void *pUserData);
   838  UNQLITE_APIEXPORT int unqlite_kv_cursor_data(unqlite_kv_cursor *pCursor,void *pBuf,unqlite_int64 *pnData);
   839  UNQLITE_APIEXPORT int unqlite_kv_cursor_data_callback(unqlite_kv_cursor *pCursor,int (*xConsumer)(const void *,unsigned int,void *),void *pUserData);
   840  UNQLITE_APIEXPORT int unqlite_kv_cursor_delete_entry(unqlite_kv_cursor *pCursor);
   841  UNQLITE_APIEXPORT int unqlite_kv_cursor_reset(unqlite_kv_cursor *pCursor);
   842  
   843  /* Manual Transaction Manager */
   844  UNQLITE_APIEXPORT int unqlite_begin(unqlite *pDb);
   845  UNQLITE_APIEXPORT int unqlite_commit(unqlite *pDb);
   846  UNQLITE_APIEXPORT int unqlite_rollback(unqlite *pDb);
   847  
   848  /* Utility interfaces */
   849  UNQLITE_APIEXPORT int unqlite_util_load_mmaped_file(const char *zFile,void **ppMap,unqlite_int64 *pFileSize);
   850  UNQLITE_APIEXPORT int unqlite_util_release_mmaped_file(void *pMap,unqlite_int64 iFileSize);
   851  UNQLITE_APIEXPORT int unqlite_util_random_string(unqlite *pDb,char *zBuf,unsigned int buf_size);
   852  UNQLITE_APIEXPORT unsigned int unqlite_util_random_num(unqlite *pDb);
   853  
   854  /* In-process extending interfaces */
   855  UNQLITE_APIEXPORT int unqlite_create_function(unqlite_vm *pVm,const char *zName,int (*xFunc)(unqlite_context *,int,unqlite_value **),void *pUserData);
   856  UNQLITE_APIEXPORT int unqlite_delete_function(unqlite_vm *pVm, const char *zName);
   857  UNQLITE_APIEXPORT int unqlite_create_constant(unqlite_vm *pVm,const char *zName,void (*xExpand)(unqlite_value *, void *),void *pUserData);
   858  UNQLITE_APIEXPORT int unqlite_delete_constant(unqlite_vm *pVm, const char *zName);
   859  
   860  /* On Demand Object allocation interfaces */
   861  UNQLITE_APIEXPORT unqlite_value * unqlite_vm_new_scalar(unqlite_vm *pVm);
   862  UNQLITE_APIEXPORT unqlite_value * unqlite_vm_new_array(unqlite_vm *pVm);
   863  UNQLITE_APIEXPORT int unqlite_vm_release_value(unqlite_vm *pVm,unqlite_value *pValue);
   864  UNQLITE_APIEXPORT unqlite_value * unqlite_context_new_scalar(unqlite_context *pCtx);
   865  UNQLITE_APIEXPORT unqlite_value * unqlite_context_new_array(unqlite_context *pCtx);
   866  UNQLITE_APIEXPORT void unqlite_context_release_value(unqlite_context *pCtx,unqlite_value *pValue);
   867  
   868  /* Dynamically Typed Value Object Management Interfaces */
   869  UNQLITE_APIEXPORT int unqlite_value_int(unqlite_value *pVal, int iValue);
   870  UNQLITE_APIEXPORT int unqlite_value_int64(unqlite_value *pVal, unqlite_int64 iValue);
   871  UNQLITE_APIEXPORT int unqlite_value_bool(unqlite_value *pVal, int iBool);
   872  UNQLITE_APIEXPORT int unqlite_value_null(unqlite_value *pVal);
   873  UNQLITE_APIEXPORT int unqlite_value_double(unqlite_value *pVal, double Value);
   874  UNQLITE_APIEXPORT int unqlite_value_string(unqlite_value *pVal, const char *zString, int nLen);
   875  UNQLITE_APIEXPORT int unqlite_value_string_format(unqlite_value *pVal, const char *zFormat,...);
   876  UNQLITE_APIEXPORT int unqlite_value_reset_string_cursor(unqlite_value *pVal);
   877  UNQLITE_APIEXPORT int unqlite_value_resource(unqlite_value *pVal, void *pUserData);
   878  UNQLITE_APIEXPORT int unqlite_value_release(unqlite_value *pVal);
   879  
   880  /* Foreign Function Parameter Values */
   881  UNQLITE_APIEXPORT int unqlite_value_to_int(unqlite_value *pValue);
   882  UNQLITE_APIEXPORT int unqlite_value_to_bool(unqlite_value *pValue);
   883  UNQLITE_APIEXPORT unqlite_int64 unqlite_value_to_int64(unqlite_value *pValue);
   884  UNQLITE_APIEXPORT double unqlite_value_to_double(unqlite_value *pValue);
   885  UNQLITE_APIEXPORT const char * unqlite_value_to_string(unqlite_value *pValue, int *pLen);
   886  UNQLITE_APIEXPORT void * unqlite_value_to_resource(unqlite_value *pValue);
   887  UNQLITE_APIEXPORT int unqlite_value_compare(unqlite_value *pLeft, unqlite_value *pRight, int bStrict);
   888  
   889  /* Setting The Result Of A Foreign Function */
   890  UNQLITE_APIEXPORT int unqlite_result_int(unqlite_context *pCtx, int iValue);
   891  UNQLITE_APIEXPORT int unqlite_result_int64(unqlite_context *pCtx, unqlite_int64 iValue);
   892  UNQLITE_APIEXPORT int unqlite_result_bool(unqlite_context *pCtx, int iBool);
   893  UNQLITE_APIEXPORT int unqlite_result_double(unqlite_context *pCtx, double Value);
   894  UNQLITE_APIEXPORT int unqlite_result_null(unqlite_context *pCtx);
   895  UNQLITE_APIEXPORT int unqlite_result_string(unqlite_context *pCtx, const char *zString, int nLen);
   896  UNQLITE_APIEXPORT int unqlite_result_string_format(unqlite_context *pCtx, const char *zFormat, ...);
   897  UNQLITE_APIEXPORT int unqlite_result_value(unqlite_context *pCtx, unqlite_value *pValue);
   898  UNQLITE_APIEXPORT int unqlite_result_resource(unqlite_context *pCtx, void *pUserData);
   899  
   900  /* Dynamically Typed Value Object Query Interfaces */
   901  UNQLITE_APIEXPORT int unqlite_value_is_int(unqlite_value *pVal);
   902  UNQLITE_APIEXPORT int unqlite_value_is_float(unqlite_value *pVal);
   903  UNQLITE_APIEXPORT int unqlite_value_is_bool(unqlite_value *pVal);
   904  UNQLITE_APIEXPORT int unqlite_value_is_string(unqlite_value *pVal);
   905  UNQLITE_APIEXPORT int unqlite_value_is_null(unqlite_value *pVal);
   906  UNQLITE_APIEXPORT int unqlite_value_is_numeric(unqlite_value *pVal);
   907  UNQLITE_APIEXPORT int unqlite_value_is_callable(unqlite_value *pVal);
   908  UNQLITE_APIEXPORT int unqlite_value_is_scalar(unqlite_value *pVal);
   909  UNQLITE_APIEXPORT int unqlite_value_is_json_array(unqlite_value *pVal);
   910  UNQLITE_APIEXPORT int unqlite_value_is_json_object(unqlite_value *pVal);
   911  UNQLITE_APIEXPORT int unqlite_value_is_resource(unqlite_value *pVal);
   912  UNQLITE_APIEXPORT int unqlite_value_is_empty(unqlite_value *pVal);
   913  
   914  /* JSON Array/Object Management Interfaces */
   915  UNQLITE_APIEXPORT unqlite_value * unqlite_array_fetch(unqlite_value *pArray, const char *zKey, int nByte);
   916  UNQLITE_APIEXPORT int unqlite_array_walk(unqlite_value *pArray, int (*xWalk)(unqlite_value *, unqlite_value *, void *), void *pUserData);
   917  UNQLITE_APIEXPORT int unqlite_array_add_elem(unqlite_value *pArray, unqlite_value *pKey, unqlite_value *pValue);
   918  UNQLITE_APIEXPORT int unqlite_array_add_strkey_elem(unqlite_value *pArray, const char *zKey, unqlite_value *pValue);
   919  UNQLITE_APIEXPORT int unqlite_array_count(unqlite_value *pArray);
   920  
   921  /* Call Context Handling Interfaces */
   922  UNQLITE_APIEXPORT int unqlite_context_output(unqlite_context *pCtx, const char *zString, int nLen);
   923  UNQLITE_APIEXPORT int unqlite_context_output_format(unqlite_context *pCtx,const char *zFormat, ...);
   924  UNQLITE_APIEXPORT int unqlite_context_throw_error(unqlite_context *pCtx, int iErr, const char *zErr);
   925  UNQLITE_APIEXPORT int unqlite_context_throw_error_format(unqlite_context *pCtx, int iErr, const char *zFormat, ...);
   926  UNQLITE_APIEXPORT unsigned int unqlite_context_random_num(unqlite_context *pCtx);
   927  UNQLITE_APIEXPORT int unqlite_context_random_string(unqlite_context *pCtx, char *zBuf, int nBuflen);
   928  UNQLITE_APIEXPORT void * unqlite_context_user_data(unqlite_context *pCtx);
   929  UNQLITE_APIEXPORT int unqlite_context_push_aux_data(unqlite_context *pCtx, void *pUserData);
   930  UNQLITE_APIEXPORT void * unqlite_context_peek_aux_data(unqlite_context *pCtx);
   931  UNQLITE_APIEXPORT unsigned int unqlite_context_result_buf_length(unqlite_context *pCtx);
   932  UNQLITE_APIEXPORT const char * unqlite_function_name(unqlite_context *pCtx);
   933  
   934  /* Call Context Memory Management Interfaces */
   935  UNQLITE_APIEXPORT void * unqlite_context_alloc_chunk(unqlite_context *pCtx,unsigned int nByte,int ZeroChunk,int AutoRelease);
   936  UNQLITE_APIEXPORT void * unqlite_context_realloc_chunk(unqlite_context *pCtx,void *pChunk,unsigned int nByte);
   937  UNQLITE_APIEXPORT void unqlite_context_free_chunk(unqlite_context *pCtx,void *pChunk);
   938  
   939  /* Global Library Management Interfaces */
   940  UNQLITE_APIEXPORT int unqlite_lib_config(int nConfigOp,...);
   941  UNQLITE_APIEXPORT int unqlite_lib_init(void);
   942  UNQLITE_APIEXPORT int unqlite_lib_shutdown(void);
   943  UNQLITE_APIEXPORT int unqlite_lib_is_threadsafe(void);
   944  UNQLITE_APIEXPORT const char * unqlite_lib_version(void);
   945  UNQLITE_APIEXPORT const char * unqlite_lib_signature(void);
   946  UNQLITE_APIEXPORT const char * unqlite_lib_ident(void);
   947  UNQLITE_APIEXPORT const char * unqlite_lib_copyright(void);
   948  
   949  #endif /* _UNQLITE_H_ */