Как скомпилировать расширение sqlite3 - виртуальная таблица CSV - PullRequest
0 голосов
/ 29 января 2020

Я пытаюсь использовать расширение CSV Virtual Table для sqlite3. Я застрял на первом этапе компиляции расширения на Ma c (MacOS High Sierra 10.13.6).

Я скачал исходный код для csv. c с этой страницы . Я также взял объединение исходного кода sqlite из здесь .

Я использовал следующую команду для компиляции:

gcc -g -fPIC -dynamiclib csv.c -o csv.dylib

Однако я получаю следующую ошибку:

csv.c:115:3: error: no member named '__builtin___vsnprintf_chk' in 'struct sqlite3_api_routines'
  sqlite3_vsnprintf(CSV_MXERR, p->zErr, zFormat, ap);
  ^~~~~~~~~~~~~~~~~
/usr/include/sqlite3ext.h:437:53: note: expanded from macro 'sqlite3_vsnprintf'
#define sqlite3_vsnprintf              sqlite3_api->vsnprintf
                                       ~~~~~~~~~~~  ^
/usr/include/secure/_stdio.h:75:3: note: expanded from macro 'vsnprintf'
  __builtin___vsnprintf_chk (str, len, 0, __darwin_obsz(str), format, ap)
  ^
csv.c:115:21: warning: incompatible integer to pointer conversion passing 'int' to parameter of type 'const void *' [-Wint-conversion]
  sqlite3_vsnprintf(CSV_MXERR, p->zErr, zFormat, ap);
                    ^~~~~~~~~
csv.c:67:19: note: expanded from macro 'CSV_MXERR'
#define CSV_MXERR 200
                  ^~~
/usr/include/secure/_stdio.h:75:57: note: expanded from macro 'vsnprintf'
  __builtin___vsnprintf_chk (str, len, 0, __darwin_obsz(str), format, ap)
                                                        ^~~
/usr/include/secure/_common.h:39:54: note: expanded from macro '__darwin_obsz'
#define __darwin_obsz(object) __builtin_object_size (object, _USE_FORTIFY_LEVEL > 1 ? 1 : 0)
                                                     ^~~~~~
csv.c:568:5: error: use of undeclared identifier 'sqlite3_str'
    sqlite3_str *pStr = sqlite3_str_new(0);
    ^
csv.c:568:18: error: use of undeclared identifier 'pStr'
    sqlite3_str *pStr = sqlite3_str_new(0);
                 ^
csv.c:568:25: warning: implicit declaration of function 'sqlite3_str_new' is invalid in C99 [-Wimplicit-function-declaration]
    sqlite3_str *pStr = sqlite3_str_new(0);
                        ^
csv.c:571:5: warning: implicit declaration of function 'sqlite3_str_appendf' is invalid in C99 [-Wimplicit-function-declaration]
    sqlite3_str_appendf(pStr, "CREATE TABLE x(");
    ^
csv.c:571:25: error: use of undeclared identifier 'pStr'
    sqlite3_str_appendf(pStr, "CREATE TABLE x(");
                        ^
csv.c:581:29: error: use of undeclared identifier 'pStr'
        sqlite3_str_appendf(pStr, "%sc%d TEXT", zSep, iCol);
                            ^
csv.c:588:31: error: use of undeclared identifier 'pStr'
          sqlite3_str_appendf(pStr,"%s\"%w\" TEXT", zSep, z);
                              ^
csv.c:597:31: error: use of undeclared identifier 'pStr'
          sqlite3_str_appendf(pStr,"%sc%d TEXT", zSep, ++iCol);
                              ^
csv.c:603:25: error: use of undeclared identifier 'pStr'
    sqlite3_str_appendf(pStr, ")");
                        ^
csv.c:604:18: warning: implicit declaration of function 'sqlite3_str_finish' is invalid in C99 [-Wimplicit-function-declaration]
    CSV_SCHEMA = sqlite3_str_finish(pStr);
                 ^
csv.c:604:37: error: use of undeclared identifier 'pStr'
    CSV_SCHEMA = sqlite3_str_finish(pStr);
                                    ^
csv.c:643:27: error: use of undeclared identifier 'SQLITE_VTAB_DIRECTONLY'
  sqlite3_vtab_config(db, SQLITE_VTAB_DIRECTONLY);
                          ^
4 warnings and 10 errors generated.

Что я делаю не так?

1 Ответ

0 голосов
/ 31 января 2020

Мне удалось найти обходной путь и использовать контейнер Ubuntu docker, где я смог успешно скомпилировать и использовать расширение. Вот шаги, которые я выполнил:

docker run -ti --rm -v $(pwd):/host ubuntu bash

# Steps to build SQLite and CSV Virtual Table extension from source inside an Ubuntu docker container
cd /host
apt update
apt install -y vim build-essential zip wget
wget https://sqlite.org/2020/sqlite-autoconf-3310100.tar.gz
tar xvf sqlite-autoconf-3310100.tar.gz 
cd sqlite-autoconf-3310100
./configure
make
./sqlite3
# Obtain csv.c and change <sqlite3ext.h> to "sqlite3ext.h" in the file
vi csv.c
gcc -g -fPIC -shared csv.c -o csv.so
./sqlite3
#sqlite> .load ./csv
#sqlite> CREATE VIRTUAL TABLE temp.t1 USING csv(filename='/host/users.csv',header);
#sqlite> .headers on
#sqlite> SELECT * FROM t1 LIMIT 1;

Вы можете использовать аналогичный процесс для построения лямбда-функции (CentOS). См. репозиторий github для получения более подробной информации.

Я до сих пор не понял, как заставить его скомпилировать непосредственно на Ma c, поэтому любая помощь будет принята с благодарностью!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...