/*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
*
* This program 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; version 2 of the License.
*
* 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 St, Fifth Floor, Boston, MA 02110-1301 USA
*/
package com.mysql.clusterj.tie;
import com.mysql.ndbjtie.ndbapi.NdbDictionary.DictionaryConst;
import com.mysql.ndbjtie.ndbapi.NdbDictionary.IndexConst;
import com.mysql.ndbjtie.ndbapi.NdbDictionary.TableConst;
import com.mysql.ndbjtie.ndbapi.NdbDictionary.DictionaryConst.ListConst.Element;
import com.mysql.ndbjtie.ndbapi.NdbDictionary.DictionaryConst.ListConst.ElementArray;
import com.mysql.clusterj.core.store.Index;
import com.mysql.clusterj.core.store.Table;
import com.mysql.clusterj.core.util.I18NHelper;
import com.mysql.clusterj.core.util.Logger;
import com.mysql.clusterj.core.util.LoggerFactoryService;
/**
*
*/
class DictionaryImpl implements com.mysql.clusterj.core.store.Dictionary {
/** My message translator */
static final I18NHelper local = I18NHelper
.getInstance(DictionaryImpl.class);
/** My logger */
static final Logger logger = LoggerFactoryService.getFactory()
.getInstance(DictionaryImpl.class);
private DictionaryConst ndbDictionary;
public DictionaryImpl(DictionaryConst ndbDictionary) {
this.ndbDictionary = ndbDictionary;
}
public Table getTable(String tableName) {
TableConst ndbTable = ndbDictionary.getTable(tableName);
if (ndbTable == null) {
// try the lower case table name
ndbTable = ndbDictionary.getTable(tableName.toLowerCase());
}
if (ndbTable == null) {
return null;
}
return new TableImpl(ndbTable, getIndexNames(ndbTable.getName()));
}
public Index getIndex(String indexName, String tableName, String indexAlias) {
if ("PRIMARY$KEY".equals(indexName)) {
// create a pseudo index for the primary key hash
TableConst ndbTable = ndbDictionary.getTable(tableName);
if (ndbTable == null) {
// try the lower case table name
ndbTable = ndbDictionary.getTable(tableName.toLowerCase());
}
handleError(ndbTable, ndbDictionary, "");
return new IndexImpl(ndbTable);
}
IndexConst ndbIndex = ndbDictionary.getIndex(indexName, tableName);
if (ndbIndex == null) {
// try the lower case table name
ndbIndex = ndbDictionary.getIndex(indexName, tableName.toLowerCase());
}
handleError(ndbIndex, ndbDictionary, indexAlias);
return new IndexImpl(ndbIndex, indexAlias);
}
public String[] getIndexNames(String tableName) {
// get all indexes for this table including ordered PRIMARY
com.mysql.ndbjtie.ndbapi.NdbDictionary.DictionaryConst.List indexList =
com.mysql.ndbjtie.ndbapi.NdbDictionary.DictionaryConst.List.create();
final String[] result;
try {
int returnCode = ndbDictionary.listIndexes(indexList, tableName);
handleError(returnCode, ndbDictionary, tableName);
int count = indexList.count();
result = new String[count];
if (logger.isDetailEnabled()) logger.detail("Found " + count + " indexes for " + tableName);
ElementArray elementArray = indexList.elements();
for (int i = 0; i < count; ++i) {
Element element = elementArray.at(i);
handleError(element, ndbDictionary, String.valueOf(i));
String indexName = element.name();
result[i] = indexName;
}
} finally {
// free the list memory even if error
com.mysql.ndbjtie.ndbapi.NdbDictionary.DictionaryConst.List.delete(indexList);
}
return result;
}
protected static void handleError(int returnCode, DictionaryConst ndbDictionary, String extra) {
if (returnCode == 0) {
return;
} else {
Utility.throwError(returnCode, ndbDictionary.getNdbError(), extra);
}
}
protected static void handleError(Object object, DictionaryConst ndbDictionary, String extra) {
if (object != null) {
return;
} else {
Utility.throwError(null, ndbDictionary.getNdbError(), extra);
}
}
}