0

I'm trying to add a custom rank function written in C for SQLite3. The code compiles, but I can't seem to load it in sqlite3. When I do .load './librank.so' in SQLite3, I see this error message:

./librank.so.so: cannot open shared object file: No such file or directory

The code (from http://www.sqlite.org/fts3.html#appendix_a)

Rank.c

#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_RANK)
#include <stdio.h>
#ifndef SQLITE_CORE
  #include "sqlite3ext.h"
  SQLITE_EXTENSION_INIT1
#else
  #include "sqlite3.h"
#endif


static void rankfunc(sqlite3_context *pCtx, int nVal, sqlite3_value **apVal){
  int *aMatchinfo;                /* Return value of matchinfo() */
  int nCol;                       /* Number of columns in the table */
  int nPhrase;                    /* Number of phrases in the query */
  int iPhrase;                    /* Current phrase */
  double score = 0.0;             /* Value to return */

  assert( sizeof(int)==4 );

  /* Check that the number of arguments passed to this function is correct.
  ** If not, jump to wrong_number_args. Set aMatchinfo to point to the array
  ** of unsigned integer values returned by FTS function matchinfo. Set
  ** nPhrase to contain the number of reportable phrases in the users full-text
  ** query, and nCol to the number of columns in the table.
  */
  if( nVal<1 ) goto wrong_number_args;
  aMatchinfo = (unsigned int *)sqlite3_value_blob(apVal[0]);
  nPhrase = aMatchinfo[0];
  nCol = aMatchinfo[1];
  if( nVal!=(1+nCol) ) goto wrong_number_args;

  /* Iterate through each phrase in the users query. */
  for(iPhrase=0; iPhrase<nPhrase; iPhrase++){
    int iCol;                     /* Current column */

    /* Now iterate through each column in the users query. For each column,
    ** increment the relevancy score by:
    **
    **   (<hit count> / <global hit count>) * <column weight>
    **
    ** aPhraseinfo[] points to the start of the data for phrase iPhrase. So
    ** the hit count and global hit counts for each column are found in 
    ** aPhraseinfo[iCol*3] and aPhraseinfo[iCol*3+1], respectively.
    */
    int *aPhraseinfo = &aMatchinfo[2 + iPhrase*nCol*3];
    for(iCol=0; iCol<nCol; iCol++){
      int nHitCount = aPhraseinfo[3*iCol];
      int nGlobalHitCount = aPhraseinfo[3*iCol+1];
      double weight = sqlite3_value_double(apVal[iCol+1]);
      if( nHitCount>0 ){
        score += ((double)nHitCount / (double)nGlobalHitCount) * weight;
      }
    }
  }

  sqlite3_result_double(pCtx, score);
  return;

  /* Jump here if the wrong number of arguments are passed to this function */
wrong_number_args:
  sqlite3_result_error(pCtx, "wrong number of arguments to function rank()", -1);
}

int sqlite3rankInit(sqlite3 *db){
  sqlite3_create_function(db, "rank", -1, SQLITE_UTF8, 0, &rankfunc, 0, 0);
  return 0;
}

#if !SQLITE_CORE
int sqlite3_extension_init(
  sqlite3 *db, 
  char **pzErrMsg,
  const sqlite3_api_routines *pApi
){
  SQLITE_EXTENSION_INIT2(pApi)
  return sqlite3rankInit(db);
}
#endif

#endif


Compiled with: gcc -shared -fPIC -lm rank.c -o librank.so

Can someone help me see what I did incorrectly?

2 Answers 2

1

Try to include the assert header

diff --git a/rank_orig.c b/rank.c
index 5d51b4d..4940e1b 100644
--- a/rank_orig.c
+++ b/rank.c
@@ -1,5 +1,6 @@
 #if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_RANK)
 #include <stdio.h>
+#include <assert.h>
 #ifndef SQLITE_CORE
   #include "sqlite3ext.h"

Compile:

$ gcc -shared -fPIC -lm rank.c -o librank.so

Load

$ sqlite3 
SQLite version 3.8.10.1 2015-05-09 12:14:55
sqlite> .load ./librank.so 
sqlite> 
Sign up to request clarification or add additional context in comments.

Comments

0

The error message shows that SQLite already appends ".so" to the file name. So you must specify the bare library name:

> .load './librank'

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.