4 ** The author disclaims copyright to this source code. In place of
5 ** a legal notice, here is a blessing:
7 ** May you do good and not evil.
8 ** May you find forgiveness for yourself and forgive others.
9 ** May you share freely, never taking more than you give.
11 ******************************************************************************
13 ** Utility functions sqlar_compress() and sqlar_uncompress(). Useful
14 ** for working with sqlar archives and used by the shell tool's built-in
17 #include "sqlite3ext.h"
18 SQLITE_EXTENSION_INIT1
22 ** Implementation of the "sqlar_compress(X)" SQL function.
24 ** If the type of X is SQLITE_BLOB, and compressing that blob using
25 ** zlib utility function compress() yields a smaller blob, return the
26 ** compressed blob. Otherwise, return a copy of X.
28 static void sqlarCompressFunc(
29 sqlite3_context
*context
,
34 if( sqlite3_value_type(argv
[0])==SQLITE_BLOB
){
35 const Bytef
*pData
= sqlite3_value_blob(argv
[0]);
36 uLong nData
= sqlite3_value_bytes(argv
[0]);
37 uLongf nOut
= compressBound(nData
);
40 pOut
= (Bytef
*)sqlite3_malloc(nOut
);
42 sqlite3_result_error_nomem(context
);
45 if( Z_OK
!=compress(pOut
, &nOut
, pData
, nData
) ){
46 sqlite3_result_error(context
, "error in compress()", -1);
47 }else if( nOut
<nData
){
48 sqlite3_result_blob(context
, pOut
, nOut
, SQLITE_TRANSIENT
);
50 sqlite3_result_value(context
, argv
[0]);
55 sqlite3_result_value(context
, argv
[0]);
60 ** Implementation of the "sqlar_uncompress(X,SZ)" SQL function
62 ** Parameter SZ is interpreted as an integer. If it is less than or
63 ** equal to zero, then this function returns a copy of X. Or, if
64 ** SZ is equal to the size of X when interpreted as a blob, also
65 ** return a copy of X. Otherwise, decompress blob X using zlib
66 ** utility function uncompress() and return the results (another
69 static void sqlarUncompressFunc(
70 sqlite3_context
*context
,
78 sz
= sqlite3_value_int(argv
[1]);
80 if( sz
<=0 || sz
==(nData
= sqlite3_value_bytes(argv
[0])) ){
81 sqlite3_result_value(context
, argv
[0]);
83 const Bytef
*pData
= sqlite3_value_blob(argv
[0]);
84 Bytef
*pOut
= sqlite3_malloc(sz
);
85 if( Z_OK
!=uncompress(pOut
, &sz
, pData
, nData
) ){
86 sqlite3_result_error(context
, "error in uncompress()", -1);
88 sqlite3_result_blob(context
, pOut
, sz
, SQLITE_TRANSIENT
);
98 int sqlite3_sqlar_init(
101 const sqlite3_api_routines
*pApi
104 SQLITE_EXTENSION_INIT2(pApi
);
105 (void)pzErrMsg
; /* Unused parameter */
106 rc
= sqlite3_create_function(db
, "sqlar_compress", 1, SQLITE_UTF8
, 0,
107 sqlarCompressFunc
, 0, 0);
109 rc
= sqlite3_create_function(db
, "sqlar_uncompress", 2, SQLITE_UTF8
, 0,
110 sqlarUncompressFunc
, 0, 0);