mirror of
				https://github.com/tursodatabase/libsql.git
				synced 2025-11-04 10:38:54 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			90 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
** 2022-11-20
 | 
						|
**
 | 
						|
** The author disclaims copyright to this source code.  In place of
 | 
						|
** a legal notice, here is a blessing:
 | 
						|
**
 | 
						|
**    May you do good and not evil.
 | 
						|
**    May you find forgiveness for yourself and forgive others.
 | 
						|
**    May you share freely, never taking more than you give.
 | 
						|
**
 | 
						|
*************************************************************************
 | 
						|
**
 | 
						|
** This source allows multiple SQLite extensions to be either: combined
 | 
						|
** into a single runtime-loadable library; or built into the SQLite shell
 | 
						|
** using a preprocessing convention set by src/shell.c.in (and shell.c).
 | 
						|
**
 | 
						|
** Presently, it combines the base64.c and base85.c extensions. However,
 | 
						|
** it can be used as a template for other combinations.
 | 
						|
**
 | 
						|
** Example usages:
 | 
						|
**
 | 
						|
**  - Build a runtime-loadable extension from SQLite checkout directory:
 | 
						|
** *Nix, OSX: gcc -O2 -shared -I. -fPIC -o basexx.so ext/misc/basexx.c
 | 
						|
** Win32: cl /Os -I. ext/misc/basexx.c -link -dll -out:basexx.dll
 | 
						|
**
 | 
						|
**  - Incorporate as built-in in sqlite3 shell:
 | 
						|
** *Nix, OSX with gcc on a like platform:
 | 
						|
**  export mop1=-DSQLITE_SHELL_EXTSRC=ext/misc/basexx.c
 | 
						|
**  export mop2=-DSQLITE_SHELL_EXTFUNCS=BASEXX
 | 
						|
**  make sqlite3 "OPTS=$mop1 $mop2"
 | 
						|
** Win32 with Microsoft toolset on Windows:
 | 
						|
**  set mop1=-DSQLITE_SHELL_EXTSRC=ext/misc/basexx.c
 | 
						|
**  set mop2=-DSQLITE_SHELL_EXTFUNCS=BASEXX
 | 
						|
**  set mops="OPTS=%mop1% %mop2%"
 | 
						|
**  nmake -f Makefile.msc sqlite3.exe %mops%
 | 
						|
*/
 | 
						|
 | 
						|
#ifndef SQLITE_SHELL_EXTFUNCS /* Guard for #include as built-in extension. */
 | 
						|
# include "sqlite3ext.h"
 | 
						|
SQLITE_EXTENSION_INIT1;
 | 
						|
#endif
 | 
						|
 | 
						|
static void init_api_ptr(const sqlite3_api_routines *pApi){
 | 
						|
  SQLITE_EXTENSION_INIT2(pApi);
 | 
						|
}
 | 
						|
 | 
						|
#undef SQLITE_EXTENSION_INIT1
 | 
						|
#define SQLITE_EXTENSION_INIT1 /* */
 | 
						|
#undef SQLITE_EXTENSION_INIT2
 | 
						|
#define SQLITE_EXTENSION_INIT2(v) (void)v
 | 
						|
 | 
						|
typedef unsigned char u8;
 | 
						|
#define U8_TYPEDEF
 | 
						|
 | 
						|
/* These next 2 undef's are only needed because the entry point names
 | 
						|
 * collide when formulated per the rules stated for loadable extension
 | 
						|
 * entry point names that will be deduced from the file basenames.
 | 
						|
 */
 | 
						|
#undef sqlite3_base_init
 | 
						|
#define sqlite3_base_init sqlite3_base64_init
 | 
						|
#include "base64.c"
 | 
						|
 | 
						|
#undef sqlite3_base_init
 | 
						|
#define sqlite3_base_init sqlite3_base85_init
 | 
						|
#include "base85.c"
 | 
						|
 | 
						|
#ifdef _WIN32
 | 
						|
__declspec(dllexport)
 | 
						|
#endif
 | 
						|
int sqlite3_basexx_init(sqlite3 *db, char **pzErr,
 | 
						|
                               const sqlite3_api_routines *pApi){
 | 
						|
  int rc1;
 | 
						|
  int rc2;
 | 
						|
 | 
						|
  init_api_ptr(pApi);
 | 
						|
  rc1 = BASE64_INIT(db);
 | 
						|
  rc2 = BASE85_INIT(db);
 | 
						|
 | 
						|
  if( rc1==SQLITE_OK && rc2==SQLITE_OK ){
 | 
						|
    BASE64_EXPOSE(db, pzErr);
 | 
						|
    BASE64_EXPOSE(db, pzErr);
 | 
						|
    return SQLITE_OK;
 | 
						|
  }else{
 | 
						|
    return SQLITE_ERROR;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
# define BASEXX_INIT(db) sqlite3_basexx_init(db, 0, 0)
 | 
						|
# define BASEXX_EXPOSE(db, pzErr) /* Not needed, ..._init() does this. */
 |