Annotation of embedaddon/sqlite3/src/test_loadext.c, revision 1.1

1.1     ! misho       1: /*
        !             2: ** 2006 June 14
        !             3: **
        !             4: ** The author disclaims copyright to this source code.  In place of
        !             5: ** a legal notice, here is a blessing:
        !             6: **
        !             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.
        !            10: **
        !            11: *************************************************************************
        !            12: ** Test extension for testing the sqlite3_load_extension() function.
        !            13: */
        !            14: #include <string.h>
        !            15: #include "sqlite3ext.h"
        !            16: SQLITE_EXTENSION_INIT1
        !            17: 
        !            18: /*
        !            19: ** The half() SQL function returns half of its input value.
        !            20: */
        !            21: static void halfFunc(
        !            22:   sqlite3_context *context,
        !            23:   int argc,
        !            24:   sqlite3_value **argv
        !            25: ){
        !            26:   sqlite3_result_double(context, 0.5*sqlite3_value_double(argv[0]));
        !            27: }
        !            28: 
        !            29: /*
        !            30: ** SQL functions to call the sqlite3_status function and return results.
        !            31: */
        !            32: static void statusFunc(
        !            33:   sqlite3_context *context,
        !            34:   int argc,
        !            35:   sqlite3_value **argv
        !            36: ){
        !            37:   int op, mx, cur, resetFlag, rc;
        !            38:   if( sqlite3_value_type(argv[0])==SQLITE_INTEGER ){
        !            39:     op = sqlite3_value_int(argv[0]);
        !            40:   }else if( sqlite3_value_type(argv[0])==SQLITE_TEXT ){
        !            41:     int i;
        !            42:     const char *zName;
        !            43:     static const struct {
        !            44:       const char *zName;
        !            45:       int op;
        !            46:     } aOp[] = {
        !            47:       { "MEMORY_USED",         SQLITE_STATUS_MEMORY_USED         },
        !            48:       { "PAGECACHE_USED",      SQLITE_STATUS_PAGECACHE_USED      },
        !            49:       { "PAGECACHE_OVERFLOW",  SQLITE_STATUS_PAGECACHE_OVERFLOW  },
        !            50:       { "SCRATCH_USED",        SQLITE_STATUS_SCRATCH_USED        },
        !            51:       { "SCRATCH_OVERFLOW",    SQLITE_STATUS_SCRATCH_OVERFLOW    },
        !            52:       { "MALLOC_SIZE",         SQLITE_STATUS_MALLOC_SIZE         },
        !            53:     };
        !            54:     int nOp = sizeof(aOp)/sizeof(aOp[0]);
        !            55:     zName = (const char*)sqlite3_value_text(argv[0]);
        !            56:     for(i=0; i<nOp; i++){
        !            57:       if( strcmp(aOp[i].zName, zName)==0 ){
        !            58:         op = aOp[i].op;
        !            59:         break;
        !            60:       }
        !            61:     }
        !            62:     if( i>=nOp ){
        !            63:       char *zMsg = sqlite3_mprintf("unknown status property: %s", zName);
        !            64:       sqlite3_result_error(context, zMsg, -1);
        !            65:       sqlite3_free(zMsg);
        !            66:       return;
        !            67:     }
        !            68:   }else{
        !            69:     sqlite3_result_error(context, "unknown status type", -1);
        !            70:     return;
        !            71:   }
        !            72:   if( argc==2 ){
        !            73:     resetFlag = sqlite3_value_int(argv[1]);
        !            74:   }else{
        !            75:     resetFlag = 0;
        !            76:   }
        !            77:   rc = sqlite3_status(op, &cur, &mx, resetFlag);
        !            78:   if( rc!=SQLITE_OK ){
        !            79:     char *zMsg = sqlite3_mprintf("sqlite3_status(%d,...) returns %d", op, rc);
        !            80:     sqlite3_result_error(context, zMsg, -1);
        !            81:     sqlite3_free(zMsg);
        !            82:     return;
        !            83:   } 
        !            84:   if( argc==2 ){
        !            85:     sqlite3_result_int(context, mx);
        !            86:   }else{
        !            87:     sqlite3_result_int(context, cur);
        !            88:   }
        !            89: }
        !            90: 
        !            91: /*
        !            92: ** Extension load function.
        !            93: */
        !            94: int testloadext_init(
        !            95:   sqlite3 *db, 
        !            96:   char **pzErrMsg, 
        !            97:   const sqlite3_api_routines *pApi
        !            98: ){
        !            99:   int nErr = 0;
        !           100:   SQLITE_EXTENSION_INIT2(pApi);
        !           101:   nErr |= sqlite3_create_function(db, "half", 1, SQLITE_ANY, 0, halfFunc, 0, 0);
        !           102:   nErr |= sqlite3_create_function(db, "sqlite3_status", 1, SQLITE_ANY, 0,
        !           103:                           statusFunc, 0, 0);
        !           104:   nErr |= sqlite3_create_function(db, "sqlite3_status", 2, SQLITE_ANY, 0,
        !           105:                           statusFunc, 0, 0);
        !           106:   return nErr ? SQLITE_ERROR : SQLITE_OK;
        !           107: }
        !           108: 
        !           109: /*
        !           110: ** Another extension entry point. This one always fails.
        !           111: */
        !           112: int testbrokenext_init(
        !           113:   sqlite3 *db, 
        !           114:   char **pzErrMsg, 
        !           115:   const sqlite3_api_routines *pApi
        !           116: ){
        !           117:   char *zErr;
        !           118:   SQLITE_EXTENSION_INIT2(pApi);
        !           119:   zErr = sqlite3_mprintf("broken!");
        !           120:   *pzErrMsg = zErr;
        !           121:   return 1;
        !           122: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>