blob: cd4a4ffa74f082b1d1f59d71d45cbab7075d0ecd [file] [log] [blame]
/* AUTORIGHTS
Copyright (C) 2007 Princeton University
This file is part of Ferret Toolkit.
Ferret Toolkit is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include <cass.h>
#define BUFSIZE 0x4000
int main (int argc, char *argv[])
{
char buf[BUFSIZE];
char *index_name;
char *index_cfg_name;
cass_env_t *env;
int32_t table_id, index_id;
int32_t opr_id, cfg_id;
cass_vecset_cfg_t *cfg;
cass_table_t *table;
cass_table_t *index;
cass_dataset_t *ds;
cass_table_opr_t *opr;
FILE *fin;
int ret;
if (argc < 5)
{
printf("Add an index.\n"
"usage:\n\t%s <path> <table> <index> <params> [name]\n"
, argv[0]);
return 0;
}
cass_init();
ret = cass_env_open(&env, argv[1], 0);
if (ret != 0) { printf("ERROR: %s\n", cass_strerror(ret)); return 0; }
if (argc > 5)
{
sprintf(buf, "%s", argv[5]);
index_name = strdup(buf);
sprintf(buf, "%s@cfg", argv[5]);
index_cfg_name = strdup(buf);
}
else
{
sprintf(buf, "%s@%s", argv[2], argv[3]);
index_name = strdup(buf);
sprintf(buf, "%s@%s@cfg", argv[2], argv[3]);
index_cfg_name = strdup(buf);
}
if (cass_reg_lookup(&env->table, index_name) >= 0) fatal("Sketch already exists.\n");
if (cass_reg_lookup(&env->cfg, index_cfg_name) >= 0) fatal("Sketch cfg already exists.\n");
table_id = cass_reg_lookup(&env->table, argv[2]);
if (table_id < 0) fatal("Table does not exist.\n");
table = cass_reg_get(&env->table, table_id);
assert(table->opr->type & CASS_DATA);
opr_id = cass_table_opr_lookup(argv[3]);
assert(opr_id >= 0);
opr = cass_table_opr_get(opr_id);
if (opr->cfg != NULL)
{
cfg = opr->cfg(argv[4]);
assert(cfg != NULL);
cfg->name = index_cfg_name;
/*
cfg->vecset_dist_id = -1;
cfg->vec_dist_id = cass_reg_lookup(&env->vec_dist, "hamming");
assert(cfg->vec_dist_id >= 0);
*/
cass_reg_add(&env->cfg, cfg->name, cfg);
cfg_id = cass_reg_lookup(&env->cfg, cfg->name);
assert(cfg_id >= 0);
}
else
{
cfg_id = CASS_ID_INV;
}
ret = cass_table_create(&index, env, index_name, opr_id, cfg_id, table_id, table->cfg_id, table->map_id, argv[4]);
if (ret != 0) fatal("Fail to create index: %s.\n", cass_strerror(ret));
cass_reg_add(&env->table, index->name, index);
index_id = cass_reg_lookup(&env->table, index->name);
assert(index_id >= 0);
cass_table_associate(table, index_id);
ds = &((struct raw_private *)table->__private)->dataset;
if (ds->num_vecset > 0)
{
cass_table_load(table);
cass_table_load(index);
cass_table_batch_insert(index, ds, 0, ds->num_vecset - 1);
}
ret = cass_env_checkpoint(env);
if (ret != 0) { printf("ERROR: %s\n", cass_strerror(ret)); return 0; }
ret = cass_env_close(env, 0);
if (ret != 0) { printf("ERROR: %s\n", cass_strerror(ret)); return 0; }
cass_cleanup();
return 0;
}