我有一个我想附加到数据库的示例C函数 temp.sqlite (这是来自奥莱利的一本书,所以我知道它有效)。我阅读了书籍和sqlite.org中的部分,但是他们假设我知道如何以及在何处使用适当的设置编译此内容。我在Mac(带有Xcode)或Ubuntu上。

我知道足够的c更改代码来完成我想做的事情,但是我不知道该如何从数据库中称呼它 temp.sqlite.

谢谢你的帮助!我一直在努力!

更新:还有几个小时,我从废弃的网页中删除了足够的东西,以创建一个编译命令并生成错误:

richard$ gcc -o wtavg wtavg.c -Wall -W -O2 -L/usr/local/lib -lsqlite3
wtavg.c: In function ‘wtavg_init’:
wtavg.c:63: warning: unused parameter ‘error’
Undefined symbols:
  "_main", referenced from:
      start in crt1.10.6.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

FWIW,这是WTAVG.C,它直接来自我书中提供的O'Reilly网站:

/* wtavg.c */

#include "sqlite3ext.h"
SQLITE_EXTENSION_INIT1;

#include <stdlib.h>




typedef struct wt_avg_state_s {
   double   total_data;  /* sum of (data * weight) values */
   double   total_wt;    /* sum of weight values */
} wt_avg_state;


static void wt_avg_step( sqlite3_context *ctx, int num_values, sqlite3_value **values )
{
    double         row_wt = 1.0;
    int            type;
    wt_avg_state   *st = (wt_avg_state*)sqlite3_aggregate_context( ctx,
                                               sizeof( wt_avg_state ) );
    if ( st == NULL ) {
        sqlite3_result_error_nomem( ctx );
        return;
    }

    /* Extract weight, if we have a weight and it looks like a number */
    if ( num_values == 2 ) {
        type = sqlite3_value_numeric_type( values[1] );
        if ( ( type == SQLITE_FLOAT )||( type == SQLITE_INTEGER ) ) {
            row_wt = sqlite3_value_double( values[1] );
        }
    }

    /* Extract data, if we were given something that looks like a number. */
    type = sqlite3_value_numeric_type( values[0] );
    if ( ( type == SQLITE_FLOAT )||( type == SQLITE_INTEGER ) ) {
        st->total_data += row_wt * sqlite3_value_double( values[0] );
        st->total_wt   += row_wt;
    }
}


static void wt_avg_final( sqlite3_context *ctx )
{
    double         result = 0.0;
    wt_avg_state   *st = (wt_avg_state*)sqlite3_aggregate_context( ctx,
                                               sizeof( wt_avg_state ) );
    if ( st == NULL ) {
        sqlite3_result_error_nomem( ctx );
        return;
    }

    if ( st->total_wt != 0.0 ) {
        result = st->total_data / st->total_wt;
    }
    sqlite3_result_double( ctx, result );
}


int wtavg_init( sqlite3 *db, char **error, const sqlite3_api_routines *api )
{
    SQLITE_EXTENSION_INIT2(api);

    sqlite3_create_function( db, "wtavg", 1, SQLITE_UTF8,
            NULL, NULL, wt_avg_step, wt_avg_final );
    sqlite3_create_function( db, "wtavg", 2, SQLITE_UTF8,
            NULL, NULL, wt_avg_step, wt_avg_final );

    return SQLITE_OK;
}
有帮助吗?

解决方案

用户定义的函数应编译为共享库文件:

gcc -shared -fPIC -o wtavg.so wtavg.c -lsqlite3

然后可以使用sqlite语句加载该共享库:

SELECT load_extension('/path/to/wt_avg.so', 'wtavg_init');

不幸的是,Apple提供的SQLite3版本不支持加载共享库。您可以改用Macports使用SQLite。 Macports程序链接到SQLite还应具有以这种方式加载用户定义的功能的能力。

当在另一个程序中使用SQLITE时,由于安全原因,可能会禁用扩展加载机制。例如,在Python中,您必须致电 con.enable_load_extension(True) 启用它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top