nl.topicus.jdbc.MetaDataStore Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of spanner-jdbc Show documentation
Show all versions of spanner-jdbc Show documentation
JDBC Driver for Google Cloud Spanner
package nl.topicus.jdbc;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
* Class for storing meta data needed for translating SQL statements into Cloud
* Spanner mutations, such as key columns and their ordinal positions
*
* @author loite
*
*/
public class MetaDataStore
{
/**
* Class for storing the primary key columns of a table in the correct
* order.
*
* @author loite
*
*/
public class TableKeyMetaData
{
private final String name;
private final List keyColumns = new ArrayList<>(2);
TableKeyMetaData(String name)
{
this.name = name;
}
public List getKeyColumns()
{
return keyColumns;
}
@Override
public boolean equals(Object o)
{
if (!(o instanceof TableKeyMetaData))
return false;
TableKeyMetaData other = (TableKeyMetaData) o;
return Objects.equals(this.name, other.name);
}
@Override
public int hashCode()
{
return name.hashCode();
}
}
private final Connection connection;
private final Map tables = new HashMap<>();
MetaDataStore(Connection connection)
{
this.connection = connection;
}
public TableKeyMetaData getTable(String name) throws SQLException
{
if (name == null)
return null;
TableKeyMetaData res = tables.get(name.toUpperCase());
if (res == null)
{
res = initTable(name);
tables.put(name.toUpperCase(), res);
}
return res;
}
private TableKeyMetaData initTable(String name) throws SQLException
{
TableKeyMetaData table = new TableKeyMetaData(name);
try (ResultSet rs = connection.getMetaData().getPrimaryKeys(null, null, name))
{
while (rs.next())
{
table.keyColumns.add(rs.getString("COLUMN_NAME").toUpperCase());
}
}
return table;
}
void clear()
{
tables.clear();
}
void clearTable(String name)
{
if (name == null)
return;
tables.remove(name.toUpperCase());
}
}