Commit 348cff41 authored by mskold@mysql.com's avatar mskold@mysql.com

Cleaned up build of index list

parent 47214454
...@@ -542,25 +542,30 @@ int ha_ndbcluster::get_metadata(const char *path) ...@@ -542,25 +542,30 @@ int ha_ndbcluster::get_metadata(const char *path)
// All checks OK, lets use the table // All checks OK, lets use the table
m_table= (void*)tab; m_table= (void*)tab;
DBUG_RETURN(build_index_list()); DBUG_RETURN(build_index_list(table, ILBP_OPEN));
} }
int ha_ndbcluster::build_index_list0()
int ha_ndbcluster::build_index_list(TABLE *tab, enum IBLP phase)
{ {
int error= 0;
char *name; char *name;
const char *index_name; const char *index_name;
static const char* unique_suffix= "$unique"; static const char* unique_suffix= "$unique";
uint i, name_len; uint i, name_len;
DBUG_ENTER("build_index_list0"); KEY* key_info= tab->key_info;
const char **key_name= tab->keynames.type_names;
NdbDictionary::Dictionary *dict= m_ndb->getDictionary();
DBUG_ENTER("build_index_list");
// Save information about all known indexes // Save information about all known indexes
for (i= 0; i < table->keys; i++) for (i= 0; i < tab->keys; i++, key_info++, key_name++)
{ {
index_name= *key_name;
NDB_INDEX_TYPE idx_type= get_index_type_from_table(i); NDB_INDEX_TYPE idx_type= get_index_type_from_table(i);
m_index[i].type= idx_type; m_index[i].type= idx_type;
if (idx_type == UNIQUE_ORDERED_INDEX || idx_type == UNIQUE_INDEX) if (idx_type == UNIQUE_ORDERED_INDEX || idx_type == UNIQUE_INDEX)
{ {
index_name= get_index_name(i);
name_len= strlen(index_name)+strlen(unique_suffix)+1; name_len= strlen(index_name)+strlen(unique_suffix)+1;
// Create name for unique index by appending "$unique"; // Create name for unique index by appending "$unique";
if (!(name= my_malloc(name_len, MYF(MY_WME)))) if (!(name= my_malloc(name_len, MYF(MY_WME))))
...@@ -570,23 +575,46 @@ int ha_ndbcluster::build_index_list0() ...@@ -570,23 +575,46 @@ int ha_ndbcluster::build_index_list0()
DBUG_PRINT("info", ("Created unique index name: %s for index %d", DBUG_PRINT("info", ("Created unique index name: %s for index %d",
name, i)); name, i));
} }
} // Create secondary indexes if in create phase
DBUG_RETURN(0); if (phase == ILBP_CREATE)
} {
DBUG_PRINT("info", ("Creating index %u: %s", i, index_name));
int ha_ndbcluster::build_index_list1() switch (m_index[i].type){
{
uint i; case PRIMARY_KEY_INDEX:
NdbDictionary::Dictionary *dict= m_ndb->getDictionary(); // Do nothing, already created
DBUG_ENTER("build_index_object_list1"); break;
// Add direct references to index objects case PRIMARY_KEY_ORDERED_INDEX:
for (i= 0; i < table->keys; i++) error= create_ordered_index(index_name, key_info);
break;
case UNIQUE_ORDERED_INDEX:
if (!(error= create_ordered_index(index_name, key_info)))
error= create_unique_index(get_unique_index_name(i), key_info);
break;
case UNIQUE_INDEX:
error= create_unique_index(get_unique_index_name(i), key_info);
break;
case ORDERED_INDEX:
error= create_ordered_index(index_name, key_info);
break;
default:
DBUG_ASSERT(false);
break;
}
if (error)
{ {
DBUG_PRINT("info", ("Trying to add handle to index %s", get_index_name(i))); DBUG_PRINT("error", ("Failed to create index %u", i));
drop_table();
break;
}
}
// Add handles to index objects
DBUG_PRINT("info", ("Trying to add handle to index %s", index_name));
if ((m_index[i].type != PRIMARY_KEY_INDEX) && if ((m_index[i].type != PRIMARY_KEY_INDEX) &&
(m_index[i].type != UNIQUE_INDEX)) (m_index[i].type != UNIQUE_INDEX))
{ {
const NDBINDEX *index= dict->getIndex(get_index_name(i), m_tabname); const NDBINDEX *index= dict->getIndex(index_name, m_tabname);
if (!index) DBUG_RETURN(1); if (!index) DBUG_RETURN(1);
m_index[i].index= (void *) index; m_index[i].index= (void *) index;
} }
...@@ -596,23 +624,13 @@ int ha_ndbcluster::build_index_list1() ...@@ -596,23 +624,13 @@ int ha_ndbcluster::build_index_list1()
if (!index) DBUG_RETURN(1); if (!index) DBUG_RETURN(1);
m_index[i].unique_index= (void *) index; m_index[i].unique_index= (void *) index;
} }
DBUG_PRINT("info", ("Added handle to index %s", get_index_name(i))); DBUG_PRINT("info", ("Added handle to index %s", index_name));
} }
DBUG_RETURN(0);
}
int ha_ndbcluster::build_index_list()
{
int res;
DBUG_ENTER("build_index_list");
if ((res= build_index_list0()))
DBUG_RETURN(res);
if ((res= build_index_list1()))
DBUG_RETURN(res);
DBUG_RETURN(0); DBUG_RETURN(error);
} }
/* /*
Decode the type of an index from information Decode the type of an index from information
provided in table object provided in table object
...@@ -2883,52 +2901,8 @@ int ha_ndbcluster::create(const char *name, ...@@ -2883,52 +2901,8 @@ int ha_ndbcluster::create(const char *name,
DBUG_PRINT("info", ("Table %s/%s created successfully", DBUG_PRINT("info", ("Table %s/%s created successfully",
m_dbname, m_tabname)); m_dbname, m_tabname));
if ((my_errno= build_index_list0()))
DBUG_RETURN(my_errno);
// Create secondary indexes // Create secondary indexes
KEY* key_info= form->key_info; my_errno= build_index_list(form, ILBP_CREATE);
const char** key_name= key_names;
for (i= 0; i < form->keys; i++, key_info++, key_name++)
{
int error= 0;
DBUG_PRINT("info", ("Index %u: %s", i, *key_name));
switch (get_index_type_from_table(i)){
case PRIMARY_KEY_INDEX:
// Do nothing, already created
break;
case PRIMARY_KEY_ORDERED_INDEX:
error= create_ordered_index(*key_name, key_info);
break;
case UNIQUE_ORDERED_INDEX:
if (!(error= create_ordered_index(*key_name, key_info)))
error= create_unique_index(get_unique_index_name(i), key_info);
break;
case UNIQUE_INDEX:
error= create_unique_index(get_unique_index_name(i), key_info);
break;
case ORDERED_INDEX:
error= create_ordered_index(*key_name, key_info);
break;
default:
DBUG_ASSERT(false);
break;
}
if (error)
{
DBUG_PRINT("error", ("Failed to create index %u", i));
drop_table();
my_errno= error;
break;
}
}
if (!(my_errno) && (my_errno= build_index_list1()))
DBUG_RETURN(my_errno);
DBUG_RETURN(my_errno); DBUG_RETURN(my_errno);
} }
......
...@@ -155,10 +155,9 @@ class ha_ndbcluster: public handler ...@@ -155,10 +155,9 @@ class ha_ndbcluster: public handler
int create_index(const char *name, KEY *key_info, bool unique); int create_index(const char *name, KEY *key_info, bool unique);
int create_ordered_index(const char *name, KEY *key_info); int create_ordered_index(const char *name, KEY *key_info);
int create_unique_index(const char *name, KEY *key_info); int create_unique_index(const char *name, KEY *key_info);
int initialize_autoincrement(const void* table); int initialize_autoincrement(const void *table);
int build_index_list0(); enum IBLP {ILBP_CREATE = 0, ILBP_OPEN = 1}; // index_list_build_phase
int build_index_list1(); int build_index_list(TABLE *tab, enum IBLP phase);
int build_index_list();
int get_metadata(const char* path); int get_metadata(const char* path);
void release_metadata(); void release_metadata();
const char* get_index_name(uint idx_no) const; const char* get_index_name(uint idx_no) const;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment