use of herddb.model.Index in project herddb by diennea.
the class TableSpaceRestoreSourceFromFile method nextTable.
@Override
public DumpedTableMetadata nextTable() throws DataStorageManagerException {
currentTableSize = 0;
try {
long dumpLedgerId = in.readLong();
long dumpOffset = in.readLong();
byte[] table = in.readArray();
int numIndexes = in.readInt();
List<byte[]> indexesData = new ArrayList<>();
for (int i = 0; i < numIndexes; i++) {
byte[] index = in.readArray();
indexesData.add(index);
}
List<Index> indexes = indexesData.stream().map(Index::deserialize).collect(Collectors.toList());
Table tableMetadata = Table.deserialize(table);
Map<String, Object> data = new HashMap<>();
data.put("table", tableMetadata.name);
data.put("dumpLedgerId", dumpLedgerId);
data.put("dumpOffset", dumpOffset);
data.put("indexes", indexesData.size());
listener.log("starttable", "starting table " + tableMetadata.name, data);
return new DumpedTableMetadata(tableMetadata, new LogSequenceNumber(dumpLedgerId, dumpOffset), indexes);
} catch (EOFException end) {
return null;
} catch (IOException err) {
throw new DataStorageManagerException(err);
}
}
use of herddb.model.Index in project herddb by diennea.
the class RoutedClientSideConnection method restoreTableSpace.
@Override
public void restoreTableSpace(String tableSpace, TableSpaceRestoreSource source) throws HDBException, ClientSideMetadataProviderException {
List<DumpedTableMetadata> tables = new ArrayList<>();
try {
while (true) {
String entryType = source.nextEntryType();
LOGGER.log(Level.FINEST, "restore, entryType:{0}", entryType);
switch(entryType) {
case BackupFileConstants.ENTRY_TYPE_START:
{
break;
}
case BackupFileConstants.ENTRY_TYPE_TABLE:
{
DumpedTableMetadata table = source.nextTable();
Channel channel = ensureOpen();
long id = channel.generateRequestId();
ByteBuf message_create_table = PduCodec.RequestTableRestore.write(id, tableSpace, table.table.serialize(), table.logSequenceNumber.ledgerId, table.logSequenceNumber.offset);
sendMessageAndCheckNoError(channel, id, message_create_table);
List<KeyValue> chunk = source.nextTableDataChunk();
while (chunk != null) {
id = channel.generateRequestId();
ByteBuf message = PduCodec.PushTableData.write(id, tableSpace, table.table.name, chunk);
sendMessageAndCheckNoError(channel, id, message);
chunk = source.nextTableDataChunk();
}
tables.add(table);
break;
}
case BackupFileConstants.ENTRY_TYPE_TXLOGCHUNK:
{
Channel channel = ensureOpen();
List<KeyValue> chunk = source.nextTransactionLogChunk();
long id = channel.generateRequestId();
ByteBuf message = PduCodec.PushTxLogChunk.write(id, tableSpace, chunk);
sendMessageAndCheckNoError(channel, id, message);
break;
}
case BackupFileConstants.ENTRY_TYPE_TRANSACTIONS:
{
Channel channel = ensureOpen();
List<byte[]> chunk = source.nextTransactionsBlock();
long id = channel.generateRequestId();
ByteBuf message = PduCodec.PushTransactionsBlock.write(id, tableSpace, chunk);
sendMessageAndCheckNoError(channel, id, message);
break;
}
case BackupFileConstants.ENTRY_TYPE_END:
{
// send a 'table finished' event only at the end of the procedure
// the stream of transaction log entries is finished, so the data contained in the table is "final"
// we are going to create now all the indexes too
Channel channel = ensureOpen();
for (DumpedTableMetadata table : tables) {
List<byte[]> indexes = table.indexes.stream().map(Index::serialize).collect(Collectors.toList());
long id = channel.generateRequestId();
ByteBuf message_table_finished = PduCodec.TableRestoreFinished.write(id, tableSpace, table.table.name, indexes);
sendMessageAndCheckNoError(channel, id, message_table_finished);
}
long id = channel.generateRequestId();
ByteBuf message_restore_finished = PduCodec.RestoreFinished.write(id, tableSpace);
sendMessageAndCheckNoError(channel, id, message_restore_finished);
return;
}
default:
throw new HDBException("bad entryType " + entryType);
}
}
} catch (InterruptedException err) {
Thread.currentThread().interrupt();
throw new HDBException(err);
} catch (TimeoutException err) {
throw new HDBException(err);
}
}
use of herddb.model.Index in project herddb by diennea.
the class TableSpaceDumpFileWriter method beginTable.
@Override
public void beginTable(DumpedTableMetadata tableMetadata, Map<String, Object> stats) throws DataStorageManagerException {
Table table = tableMetadata.table;
currentTable = table.name;
listener.log("beginTable", "beginTable " + currentTable + ", stats " + stats, Collections.singletonMap("table", table.name));
try {
out.writeUTF(BackupFileConstants.ENTRY_TYPE_TABLE);
} catch (IOException err) {
throw new DataStorageManagerException(err);
}
tableRecordsCount = 0;
try {
out.writeLong(tableMetadata.logSequenceNumber.ledgerId);
out.writeLong(tableMetadata.logSequenceNumber.offset);
out.writeArray(table.serialize());
out.writeInt(tableMetadata.indexes.size());
for (Index index : tableMetadata.indexes) {
out.writeArray(index.serialize());
}
} catch (IOException err) {
throw new DataStorageManagerException(err);
}
}
use of herddb.model.Index in project herddb by diennea.
the class RawSQLTest method createDropIndexTest.
@Test
public void createDropIndexTest() throws Exception {
String nodeId = "localhost";
try (DBManager manager = new DBManager("localhost", new MemoryMetadataStorageManager(), new MemoryDataStorageManager(), new MemoryCommitLogManager(), null, null)) {
manager.start();
CreateTableSpaceStatement st1 = new CreateTableSpaceStatement("tblspace1", Collections.singleton(nodeId), nodeId, 1, 0, 0);
manager.executeStatement(st1, StatementEvaluationContext.DEFAULT_EVALUATION_CONTEXT(), TransactionContext.NO_TRANSACTION);
manager.waitForTablespace("tblspace1", 10000);
execute(manager, "CREATE TABLE tblspace1.tsql (k1 string primary key,n1 int,s1 string)", Collections.emptyList());
execute(manager, "CREATE INDEX ix1 ON tblspace1.tsql(n1)", Collections.emptyList());
try {
execute(manager, "CREATE INDEX ix1 ON tblspace1.tsql(n1)", Collections.emptyList());
fail();
} catch (IndexAlreadyExistsException ok) {
}
execute(manager, "DROP INDEX tblspace1.ix1", Collections.emptyList());
execute(manager, "CREATE INDEX ix1 ON tblspace1.tsql(n1)", Collections.emptyList());
execute(manager, "CREATE HASH INDEX ix_hash ON tblspace1.tsql(n1)", Collections.emptyList());
try {
execute(manager, "CREATE BADTYPE INDEX ix_bad ON tblspace1.tsql(n1)", Collections.emptyList());
fail();
} catch (StatementExecutionException ok) {
assertTrue(ok.getMessage().contains("badtype"));
}
try {
execute(manager, "DROP INDEX tblspace1.ix2", Collections.emptyList());
fail();
} catch (IndexDoesNotExistException ok) {
}
try {
execute(manager, "DROP INDEX ix1", Collections.emptyList());
fail();
} catch (IndexDoesNotExistException ok) {
}
try {
execute(manager, "CREATE INDEX ix2 ON tsql(n1)", Collections.emptyList());
fail();
} catch (TableDoesNotExistException ok) {
}
try {
execute(manager, "CREATE INDEX duplicatecolumn ON tblspace1.tsql(n1,n1)", Collections.emptyList());
fail();
} catch (StatementExecutionException ok) {
}
execute(manager, "CREATE UNIQUE INDEX ixu1 ON tblspace1.tsql(n1)", Collections.emptyList());
Map<String, AbstractIndexManager> indexesOnTable = manager.getTableSpaceManager("tblspace1").getIndexesOnTable("tsql");
assertTrue(indexesOnTable.values().stream().anyMatch(s -> s.getIndexName().equals("ixu1") && s.isUnique()));
}
}
use of herddb.model.Index in project herddb by diennea.
the class RawSQLTest method openJPATest.
@Test
public void openJPATest() throws Exception {
String nodeId = "localhost";
try (DBManager manager = new DBManager("localhost", new MemoryMetadataStorageManager(), new MemoryDataStorageManager(), new MemoryCommitLogManager(), null, null)) {
manager.start();
assertTrue(manager.waitForBootOfLocalTablespaces(10000));
execute(manager, "CREATE TABLE `herd`.`parentTable` (`k1` VARCHAR NOT NULL, `p1` INTEGER)", Collections.emptyList());
execute(manager, "CREATE TABLE `herd`.`childTable` (`k1` VARCHAR NOT NULL, `n1` INTEGER, PRIMARY KEY (`k1`), CONSTRAINT `un1` UNIQUE (`n1`))", Collections.emptyList());
execute(manager, "ALTER TABLE `herd`.`childTable` ADD CONSTRAINT `fk1` FOREIGN KEY (`n1`) REFERENCES `herd`.`parentTable` (`p1`) ON DELETE CASCADE", Collections.emptyList());
execute(manager, "ALTER TABLE `herd`.`childTable` DROP CONSTRAINT `fk1`", Collections.emptyList());
List<Index> availableIndexes = manager.getTableSpaceManager("herd").getTableManager("childtable").getAvailableIndexes();
assertEquals(1, availableIndexes.size());
assertEquals("un1", availableIndexes.get(0).name);
assertTrue(availableIndexes.get(0).unique);
}
}
Aggregations