
/*
 * 	myisam_suggest version 0.1 (17 Jan 2009)
 *
 * 	Adapted from myisam_ftdump.c (by Sergei A. Golubchik) from the original MySQL source
 *
 * 	Copyright (C) Richard Hirner 2009 (<richard@hirner.at>)
 * 	Published unter GPL v2, see MySQL source for license details
 *
 * 	1. Compile like myisam_ftdump
 * 	2. Copy to /opt/myisam-fti-autosuggest
 * 	3. Make sure that myisam_suggest can read the MyISAM files when called from Web context,
 * 	   for instance do:   chown mysql myisam_suggest; chmod u+s myisam_suggest
 * 	4. Let autosuggest.php call myisam_suggest
 *
*/

#include "fulltext.h"
#include <string.h>

#define MAX_KEYS 1000


int main(int argc,char *argv[])
{
	int error = 0, i, r;
	uint keylen, inx, found_keys = 0;
	MI_INFO *info;
	MI_KEYDEF *keyinfo;
	my_off_t key_root;
	char *query_buf, *s;

	if (argc != 4) {
		printf("Usage: %s <path to table> <idx number> <prefix to search for>\n", argv[0]);
		return;
	}

	MY_INIT(argv[0]);
	inx = atoi(argv[2]);

	init_key_cache(dflt_key_cache,MI_KEY_BLOCK_LENGTH,USE_BUFFER_INIT, 0, 0);

	if (!(info=mi_open(argv[1], O_RDONLY, HA_OPEN_ABORT_IF_LOCKED)))
	{
		error = my_errno;
		goto err;
	}

	if ((inx >= info->s->base.keys) || !(info->s->keyinfo[inx].flag & HA_FULLTEXT))
	{
		fprintf(stderr, "Key %d in table %s is not a valid FULLTEXT key\n", inx, info->filename);
		goto err;
	}

	mi_lock_database(info, F_RDLCK);	// F_EXTRA_LCK required?

	info->lastpos = HA_OFFSET_ERROR;
	info->update |= HA_STATE_PREV_FOUND;

 	keyinfo = info->s->keyinfo+inx;
	key_root = info->s->state.key_root[inx];

	i = strlen(argv[3]);
	query_buf = malloc(i+1);
	query_buf[0] = i;
	memcpy(query_buf+1, argv[3], i);

	r = _mi_search(info, keyinfo, query_buf, query_buf[0]+1, SEARCH_FIND | SEARCH_BIGGER, key_root);
	while (!r) {
		keylen = *(info->lastkey);

		if (keylen < query_buf[0]) break;
		s = malloc(query_buf[0]+1);
		memcpy(s, info->lastkey+1, query_buf[0]);
		s[query_buf[0]] = 0;

		if (strcasecmp(query_buf+1, s) != 0) break;

		printf("%.*s\n", keylen, info->lastkey+1);
		if (found_keys++ == MAX_KEYS) break;

		r = _mi_search_next(info, keyinfo, info->lastkey, info->lastkey_length, SEARCH_BIGGER, key_root);
	}
  
	mi_lock_database(info, F_UNLCK);

  err:
	if (error && error != HA_ERR_END_OF_FILE)
		fprintf(stderr, "Got error %d\n", my_errno);
	if (info)
		mi_close(info);
	return 0;
}

