home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 January / Chip_2001-01_cd1.bin / tema / mysql / mysql-3.23.28g-win-source.exe / myisam / ft_test1.c < prev    next >
C/C++ Source or Header  |  2000-08-31  |  7KB  |  267 lines

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