ft_test1.c
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:7k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. /* Written by Sergei A. Golubchik, who has a shared copyright to this code */
  14. #include "ftdefs.h"
  15. #include "ft_test1.h"
  16. #include <getopt.h>
  17. static int key_field=FIELD_VARCHAR,extra_field=FIELD_SKIPP_ENDSPACE;
  18. static uint key_length=200,extra_length=50;
  19. static int key_type=HA_KEYTYPE_TEXT;
  20. static int verbose=0,silent=0,skip_update=0,
  21.    no_keys=0,no_stopwords=0,no_search=0,no_fulltext=0;
  22. static int create_flag=0,error=0;
  23. #define MAX_REC_LENGTH 300
  24. static char record[MAX_REC_LENGTH],read_record[MAX_REC_LENGTH];
  25. void get_options(int argc,char *argv[]);
  26. static int run_test(const char *filename);
  27. int main(int argc,char *argv[])
  28. {
  29.   MY_INIT(argv[0]);
  30.   get_options(argc,argv);
  31.   exit(run_test("FT1"));
  32. }
  33. static MI_COLUMNDEF recinfo[3];
  34. static MI_KEYDEF keyinfo[2];
  35. static MI_KEYSEG keyseg[10];
  36. void create_record(char *, int);
  37. static int run_test(const char *filename)
  38. {
  39.   MI_INFO *file;
  40.   int i,j;
  41.   my_off_t pos;
  42.   bzero((char*) recinfo,sizeof(recinfo));
  43.   /* First define 2 columns */
  44.   recinfo[0].type=extra_field;
  45.   recinfo[0].length= (extra_field == FIELD_BLOB ? 4 + mi_portable_sizeof_char_ptr :
  46.       extra_length);
  47.   if (extra_field == FIELD_VARCHAR)
  48.     recinfo[0].length+=2;
  49.   recinfo[1].type=key_field;
  50.   recinfo[1].length= (key_field == FIELD_BLOB ? 4+mi_portable_sizeof_char_ptr :
  51.       key_length);
  52.   if (key_field == FIELD_VARCHAR)
  53.     recinfo[1].length+=2;
  54.   /* Define a key over the first column */
  55.   keyinfo[0].seg=keyseg;
  56.   keyinfo[0].keysegs=1;
  57.   keyinfo[0].seg[0].type= key_type;
  58.   keyinfo[0].seg[0].flag= (key_field == FIELD_BLOB)?HA_BLOB_PART:
  59.   (key_field == FIELD_VARCHAR)?HA_VAR_LENGTH:0;
  60.   keyinfo[0].seg[0].start=recinfo[0].length;
  61.   keyinfo[0].seg[0].length=key_length;
  62.   keyinfo[0].seg[0].null_bit= 0;
  63.   keyinfo[0].seg[0].null_pos=0;
  64.   keyinfo[0].seg[0].language=MY_CHARSET_CURRENT;
  65.   keyinfo[0].flag = (no_fulltext?HA_PACK_KEY:HA_FULLTEXT);
  66.   if (!silent)
  67.     printf("- Creating isam-filen");
  68.   if (mi_create(filename,(no_keys?0:1),keyinfo,2,recinfo,0,NULL,
  69. (MI_CREATE_INFO*) 0, create_flag))
  70.     goto err;
  71.   if (!(file=mi_open(filename,2,0)))
  72.     goto err;
  73.   if (!silent)
  74.     printf("- %s stopwordsn",no_stopwords?"Skipping":"Initializing");
  75.   ft_init_stopwords(no_stopwords?NULL:ft_precompiled_stopwords);
  76.   if (!silent)
  77.     printf("- Writing key:sn");
  78.   my_errno=0;
  79.   for (i=NUPD ; i<NDATAS; i++ )
  80.   {
  81.     create_record(record,i);
  82.     error=mi_write(file,record);
  83.     if (verbose || error)
  84.       printf("I= %2d  mi_write: %d  errno: %d, record: %sn",
  85. i,error,my_errno,data[i].f0);
  86.   }
  87.   if (!skip_update)
  88.   {
  89.     if (!silent)
  90.       printf("- Updating rowsn");
  91.     /* Read through all rows and update them */
  92.     pos=(ha_rows) 0;
  93.     i=0;
  94.     while ((error=mi_rrnd(file,read_record,pos)) == 0)
  95.     {
  96.       create_record(record,NUPD-i-1);
  97.       if (mi_update(file,read_record,record))
  98.       {
  99. printf("Can't update row: %.*s, error: %dn",
  100.        keyinfo[0].seg[0].length,record,my_errno);
  101.       }
  102.       if(++i == NUPD) break;
  103.       pos=HA_OFFSET_ERROR;
  104.     }
  105.     if (i != NUPD)
  106.       printf("Found %d of %d rowsn", i,NUPD);
  107.   }
  108.   if (mi_close(file)) goto err;
  109.   if(no_search) return 0;
  110.   if (!silent)
  111.     printf("- Reopening filen");
  112.   if (!(file=mi_open(filename,2,0))) goto err;
  113.   if (!silent)
  114.     printf("- Reading rows with keyn");
  115.   for (i=0 ; i < NQUERIES ; i++)
  116.   { FT_DOCLIST *result;
  117.     result=ft_init_search(file,0,(char*) query[i],strlen(query[i]),1);
  118.     if(!result) {
  119.       printf("Query %d: `%s' failed with errno %3dn",i,query[i],my_errno);
  120.       continue;
  121.     }
  122.     printf("Query %d: `%s'. Found: %d. Top five documents:n",
  123.     i,query[i],result->ndocs);
  124.     for(j=0;j<5;j++) { double w; int err;
  125. err=ft_read_next(result, read_record);
  126. if(err==HA_ERR_END_OF_FILE) {
  127.     printf("No more matches!n");
  128.     break;
  129. } else if (err) {
  130.     printf("ft_read_next %d failed with errno %3dn",j,my_errno);
  131.     break;
  132. }
  133.         w=ft_get_relevance(result);
  134. if(key_field == FIELD_VARCHAR) {
  135.     uint l;
  136.     char *p;
  137.     p=recinfo[0].length+read_record;
  138.     l=uint2korr(p);
  139.     printf("%10.7f: %.*sn",w,(int) l,p+2);
  140. } else
  141.     printf("%10.7f: %.*sn",w,recinfo[1].length,
  142.   recinfo[0].length+read_record);
  143.     }
  144.     ft_close_search(result);
  145.   }
  146.   if (mi_close(file)) goto err;
  147.   my_end(MY_CHECK_ERROR);
  148.   return (0);
  149. err:
  150.   printf("got error: %3d when using myisam-databasen",my_errno);
  151.   return 1; /* skipp warning */
  152. }
  153. static char blob_key[MAX_REC_LENGTH];
  154. /* static char blob_record[MAX_REC_LENGTH+20*20]; */
  155. void create_record(char *pos, int n)
  156. {
  157.   bzero((char*) pos,MAX_REC_LENGTH);
  158.   if (recinfo[0].type == FIELD_BLOB)
  159.   {
  160.     uint tmp;
  161.     char *ptr;
  162.     strncpy(blob_key,data[n].f0,keyinfo[0].seg[0].length);
  163.     tmp=strlen(blob_key);
  164.     int4store(pos,tmp);
  165.     ptr=blob_key;
  166.     memcpy_fixed(pos+4,&ptr,sizeof(char*));
  167.     pos+=recinfo[0].length;
  168.   }
  169.   else if (recinfo[0].type == FIELD_VARCHAR)
  170.   {
  171.     uint tmp;
  172.     strncpy(pos+2,data[n].f0,keyinfo[0].seg[0].length);
  173.     tmp=strlen(pos+2);
  174.     int2store(pos,tmp);
  175.     pos+=recinfo[0].length;
  176.   }
  177.   else
  178.   {
  179.     strncpy(pos,data[n].f0,keyinfo[0].seg[0].length);
  180.     pos+=recinfo[0].length;
  181.   }
  182.   if (recinfo[1].type == FIELD_BLOB)
  183.   {
  184.     uint tmp;
  185.     char *ptr;
  186.     strncpy(blob_key,data[n].f2,keyinfo[0].seg[0].length);
  187.     tmp=strlen(blob_key);
  188.     int4store(pos,tmp);
  189.     ptr=blob_key;
  190.     memcpy_fixed(pos+4,&ptr,sizeof(char*));
  191.     pos+=recinfo[1].length;
  192.   }
  193.   else if (recinfo[1].type == FIELD_VARCHAR)
  194.   {
  195.     uint tmp;
  196.     strncpy(pos+2,data[n].f2,keyinfo[0].seg[0].length);
  197.     tmp=strlen(pos+2);
  198.     int2store(pos,tmp);
  199.     pos+=recinfo[1].length;
  200.   }
  201.   else
  202.   {
  203.     strncpy(pos,data[n].f2,keyinfo[0].seg[0].length);
  204.     pos+=recinfo[1].length;
  205.   }
  206. }
  207. /* Read options */
  208. void get_options(int argc,char *argv[])
  209. {
  210.   int c;
  211.   const char *options="hVvsNSKFU#:";
  212.   while ((c=getopt(argc,argv,options)) != -1)
  213.   {
  214.     switch(c) {
  215.     case 'v': verbose=1; break;
  216.     case 's': silent=1; break;
  217.     case 'F': no_fulltext=1; no_search=1;
  218.     case 'U': skip_update=1; break;
  219.     case 'K': no_keys=no_search=1; break;
  220.     case 'N': no_search=1; break;
  221.     case 'S': no_stopwords=1; break;
  222.     case '#':
  223.       DEBUGGER_ON;
  224.       DBUG_PUSH (optarg);
  225.       break;
  226.     case 'V':
  227.     case '?':
  228.     case 'h':
  229.     default:
  230.       printf("%s -[%s]n", argv[0], options);
  231.       exit(0);
  232.     }
  233.   }
  234.   return;
  235. } /* get options */