svnno****@sourc*****
svnno****@sourc*****
2008年 1月 22日 (火) 10:34:57 JST
Revision: 84 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=tritonn&view=rev&rev=84 Author: mir Date: 2008-01-22 10:34:57 +0900 (Tue, 22 Jan 2008) Log Message: ----------- Applied tritonn-1.0.8 patch from myisam directory. This is very simple migration. May not work properly. Modified Paths: -------------- trunk/src/ft_boolean_search.c trunk/src/ft_nlq_search.c trunk/src/ft_update.c trunk/src/fulltext.h trunk/src/mi_check.c trunk/src/mi_close.c trunk/src/mi_create.c trunk/src/mi_delete_all.c trunk/src/mi_delete_table.c trunk/src/mi_info.c trunk/src/mi_open.c trunk/src/mi_rename.c trunk/src/myisam_ftdump.c trunk/src/myisamchk.c trunk/src/myisamlog.c trunk/src/myisampack.c Modified: trunk/src/ft_boolean_search.c =================================================================== --- trunk/src/ft_boolean_search.c 2008-01-21 07:26:12 UTC (rev 83) +++ trunk/src/ft_boolean_search.c 2008-01-22 01:34:57 UTC (rev 84) @@ -54,6 +54,11 @@ #define FT_CORE #include "ftdefs.h" +#ifdef ENABLE_SENNA +#include <senna.h> +#define SENNA_MAX_N_EXPR 32 +#endif /* ENABLE_SENNA */ + /* search with boolean queries */ static double _wghts[11]= @@ -142,6 +147,9 @@ uint keynr; uchar with_scan; enum { UNINITIALIZED, READY, INDEX_SEARCH, INDEX_DONE } state; +#ifdef ENABLE_SENNA + sen_records *sir; +#endif /* ENABLE_SENNA */ } FTB; static int FTB_WORD_cmp(my_off_t *v, FTB_WORD *a, FTB_WORD *b) @@ -541,6 +549,40 @@ DBUG_ASSERT(keynr==NO_SUCH_KEY || cs == info->s->keyinfo[keynr].seg->charset); ftb->with_scan=0; ftb->lastpos=HA_OFFSET_ERROR; +#ifdef ENABLE_SENNA + if ((ftb->keynr != NO_SUCH_KEY) && ftb->info->s->keyinfo[ftb->keynr].senna) + { + sen_index *i; + sen_query *q; + const char *rest; + unsigned int rest_len; + if (keynr==NO_SUCH_KEY || + !(i = info->s->keyinfo[keynr].senna)) { + SEN_LOG(sen_log_warning, "ft_init_boolean_serch: keynr==NO_SUCH_KEY"); + my_free((gptr)ftb,MYF(0)); + return 0; + } + SEN_LOG(sen_log_info, "ft_init_boolean_search => sen_query_open: str='%s', str_len=%d, max_exprs=%d", + query, query_len, SENNA_MAX_N_EXPR); + if (!(q = sen_query_open(query, query_len, sen_sel_or, SENNA_MAX_N_EXPR, + info->s->keyinfo[keynr].senna_encoding))) { + SEN_LOG(sen_log_error, "ft_init_boolean_serch: sen_query_open returned error"); + my_free((gptr)ftb,MYF(0)); + return 0; + } + SEN_LOG(sen_log_debug, "ft_init_boolean_search => sen_query_rest: q=%p, rest=%p", q, &rest); + if ((rest_len = sen_query_rest(q, &rest))) { + SEN_LOG(sen_log_warning, "ft_init_boolean_search: too long query. rest(%.*s) are ignored", rest_len, rest); + } + SEN_LOG(sen_log_debug, "ft_init_boolean_search => sen_records_open"); + ftb->sir = sen_records_open(sen_rec_document, sen_rec_none, 0); + SEN_LOG(sen_log_info, "ft_init_boolean_search => sen_query_exec: i=%p, q=%p, r=%p", i, q, ftb->sir); + sen_query_exec(i, q, ftb->sir, sen_sel_or); + SEN_LOG(sen_log_debug, "ft_init_boolean_search => sen_query_close: q=%p", q); + sen_query_close(q); + return ftb; + } +#endif /* ENABLE_SENNA */ bzero(& ftb->no_dupes, sizeof(TREE)); ftb->last_word= 0; @@ -777,6 +819,32 @@ int ft_boolean_read_next(FT_INFO *ftb, char *record) { +#ifdef ENABLE_SENNA + if ((ftb->keynr != NO_SUCH_KEY) && ftb->info->s->keyinfo[ftb->keynr].senna) + { + my_off_t pos; + MI_INFO *info=ftb->info; + while (ftb->sir && sen_records_next(ftb->sir, &pos, sizeof(my_off_t), NULL)) { + info->update&= (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED); + info->lastpos=pos; + if (!(my_thread_var->sen_flags & (SENNA_USE_2IND | SENNA_IF_READ_RECORD | + SENNA_FILESORT))) { + SEN_LOG(sen_log_dump, "ft_boolean_read_next: 2ind return 0"); + return 0; + } + if (!(*info->read_record)(info,info->lastpos,record)) { + info->update|= HA_STATE_AKTIV; /* Record is read */ + return 0; + } + SEN_LOG(sen_log_error, "ft_boolean_read_next: my_errno=%d pos=%lld", my_errno, pos); + if (my_errno == 127) { continue; } + return my_errno; + } + return HA_ERR_END_OF_FILE; + } + else +#endif /* ENABLE_SENNA */ + { FTB_EXPR *ftbe; FTB_WORD *ftbw; MI_INFO *info=ftb->info; @@ -847,9 +915,9 @@ err: ftb->queue.first_cmp_arg=(void *)0; return my_errno; + } } - typedef struct st_my_ftb_find_param { FT_INFO *ftb; @@ -907,6 +975,20 @@ float ft_boolean_find_relevance(FT_INFO *ftb, uchar *record, uint length) { +#ifdef ENABLE_SENNA + if ((ftb->keynr != NO_SUCH_KEY) && ftb->info->s->keyinfo[ftb->keynr].senna) + { + my_off_t docid=ftb->info->lastpos; + if (!ftb->sir) { return 0.0; } + if (docid == HA_OFFSET_ERROR) + return -2.0; + SEN_LOG(sen_log_dump, "ft_boolean_find_relevance => sen_records_find: records=%p, key=%p", + ftb->sir, &docid); + return 1.0 * sen_records_find(ftb->sir, &docid); + } + else +#endif /* ENABLE_SENNA */ + { FTB_EXPR *ftbe; FT_SEG_ITERATOR ftsi, ftsi2; my_off_t docid=ftb->info->lastpos; @@ -971,11 +1053,21 @@ { /* match failed ! */ return 0.0; } + } } void ft_boolean_close_search(FT_INFO *ftb) { +#ifdef ENABLE_SENNA + if ((ftb->keynr != NO_SUCH_KEY) && ftb->info->s->keyinfo[ftb->keynr].senna) + { + SEN_LOG(sen_log_debug, "ft_boolean_close_search => sen_records_close: records=%p", ftb->sir); + sen_records_close(ftb->sir); + my_free((gptr)ftb,MYF(0)); + return; + } +#endif /* ENABLE_SENNA */ if (is_tree_inited(& ftb->no_dupes)) { delete_tree(& ftb->no_dupes); @@ -987,12 +1079,28 @@ float ft_boolean_get_relevance(FT_INFO *ftb) { +#ifdef ENABLE_SENNA + if ((ftb->keynr != NO_SUCH_KEY) && ftb->info->s->keyinfo[ftb->keynr].senna) + { + if (!ftb->sir) { return 0.0; } + SEN_LOG(sen_log_dump, "ft_boolean_get_relevance => sen_records_curr_score: r=%p", ftb->sir); + return 1.0 * sen_records_curr_score(ftb->sir); + } +#endif /* ENABLE_SENNA */ return ftb->root->cur_weight; } void ft_boolean_reinit_search(FT_INFO *ftb) { +#ifdef ENABLE_SENNA + if ((ftb->keynr != NO_SUCH_KEY) && ftb->info->s->keyinfo[ftb->keynr].senna) + { + SEN_LOG(sen_log_debug, "ft_boolean_reinit_search => sen_records_rewind: records=%p", ftb->sir); + sen_records_rewind(ftb->sir); + return; + } +#endif /* ENABLE_SENNA */ _ftb_init_index_search(ftb); } Modified: trunk/src/ft_nlq_search.c =================================================================== --- trunk/src/ft_nlq_search.c 2008-01-21 07:26:12 UTC (rev 83) +++ trunk/src/ft_nlq_search.c 2008-01-22 01:34:57 UTC (rev 84) @@ -32,6 +32,9 @@ MI_INFO *info; int ndocs; int curdoc; +#ifdef ENABLE_SENNA + sen_records *sir; +#endif /* ENABLE_SENNA */ FT_DOC doc[1]; }; @@ -211,8 +214,23 @@ my_off_t saved_lastpos=info->lastpos; struct st_mysql_ftparser *parser; MYSQL_FTPARSER_PARAM *ftparser_param; +#ifdef ENABLE_SENNA + sen_records *sir; +#endif /* ENABLE_SENNA */ DBUG_ENTER("ft_init_nlq_search"); +#ifdef ENABLE_SENNA + if (info->s->keyinfo[keynr].senna) + { + SEN_LOG(sen_log_info, "ft_init_nlq_search => sen_index_sel index=%p, string='%s', string_len=%d", + info->s->keyinfo[keynr].senna, query, query_len); + sir = sen_index_sel(info->s->keyinfo[keynr].senna, query, query_len); + } + else + { + sir = NULL; + } +#endif /* ENABLE_SENNA */ /* black magic ON */ if ((int) (keynr = _mi_check_index(info,keynr)) < 0) DBUG_RETURN(NULL); @@ -290,6 +308,9 @@ dlist->info=aio.info; dptr=dlist->doc; +#ifdef ENABLE_SENNA + dlist->sir = sir; +#endif /* ENABLE_SENNA */ tree_walk(&aio.dtree, (tree_walk_action) &walk_and_copy, &dptr, left_root_right); @@ -307,6 +328,32 @@ int ft_nlq_read_next(FT_INFO *handler, char *record) { MI_INFO *info= (MI_INFO *) handler->info; +#ifdef ENABLE_SENNA + if (handler->sir) + { + my_off_t pos; + info->update&= (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED); + SEN_LOG(sen_log_dump, "ft_nlq_read_next => sen_records_next in while loop"); + while (sen_records_next(handler->sir, &pos, sizeof(my_off_t), NULL)) + { + info->lastpos=pos; + if (!(my_thread_var->sen_flags & (SENNA_USE_2IND | SENNA_IF_READ_RECORD | + SENNA_FILESORT))) { + SEN_LOG(sen_log_dump, "ft_nlq_read_next => 2ind return 0"); + return 0; + } + if (!(*info->read_record)(info,info->lastpos,record)) + { + info->update|= HA_STATE_AKTIV; /* Record is read */ + return 0; + } + SEN_LOG(sen_log_error, "ft_nlq_read_next => my_errno=%d pos=%lld", my_errno, pos); + if (my_errno == 127) { continue; } + return my_errno; + } + return HA_ERR_END_OF_FILE; + } +#endif /* ENABLE_SENNA */ if (++handler->curdoc >= handler->ndocs) { @@ -337,6 +384,14 @@ if (docid == HA_POS_ERROR) return -5.0; +#ifdef ENABLE_SENNA + if (handler->sir) { + SEN_LOG(sen_log_dump, "ft_nlq_find_relevance => sen_records_find: records=%p, key=%p", + handler->sir, &docid); + return 1.0 * sen_records_find(handler->sir, &docid); + } +#endif /* ENABLE_SENNA */ + /* Assuming docs[] is sorted by dpos... */ for (a=0, b=handler->ndocs, c=(a+b)/2; b-a>1; c=(a+b)/2) @@ -356,18 +411,46 @@ void ft_nlq_close_search(FT_INFO *handler) { +#ifdef ENABLE_SENNA + if (handler->sir) + { + SEN_LOG(sen_log_debug, "ft_nlq_close_search => sen_records_close: records=%p", + handler->sir); + sen_records_close(handler->sir); + } +#endif /* ENABLE_SENNA */ my_free((uchar*)handler,MYF(0)); } float ft_nlq_get_relevance(FT_INFO *handler) { +#ifdef ENABLE_SENNA + if (!handler->sir) { + if (handler->doc) { + return (float) handler->doc[handler->curdoc].weight; + } + return 0.0; + } + SEN_LOG(sen_log_dump, "ft_nlq_get_relevance => sen_records_curr_score: r=%p", + handler->sir); + return 1.0 * sen_records_curr_score(handler->sir); +#else /* ENABLE_SENNA */ return (float) handler->doc[handler->curdoc].weight; +#endif /* ENABLE_SENNA */ } void ft_nlq_reinit_search(FT_INFO *handler) { +#ifdef ENABLE_SENNA + if (handler->sir) + { + SEN_LOG(sen_log_debug, "ft_nlq_reinit_search => sen_records_rewind: r=%p", + handler->sir); + sen_records_rewind(handler->sir); + } +#endif /* ENABLE_SENNA */ handler->curdoc=-1; } Modified: trunk/src/ft_update.c =================================================================== --- trunk/src/ft_update.c 2008-01-21 07:26:12 UTC (rev 83) +++ trunk/src/ft_update.c 2008-01-22 01:34:57 UTC (rev 84) @@ -117,6 +117,19 @@ FT_WORD *_mi_ft_parserecord(MI_INFO *info, uint keynr, const uchar *record, MEM_ROOT *mem_root) { +#ifdef ENABLE_SENNA + if (info->s->keyinfo[keynr].senna) + { + FT_WORD *wlist; + if (!(wlist = (FT_WORD *) my_malloc(sizeof(FT_WORD), MYF(0)))) { + return NULL; + } + wlist->pos = 0; + return wlist; + } + else +#endif /* ENABLE_SENNA */ + { TREE ptree; MYSQL_FTPARSER_PARAM *param; DBUG_ENTER("_mi_ft_parserecord"); @@ -128,6 +141,7 @@ DBUG_RETURN(NULL); DBUG_RETURN(ft_linearize(&ptree, mem_root)); + } } static int _mi_ft_store(MI_INFO *info, uint keynr, uchar *keybuf, @@ -187,7 +201,130 @@ DBUG_RETURN(GEE_THEY_ARE_ABSOLUTELY_IDENTICAL); } +#ifdef ENABLE_SENNA +#define SECTIONALIZE 0x00080000 +int ft_sen_index_add(MI_INFO *info, uint keynr, const byte *record, my_off_t pos) +{ + DBUG_ENTER("ft_sen_index_add"); + if (info->s->keyinfo[keynr].senna_flags & SECTIONALIZE) { + FT_SEG_ITERATOR ftsi; + unsigned int section; + sen_values *values; + _mi_ft_segiterator_init(info, keynr, record, &ftsi); + while (_mi_ft_segiterator(&ftsi)) { + if (ftsi.pos) { + if (ftsi.len > 1048576) { SEN_LOG(sen_log_debug, "ft_sen_index_add: ftsi.len=%d", ftsi.len); } + } + } + _mi_ft_segiterator_init(info, keynr, record, &ftsi); + while (_mi_ft_segiterator(&ftsi)) { + if (ftsi.pos) { + section = ftsi.num + 1; + SEN_LOG(sen_log_debug, "ft_sen_index_add => sen_values_open"); + values = sen_values_open(); + SEN_LOG(sen_log_debug, "ft_sen_index_add => sen_values_add: values=%p, str=%s, str_len=%d, weight=%d", + values, ftsi.pos, ftsi.len, 0); + sen_values_add(values, ftsi.pos, ftsi.len, 0); + SEN_LOG(sen_log_info, "ft_sen_index_add => sen_index_update: index=%p, key=%p (pos=%d), section=%d, oldvalue=%p, newvalue=%p", + info->s->keyinfo[keynr].senna, &pos, (uint) pos, section, NULL, values); + sen_index_update(info->s->keyinfo[keynr].senna, &pos, ftsi.num+1, NULL, values); + SEN_LOG(sen_log_debug, "ft_sen_index_add => sen_values_close: values=%p", values); + sen_values_close(values); + } + } + DBUG_RETURN(0); + } else { + FT_SEG_ITERATOR ftsi; + char *buf, *p; + uint len = 0; + _mi_ft_segiterator_init(info, keynr, record, &ftsi); + while (_mi_ft_segiterator(&ftsi)) { + if (ftsi.pos) { + if (ftsi.len > 1048576) { SEN_LOG(sen_log_debug, "ft_sen_index_add: ftsi.len=%d", ftsi.len); } + len += ftsi.len + 1; + } + } + if (!len) { return -1; } + if (!(p = buf = malloc(len))) { return -1; } + _mi_ft_segiterator_init(info, keynr, record, &ftsi); + while (_mi_ft_segiterator(&ftsi)) { + if (ftsi.pos) { + if (p != buf) { *p++ = ' '; } + memcpy(p, ftsi.pos, ftsi.len); + p += ftsi.len; + } + } + *p = '\0'; + SEN_LOG(sen_log_info, "ft_sen_index_add => sen_index_upd: index=%p, key=%p (pos=%d), oldvalue=%s," + "oldvalue_len=%d, newvalue=%s, newvalue_len=%d", + info->s->keyinfo[keynr].senna, &pos, (uint) pos, NULL, 0, buf, (p - buf)); + sen_index_upd(info->s->keyinfo[keynr].senna, &pos, NULL, 0, buf, (p - buf)); + free(buf); + DBUG_RETURN(0); + } +} +int ft_sen_index_del(MI_INFO *info, uint keynr, const byte *record, my_off_t pos) +{ + if (info->s->keyinfo[keynr].senna_flags & SECTIONALIZE) { + FT_SEG_ITERATOR ftsi; + unsigned int section; + sen_values *values; + _mi_ft_segiterator_init(info, keynr, record, &ftsi); + while (_mi_ft_segiterator(&ftsi)) { + if (ftsi.pos) { + if (ftsi.len > 1048576) { SEN_LOG(sen_log_debug, "ft_sen_index_del: ftsi.len=%d", ftsi.len); } + } + } + _mi_ft_segiterator_init(info, keynr, record, &ftsi); + while (_mi_ft_segiterator(&ftsi)) { + if (ftsi.pos) { + section = ftsi.num + 1; + SEN_LOG(sen_log_debug, "ft_sen_index_del => sen_values_open"); + values = sen_values_open(); + SEN_LOG(sen_log_debug, "ft_sen_index_del => sen_values_add: values=%p, str=%s, str_len=%d, weight=%d", + values, ftsi.pos, ftsi.len, 0); + sen_values_add(values, ftsi.pos, ftsi.len, 0); + SEN_LOG(sen_log_info, "ft_sen_index_del => sen_index_update: index=%p, key=%p (pos=%d), section=%d, oldvalue=%p, newvalue=%p", + info->s->keyinfo[keynr].senna, &pos, (uint) pos, section, values, NULL); + sen_index_update(info->s->keyinfo[keynr].senna, &pos, section, values, NULL); + SEN_LOG(sen_log_debug, "ft_sen_index_del => sen_values_close: values=%p", values); + sen_values_close(values); + } + } + return 0; + } else { + FT_SEG_ITERATOR ftsi; + char *buf, *p; + uint len = 0; + _mi_ft_segiterator_init(info, keynr, record, &ftsi); + while (_mi_ft_segiterator(&ftsi)) { + if (ftsi.pos) { + if (ftsi.len > 1048576) { SEN_LOG(sen_log_debug, "ft_sen_index_del: ftsi.len=%d", ftsi.len); } + len += ftsi.len + 1; + } + } + if (!len) { return -1; } + if (!(p = buf = malloc(len))) { return -1; } + _mi_ft_segiterator_init(info, keynr, record, &ftsi); + while (_mi_ft_segiterator(&ftsi)) { + if (ftsi.pos) { + if (p != buf) { *p++ = ' '; } + memcpy(p, ftsi.pos, ftsi.len); + p += ftsi.len; + } + } + *p = '\0'; + SEN_LOG(sen_log_info, "ft_sen_index_add => sen_index_upd: index=%p, key=%p (pos=%d), oldvalue=%p," + "oldvalue_len=%d, newvalue=%p, newvalue_len=%d", + info->s->keyinfo[keynr].senna, &pos, (uint) pos, buf, (p - buf), NULL, 0); + sen_index_upd(info->s->keyinfo[keynr].senna, &pos, buf, (p - buf), NULL, 0); + free(buf); + return 0; + } +} +#endif /* ENABLE_SENNA */ + /* update a document entry */ int _mi_ft_update(MI_INFO *info, uint keynr, uchar *keybuf, @@ -200,6 +337,14 @@ int cmp, cmp2; DBUG_ENTER("_mi_ft_update"); +#ifdef ENABLE_SENNA + if (info->s->keyinfo[keynr].senna) + { + ft_sen_index_del(info, keynr, oldrec, pos); + ft_sen_index_add(info, keynr, newrec, pos); + } +#endif /* ENABLE_SENNA */ + if (!(old_word=oldlist=_mi_ft_parserecord(info, keynr, oldrec, &info->ft_memroot)) || !(new_word=newlist=_mi_ft_parserecord(info, keynr, newrec, @@ -249,6 +394,11 @@ DBUG_ENTER("_mi_ft_add"); DBUG_PRINT("enter",("keynr: %d",keynr)); +#ifdef ENABLE_SENNA + if (info->s->keyinfo[keynr].senna) + ft_sen_index_add(info, keynr, record, pos); +#endif /* ENABLE_SENNA */ + if ((wlist=_mi_ft_parserecord(info, keynr, record, &info->ft_memroot))) error=_mi_ft_store(info,keynr,keybuf,wlist,pos); @@ -268,6 +418,11 @@ DBUG_ENTER("_mi_ft_del"); DBUG_PRINT("enter",("keynr: %d",keynr)); +#ifdef ENABLE_SENNA + if (info->s->keyinfo[keynr].senna) + ft_sen_index_del(info, keynr, record, pos); +#endif /* ENABLE_SENNA */ + if ((wlist=_mi_ft_parserecord(info, keynr, record, &info->ft_memroot))) error=_mi_ft_erase(info,keynr,keybuf,wlist,pos); @@ -350,3 +505,43 @@ SEARCH_SAME)); } +#ifdef ENABLE_SENNA +/* + this function is called by myisamchk only. +*/ +void ft_sen_index_truncate(MI_INFO *info) +{ + char buf[FN_REFLEN]; + MYISAM_SHARE *share= info->s; + uint i, keys= (uint) share->state.header.keys; + DBUG_ENTER("ft_sen_index_truncate"); + for (i=0 ; i < keys ; i++) + { + if (share->keyinfo[i].flag & HA_FULLTEXT) + { + if (share->keyinfo[i].senna) + { + sen_index_close(share->keyinfo[i].senna); + } + strcpy(buf, share->unique_file_name); + sprintf(buf + strlen(buf) - 3, "%03d", i); + if (share->keyinfo[i].senna_flags & SEN_DISABLE_SENNA) + { + share->keyinfo[i].senna = NULL; + } else { + if (!(share->keyinfo[i].senna_encoding >= 0 && share->keyinfo[i].senna_encoding <= 6)) + { + share->keyinfo[i].senna = NULL; + DBUG_VOID_RETURN; + } else { + share->keyinfo[i].senna = sen_index_create(buf, sizeof(my_off_t), + share->keyinfo[i].senna_flags, + share->keyinfo[i].senna_initial_n_segments, + share->keyinfo[i].senna_encoding); + } + } + } + } + DBUG_VOID_RETURN; +} +#endif /* ENABLE_SENNA */ Modified: trunk/src/fulltext.h =================================================================== --- trunk/src/fulltext.h 2008-01-21 07:26:12 UTC (rev 83) +++ trunk/src/fulltext.h 2008-01-22 01:34:57 UTC (rev 84) @@ -35,3 +35,7 @@ uint _mi_ft_convert_to_ft2(MI_INFO *, uint, uchar *); +#ifdef ENABLE_SENNA +int ft_sen_index_add(MI_INFO *info, uint keynr, const byte *record, my_off_t pos); +void ft_sen_index_truncate(MI_INFO *info); +#endif Modified: trunk/src/mi_check.c =================================================================== --- trunk/src/mi_check.c 2008-01-21 07:26:12 UTC (rev 83) +++ trunk/src/mi_check.c 2008-01-22 01:34:57 UTC (rev 84) @@ -2108,7 +2108,6 @@ SORT_INFO sort_info; ulonglong key_map=share->state.key_map; DBUG_ENTER("mi_repair_by_sort"); - start_records=info->state->records; got_error=1; new_file= -1; @@ -3048,6 +3047,11 @@ free_root(&sort_param->wordroot, MYF(MY_MARK_BLOCKS_FREE)); if ((error=sort_get_next_record(sort_param))) DBUG_RETURN(error); +#ifdef ENABLE_SENNA + if (info->s->keyinfo[sort_param->key].senna) { + ft_sen_index_add(info, sort_param->key, sort_param->record, sort_param->filepos); + } +#endif /* ENABLE_SENNA */ if (!(wptr=_mi_ft_parserecord(info,sort_param->key,sort_param->record, &sort_param->wordroot))) DBUG_RETURN(1); Modified: trunk/src/mi_close.c =================================================================== --- trunk/src/mi_close.c 2008-01-21 07:26:12 UTC (rev 83) +++ trunk/src/mi_close.c 2008-01-22 01:34:57 UTC (rev 84) @@ -30,7 +30,6 @@ DBUG_PRINT("enter",("base: 0x%lx reopen: %u locks: %u", (long) info, (uint) share->reopen, (uint) share->tot_locks)); - pthread_mutex_lock(&THR_LOCK_myisam); if (info->lock_type == F_EXTRA_LCK) info->lock_type=F_UNLCK; /* HA_EXTRA_NO_USER_CHANGE */ @@ -99,6 +98,26 @@ VOID(rwlock_destroy(&share->mmap_lock)); for(i=0; i<keys; i++) { VOID(rwlock_destroy(&share->key_root_lock[i])); + +#ifdef ENABLE_SENNA + if (share->keyinfo[i].flag & HA_FULLTEXT) + { + { + char buf[FN_REFLEN]; + strncpy(buf, share->unique_file_name, FN_REFLEN - 1); + buf[FN_REFLEN - 1] = '\0'; + sprintf(buf + strlen(buf) - 3, "%03d", i); + if (share->keyinfo[i].senna) { + SEN_LOG(sen_log_notice, "mi_close => sen_index_close: " + "delay_key_write=%d, unique_file_name=%s, data_file_name=%s, index_file_name=%s", + share->delay_key_write, share->unique_file_name, share->data_file_name, share->index_file_name); + sen_index_close(share->keyinfo[i].senna); + } + } + } +#endif /* ENABLE_SENNA */ + + } } #endif Modified: trunk/src/mi_create.c =================================================================== --- trunk/src/mi_create.c 2008-01-21 07:26:12 UTC (rev 83) +++ trunk/src/mi_create.c 2008-01-22 01:34:57 UTC (rev 84) @@ -287,6 +287,59 @@ } else if (keydef->flag & HA_FULLTEXT) { +#ifdef ENABLE_SENNA + sen_index *senna; + char buf[FN_REFLEN]; + strncpy(buf, name, FN_REFLEN - 1); + buf[FN_REFLEN - 1] = '\0'; + sprintf(buf + strlen(buf), ".%03d", i); + if (!(keydef->senna_flags & SEN_DISABLE_SENNA)) + { + /* make index files */ + SEN_LOG(sen_log_notice, + "mi_create => sen_index_create: path=%s, key_size=%d, flags=%x, ins=%d", buf, + sizeof(my_off_t), keydef->senna_flags, keydef->senna_initial_n_segments); + if (!(keydef->senna_encoding >= 0 && keydef->senna_encoding <= 6)) + { + my_errno= HA_WRONG_CREATE_OPTION; + goto err; + } + senna = sen_index_create(buf, sizeof(my_off_t), + keydef->senna_flags, + keydef->senna_initial_n_segments, + keydef->senna_encoding); + SEN_LOG(sen_log_notice, "mi_create => sen_index_close: index=%p", senna); + sen_index_close(senna); + } else { + SEN_LOG(sen_log_notice, "mi_create => sen_index_open: path=%s", buf); + senna = sen_index_open(buf); + if (senna) { + int senna_flags, senna_initial_n_segments; + sen_encoding senna_encoding; + SEN_LOG(sen_log_info, "mi_create => sen_index_info: index=%p", senna); + sen_index_info(senna, NULL, &senna_flags, &senna_initial_n_segments, + &senna_encoding, NULL, NULL, NULL, NULL, NULL, NULL); + SEN_LOG(sen_log_notice, "mi_create => sen_index_close: index=%p", senna); + sen_index_close(senna); + SEN_LOG(sen_log_notice, "mi_create => sen_index_remove: path=%s", buf); + sen_index_remove(buf); + SEN_LOG(sen_log_notice, + "mi_create => sen_index_create: path=%s, key_size=%d, flags=%x ins=%d)", buf, + sizeof(my_off_t), senna_flags, senna_initial_n_segments); + if (!(senna_encoding >= 0 && senna_encoding <= 6)) + { + my_errno= HA_WRONG_CREATE_OPTION; + goto err; + } + senna = sen_index_create(buf, sizeof(my_off_t), + senna_flags, + senna_initial_n_segments, + senna_encoding); + SEN_LOG(sen_log_notice, "mi_create => sen_index_close: index=%p", senna); + sen_index_close(senna); + } + } +#endif /* ENABLE_SENNA */ keydef->flag=HA_FULLTEXT | HA_PACK_KEY | HA_VAR_LENGTH_KEY; options|=HA_OPTION_PACK_KEYS; /* Using packed keys */ Modified: trunk/src/mi_delete_all.c =================================================================== --- trunk/src/mi_delete_all.c 2008-01-21 07:26:12 UTC (rev 83) +++ trunk/src/mi_delete_all.c 2008-01-22 01:34:57 UTC (rev 84) @@ -34,6 +34,34 @@ if (_mi_mark_file_changed(info)) goto err; +#ifdef ENABLE_SENNA + for (i = 0; i < share->base.keys; i++) { + sen_index *senna = share->keyinfo[i].senna; + if (senna) + { + char buf[FN_REFLEN]; + if (!(share->keyinfo[i].senna_encoding >= 0 && share->keyinfo[i].senna_encoding <= 6)) + { + my_errno= HA_WRONG_CREATE_OPTION; + goto err; + } + SEN_LOG(sen_log_debug, "mi_delete_all_rows => sen_index_path: index=%p, buf=%s", senna, buf); + sen_index_path(senna, buf, FN_REFLEN); + SEN_LOG(sen_log_notice, "mi_delete_all_rows => sen_index_close: index=%p", senna); + sen_index_close(senna); + SEN_LOG(sen_log_notice, "mi_delete_all_rows => sen_index_remove: buf=%s", buf); + sen_index_remove(buf); + SEN_LOG(sen_log_notice, "mi_delete_all_rows => sen_index_create: path=%s, flags=%x, ins=%d", + buf, share->keyinfo[i].senna_flags, share->keyinfo[i].senna_initial_n_segments); + senna = sen_index_create(buf, sizeof(my_off_t), + share->keyinfo[i].senna_flags, + share->keyinfo[i].senna_initial_n_segments, + share->keyinfo[i].senna_encoding); + share->keyinfo[i].senna = senna; + } + } +#endif /* ENABLE_SENNA */ + info->state->records=info->state->del=state->split=0; state->dellink = HA_OFFSET_ERROR; state->sortkey= (ushort) ~0; Modified: trunk/src/mi_delete_table.c =================================================================== --- trunk/src/mi_delete_table.c 2008-01-21 07:26:12 UTC (rev 83) +++ trunk/src/mi_delete_table.c 2008-01-22 01:34:57 UTC (rev 84) @@ -56,7 +56,32 @@ check_table_is_closed(name,"delete"); #endif #endif /* USE_RAID */ +#ifdef ENABLE_SENNA + { + int i,j,keys; + int should_be_deleted[1024]; + MI_INFO *mi_info; + MI_INFO cp_of_mi_info; + if (!(mi_info = mi_open(name, O_RDONLY, 0))) + { + SEN_LOG(sen_log_warning, "mi_delete_table => cannot get MI_INFO"); + DBUG_RETURN(my_errno); + } + keys = mi_info->s->base.keys; + for (i=0,j=0; i<keys; i++) + { + if (mi_info->s->keyinfo[i].senna) should_be_deleted[j++]=i; + } + mi_close(mi_info); + for (i=0; i<j; i++) + { + my_snprintf(from, FN_REFLEN, "%s.%03d", name, should_be_deleted[i]); + SEN_LOG(sen_log_notice, "mi_delete_table => sen_index_remove: path=%s", from); + sen_index_remove(from); + } + } +#endif /* ENABLE_SENNA */ fn_format(from,name,"",MI_NAME_IEXT,MY_UNPACK_FILENAME|MY_APPEND_EXT); if (my_delete_with_symlink(from, MYF(MY_WME))) DBUG_RETURN(my_errno); Modified: trunk/src/mi_info.c =================================================================== --- trunk/src/mi_info.c 2008-01-21 07:26:12 UTC (rev 83) +++ trunk/src/mi_info.c 2008-01-22 01:34:57 UTC (rev 84) @@ -60,6 +60,26 @@ x->mean_reclength= x->records ? (ulong) ((x->data_file_length - x->delete_length) / x->records) : (ulong) share->min_pack_length; +#ifdef ENABLE_SENNA + if ((flag & HA_STATUS_SENNA) && share->keyinfo) + { + int i; + for (i = 0; i < share->base.keys; i++) + { + MI_KEYDEF *keydef = &share->keyinfo[i]; + sen_index *senna = keydef->senna; + if (senna) + { + SEN_LOG(sen_log_info, "mi_info => sen_index_info: index=%p", senna); + sen_index_info(senna, NULL, &keydef->senna_flags, + &keydef->senna_initial_n_segments, &keydef->senna_encoding, + &keydef->senna_keys_size, &keydef->senna_keys_file_size, + &keydef->senna_lexicon_size, &keydef->senna_lexicon_file_size, + &keydef->senna_inv_seg_size, &keydef->senna_inv_chunk_size); + } + } + } +#endif /* ENABLE_SENNA */ } if (flag & HA_STATUS_ERRKEY) { Modified: trunk/src/mi_open.c =================================================================== --- trunk/src/mi_open.c 2008-01-21 07:26:12 UTC (rev 83) +++ trunk/src/mi_open.c 2008-01-22 01:34:57 UTC (rev 84) @@ -356,6 +356,11 @@ else if (pos->type == HA_KEYTYPE_BINARY) pos->charset= &my_charset_bin; } +#ifdef ENABLE_SENNA + share->keyinfo[i].senna = NULL; + share->keyinfo[i].senna_flags = 0; + share->keyinfo[i].senna_initial_n_segments = 0; +#endif /* ENABLE_SENNA */ if (share->keyinfo[i].flag & HA_SPATIAL) { #ifdef HAVE_SPATIAL @@ -369,6 +374,29 @@ } else if (share->keyinfo[i].flag & HA_FULLTEXT) { +#ifdef ENABLE_SENNA + if (!(share->keyinfo[i].senna_flags & SEN_DISABLE_SENNA)) + { + { + char buf[FN_REFLEN]; + strncpy(buf, share->unique_file_name, FN_REFLEN - 1); + buf[FN_REFLEN - 1] = '\0'; + sprintf(buf + strlen(buf) - 3, "%03d", i); + SEN_LOG(sen_log_notice, "mi_open => " + "sen_index_open: path=%s, delay_key_write=%d, unique_file_name=%s, data_file_name=%s, " + "index_file_name=%s, keyinfo[%d].seg=%d", + buf, share->delay_key_write, share->unique_file_name, share->data_file_name, + share->index_file_name, i, pos-FT_SEGS); + share->keyinfo[i].senna = sen_index_open(buf); + SEN_LOG(sen_log_info, "mi_open => sen_index_info: index=%p", share->keyinfo[i].senna); + sen_index_info(share->keyinfo[i].senna, NULL, + &share->keyinfo[i].senna_flags, + &share->keyinfo[i].senna_initial_n_segments, + &share->keyinfo[i].senna_encoding, + NULL, NULL, NULL, NULL, NULL, NULL); + } + } +#endif /* ENABLE_SENNA */ if (!fulltext_keys) { /* 4.0 compatibility code, to be removed in 5.0 */ share->keyinfo[i].seg=pos-FT_SEGS; Modified: trunk/src/mi_rename.c =================================================================== --- trunk/src/mi_rename.c 2008-01-21 07:26:12 UTC (rev 83) +++ trunk/src/mi_rename.c 2008-01-22 01:34:57 UTC (rev 84) @@ -45,6 +45,34 @@ #endif #endif /* USE_RAID */ +#ifdef ENABLE_SENNA /* nkjm modified 2007/06/04 SFID:10291 */ + { + int i, keys; + MI_INFO *mi_info; + MI_INFO cp_of_mi_info; + + if (!(mi_info = mi_open(old_name, O_RDONLY, 0))) + { + SEN_LOG(sen_log_warning, "mi_rename => cannot get MI_INFO"); + DBUG_RETURN(my_errno); + } + + cp_of_mi_info = *mi_info; + mi_close(mi_info); + keys = cp_of_mi_info.s->base.keys; + for (i = 0; i < keys; i++) + { + if (cp_of_mi_info.s->keyinfo[i].senna) + { + my_snprintf(from, FN_REFLEN, "%s.%03d", old_name, i); + my_snprintf(to, FN_REFLEN, "%s.%03d", new_name, i); + SEN_LOG(sen_log_notice, "mi_rename => sen_index_rename: from=%s, to=%s", from, to); + sen_index_rename(from, to); + } + } + } +#endif /* ENABLE_SENNA */ + fn_format(from,old_name,"",MI_NAME_IEXT,MY_UNPACK_FILENAME|MY_APPEND_EXT); fn_format(to,new_name,"",MI_NAME_IEXT,MY_UNPACK_FILENAME|MY_APPEND_EXT); if (my_rename_with_symlink(from, to, MYF(MY_WME))) Modified: trunk/src/myisam_ftdump.c =================================================================== --- trunk/src/myisam_ftdump.c 2008-01-21 07:26:12 UTC (rev 83) +++ trunk/src/myisam_ftdump.c 2008-01-22 01:34:57 UTC (rev 84) @@ -63,6 +63,9 @@ struct { MI_INFO *info; } aio0, *aio=&aio0; /* for GWS_IN_USE */ MY_INIT(argv[0]); +#ifdef ENABLE_SENNA + sen_init(); +#endif /* ENABLE_SENNA */ if ((error= handle_options(&argc, &argv, my_long_options, get_one_option))) exit(error); if (count || dump) Modified: trunk/src/myisamchk.c =================================================================== --- trunk/src/myisamchk.c 2008-01-21 07:26:12 UTC (rev 83) +++ trunk/src/myisamchk.c 2008-01-22 01:34:57 UTC (rev 84) @@ -93,6 +93,9 @@ get_options(&argc,(char***) &argv); myisam_quick_table_bits=decode_bits; error=0; +#ifdef ENABLE_SENNA + sen_init(); +#endif /* ENABLE_SENNA */ while (--argc >= 0) { int new_error=myisamchk(&check_param, *(argv++)); @@ -1003,6 +1006,9 @@ } if (!error) { +#ifdef ENABLE_SENNA + ft_sen_index_truncate(info); +#endif /* ENABLE_SENNA */ if ((param->testflag & (T_REP_BY_SORT | T_REP_PARALLEL)) && (mi_is_any_key_active(share->state.key_map) || (rep_quick && !param->keys_in_use && !recreate)) && @@ -1059,6 +1065,9 @@ { if (param->verbose) puts("Table had a compressed index; We must now recreate the index"); +#ifdef ENABLE_SENNA + ft_sen_index_truncate(info); +#endif /* ENABLE_SENNA */ error=mi_repair_by_sort(param,info,filename,1); } } Modified: trunk/src/myisamlog.c =================================================================== --- trunk/src/myisamlog.c 2008-01-21 07:26:12 UTC (rev 83) +++ trunk/src/myisamlog.c 2008-01-22 01:34:57 UTC (rev 84) @@ -86,6 +86,9 @@ int error,i,first; ulong total_count,total_error,total_recover; MY_INIT(argv[0]); +#ifdef ENABLE_SENNA + sen_init(); +#endif /* ENABLE_SENNA */ log_filename=myisam_log_filename; get_options(&argc,&argv); Modified: trunk/src/myisampack.c =================================================================== --- trunk/src/myisampack.c 2008-01-21 07:26:12 UTC (rev 83) +++ trunk/src/myisampack.c 2008-01-22 01:34:57 UTC (rev 84) @@ -207,6 +207,9 @@ PACK_MRG_INFO merge; char **default_argv; MY_INIT(argv[0]); +#ifdef ENABLE_SENNA + sen_init(); +#endif /* ENABLE_SENNA */ load_defaults("my",load_default_groups,&argc,&argv); default_argv= argv;