OLD | NEW |
1 /* The author disclaims copyright to this source code. | 1 /* The author disclaims copyright to this source code. |
2 * | 2 * |
3 * This is an SQLite module implementing full-text search. | 3 * This is an SQLite module implementing full-text search. |
4 */ | 4 */ |
5 | 5 |
6 #include <assert.h> | 6 #include <assert.h> |
7 #if !defined(__APPLE__) | 7 #if !defined(__APPLE__) |
8 #include <malloc.h> | 8 #include <malloc.h> |
9 #else | 9 #else |
10 #include <stdlib.h> | 10 #include <stdlib.h> |
(...skipping 834 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
845 free(v); | 845 free(v); |
846 } | 846 } |
847 | 847 |
848 /* Current interface: | 848 /* Current interface: |
849 ** argv[0] - module name | 849 ** argv[0] - module name |
850 ** argv[1] - database name | 850 ** argv[1] - database name |
851 ** argv[2] - table name | 851 ** argv[2] - table name |
852 ** argv[3] - tokenizer name (optional, a sensible default is provided) | 852 ** argv[3] - tokenizer name (optional, a sensible default is provided) |
853 ** argv[4..] - passed to tokenizer (optional based on tokenizer) | 853 ** argv[4..] - passed to tokenizer (optional based on tokenizer) |
854 **/ | 854 **/ |
855 static int fulltextConnect(sqlite3 *db, void *pAux, int argc, char **argv, | 855 static int fulltextConnect( |
856 sqlite3_vtab **ppVTab){ | 856 sqlite3 *db, |
| 857 void *pAux, |
| 858 int argc, |
| 859 const char * const *argv, |
| 860 sqlite3_vtab **ppVTab, |
| 861 char **pzErr |
| 862 ){ |
857 int rc; | 863 int rc; |
858 fulltext_vtab *v; | 864 fulltext_vtab *v; |
859 sqlite3_tokenizer_module *m = NULL; | 865 sqlite3_tokenizer_module *m = NULL; |
860 | 866 |
861 assert( argc>=3 ); | 867 assert( argc>=3 ); |
862 v = (fulltext_vtab *) malloc(sizeof(fulltext_vtab)); | 868 v = (fulltext_vtab *) malloc(sizeof(fulltext_vtab)); |
863 /* sqlite will initialize v->base */ | 869 /* sqlite will initialize v->base */ |
864 v->db = db; | 870 v->db = db; |
865 v->zName = string_dup(argv[2]); | 871 v->zName = string_dup(argv[2]); |
866 v->pTokenizer = NULL; | 872 v->pTokenizer = NULL; |
(...skipping 24 matching lines...) Expand all Loading... |
891 | 897 |
892 rc = sqlite3_declare_vtab(db, "create table x(content text)"); | 898 rc = sqlite3_declare_vtab(db, "create table x(content text)"); |
893 if( rc!=SQLITE_OK ) return rc; | 899 if( rc!=SQLITE_OK ) return rc; |
894 | 900 |
895 memset(v->pFulltextStatements, 0, sizeof(v->pFulltextStatements)); | 901 memset(v->pFulltextStatements, 0, sizeof(v->pFulltextStatements)); |
896 | 902 |
897 *ppVTab = &v->base; | 903 *ppVTab = &v->base; |
898 return SQLITE_OK; | 904 return SQLITE_OK; |
899 } | 905 } |
900 | 906 |
901 static int fulltextCreate(sqlite3 *db, void *pAux, int argc, char **argv, | 907 static int fulltextCreate( |
902 sqlite3_vtab **ppVTab){ | 908 sqlite3 *db, |
| 909 void *pAux, |
| 910 int argc, |
| 911 const char * const *argv, |
| 912 sqlite3_vtab **ppVTab, |
| 913 char **pzErr |
| 914 ){ |
903 int rc; | 915 int rc; |
904 assert( argc>=3 ); | 916 assert( argc>=3 ); |
905 | 917 |
906 /* The %_content table holds the text of each full-text item, with | 918 /* The %_content table holds the text of each full-text item, with |
907 ** the rowid used as the docid. | 919 ** the rowid used as the docid. |
908 ** | 920 ** |
909 ** The %_term table maps each term to a document list blob | 921 ** The %_term table maps each term to a document list blob |
910 ** containing elements sorted by ascending docid, each element | 922 ** containing elements sorted by ascending docid, each element |
911 ** encoded as: | 923 ** encoded as: |
912 ** | 924 ** |
(...skipping 14 matching lines...) Expand all Loading... |
927 ** first from that row. I _believe_ this does not matter to the | 939 ** first from that row. I _believe_ this does not matter to the |
928 ** operation of the system, but it might be reasonable to update | 940 ** operation of the system, but it might be reasonable to update |
929 ** appropriately in case this assumption becomes more important. | 941 ** appropriately in case this assumption becomes more important. |
930 */ | 942 */ |
931 rc = sql_exec(db, argv[2], | 943 rc = sql_exec(db, argv[2], |
932 "create table %_content(content text);" | 944 "create table %_content(content text);" |
933 "create table %_term(term text, first integer, doclist blob);" | 945 "create table %_term(term text, first integer, doclist blob);" |
934 "create index %_index on %_term(term, first)"); | 946 "create index %_index on %_term(term, first)"); |
935 if( rc!=SQLITE_OK ) return rc; | 947 if( rc!=SQLITE_OK ) return rc; |
936 | 948 |
937 return fulltextConnect(db, pAux, argc, argv, ppVTab); | 949 return fulltextConnect(db, pAux, argc, argv, ppVTab, pzErr); |
938 } | 950 } |
939 | 951 |
940 /* Decide how to handle an SQL query. | 952 /* Decide how to handle an SQL query. |
941 * At the moment, MATCH queries can include implicit boolean ANDs; we | 953 * At the moment, MATCH queries can include implicit boolean ANDs; we |
942 * haven't implemented phrase searches or OR yet. */ | 954 * haven't implemented phrase searches or OR yet. */ |
943 static int fulltextBestIndex(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ | 955 static int fulltextBestIndex(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ |
944 int i; | 956 int i; |
945 | 957 |
946 for(i=0; i<pInfo->nConstraint; ++i){ | 958 for(i=0; i<pInfo->nConstraint; ++i){ |
947 const struct sqlite3_index_constraint *pConstraint; | 959 const struct sqlite3_index_constraint *pConstraint; |
(...skipping 533 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1481 fulltextColumn, | 1493 fulltextColumn, |
1482 fulltextRowid, | 1494 fulltextRowid, |
1483 fulltextUpdate | 1495 fulltextUpdate |
1484 }; | 1496 }; |
1485 | 1497 |
1486 int fulltext_init(sqlite3 *db){ | 1498 int fulltext_init(sqlite3 *db){ |
1487 return sqlite3_create_module(db, "fulltext", &fulltextModule, 0); | 1499 return sqlite3_create_module(db, "fulltext", &fulltextModule, 0); |
1488 } | 1500 } |
1489 | 1501 |
1490 #if !SQLITE_CORE | 1502 #if !SQLITE_CORE |
1491 int sqlite3_extension_init(sqlite3 *db, char **pzErrMsg, | 1503 #ifdef _WIN32 |
1492 const sqlite3_api_routines *pApi){ | 1504 __declspec(dllexport) |
| 1505 #endif |
| 1506 int sqlite3_fulltext_init(sqlite3 *db, char **pzErrMsg, |
| 1507 const sqlite3_api_routines *pApi){ |
1493 SQLITE_EXTENSION_INIT2(pApi) | 1508 SQLITE_EXTENSION_INIT2(pApi) |
1494 return fulltext_init(db); | 1509 return fulltext_init(db); |
1495 } | 1510 } |
1496 #endif | 1511 #endif |
OLD | NEW |