@Override public void add(Session session, Row row) { if (mainIndexColumn == -1) { if (row.getKey() == 0) { row.setKey(lastKey.incrementAndGet()); long c = row.getValue(mainIndexColumn).getLong(); row.setKey(c); for (int i = 0, len = row.getColumnCount(); i < len; i++) { Value v = row.getValue(i); Value v2 = v.copy(database, getId()); if (v2.isLinkedToTable()) { row.setValue(i, v2); Value key = ValueLong.get(row.getKey()); Value old = map.getLatest(key); if (old != null) { map.put(key, ValueArray.get(row.getValueList())); } catch (IllegalStateException e) { throw mvTable.convertException(e); if (row.getKey() > lastKey.get()) { lastKey.set(row.getKey());
private void writeRow(Data buff, Row r) { buff.checkCapacity(1 + Data.LENGTH_INT * 8); buff.writeByte((byte) 1); buff.writeInt(r.getMemory()); int columnCount = r.getColumnCount(); buff.writeInt(columnCount); buff.writeLong(r.getKey()); buff.writeInt(r.getVersion()); buff.writeInt(r.isDeleted() ? 1 : 0); buff.writeInt(r.getSessionId()); for (int i = 0; i < columnCount; i++) { Value v = r.getValue(i); buff.checkCapacity(1); if (v == null) {
/** * Get the next row that is stored after this row. * * @param row the current row or null to start the scan * @return the next row or null if there are no more rows */ Row getNextRow(Row row) { long key; if (row == null) { key = -1; } else { key = row.getKey(); } while (true) { key++; if (key >= rows.size()) { return null; } row = rows.get((int) key); if (!row.isEmpty()) { return row; } } }
private static Object[] convertToObjectList(Row row) { if (row == null) { return null; } int len = row.getColumnCount(); Object[] list = new Object[len]; for (int i = 0; i < len; i++) { list[i] = row.getValue(i).getObject(); } return list; }
/** * Convert the values if required. Default values are not set (kept as * null). * * @param session the session * @param row the row */ @Override public void validateConvertUpdateSequence(Session session, Row row) { for (int i = 0; i < columns.length; i++) { Value value = row.getValue(i); if (value != null) { // null means use the default value Column column = columns[i]; Value v2 = column.validateConvertUpdateSequence(session, value); if (v2 != value) { row.setValue(i, v2); } } } }
@Override public void add(Session session, Row row) { // in-memory if (firstFree == -1) { int key = rows.size(); row.setKey(key); rows.add(row); } else { long key = firstFree; Row free = rows.get((int) key); firstFree = free.getKey(); row.setKey(key); rows.set((int) key, row); } row.setDeleted(false); if (database.isMultiVersion()) { if (delta == null) { delta = new HashSet<>(); } boolean wasDeleted = delta.remove(row); if (!wasDeleted) { delta.add(row); } incrementRowCount(session.getId(), 1); } rowCount++; }
row.setKey(key); row.setVersion(version); row.setDeleted(deleted); row.setSessionId(sessionId); return row;
/** * Append the row to the buffer. * * @param buff the buffer * @param log the undo log */ void append(Data buff, UndoLog log) { int p = buff.length(); buff.writeInt(0); buff.writeInt(operation); buff.writeByte(row.isDeleted() ? (byte) 1 : (byte) 0); buff.writeInt(log.getTableId(table)); buff.writeLong(row.getKey()); buff.writeInt(row.getSessionId()); int count = row.getColumnCount(); buff.writeInt(count); for (int i = 0; i < count; i++) { Value v = row.getValue(i); buff.checkCapacity(buff.getValueLen(v)); buff.writeValue(v); } buff.fillAligned(); buff.setInt(p, (buff.length() - p) / Constants.FILE_BLOCK_SIZE); }
private void load(Data buff, UndoLog log) { operation = (short) buff.readInt(); boolean deleted = buff.readByte() == 1; table = log.getTable(buff.readInt()); long key = buff.readLong(); int sessionId = buff.readInt(); int columnCount = buff.readInt(); Value[] values = new Value[columnCount]; for (int i = 0; i < columnCount; i++) { values[i] = buff.readValue(); } row = getTable().getDatabase().createRow(values, Row.MEMORY_CALCULATE); row.setKey(key); row.setDeleted(deleted); row.setSessionId(sessionId); state = IN_MEMORY_INVALID; }
private void writeRow(DataPage buff, Row r) throws SQLException { buff.checkCapacity(1 + buff.getIntLen() * 7); buff.writeByte((byte) 1); buff.writeInt(r.getMemorySize()); buff.writeInt(r.getColumnCount()); buff.writeInt(r.getPos()); buff.writeInt(r.getVersion()); buff.writeInt(r.getDeleted() ? 1 : 0); buff.writeInt(r.getSessionId()); buff.writeInt(r.getStorageId()); for (int i = 0; i < r.getColumnCount(); i++) { Value v = r.getValue(i); if (v.getType() == Value.CLOB || v.getType() == Value.BLOB) { // need to keep a reference to temporary lobs, // otherwise the temp file is deleted ValueLob lob = (ValueLob) v; if (lob.getSmall() == null && lob.getTableId() == 0) { if (lobs == null) { lobs = new ObjectArray(); } lobs.add(lob); } } buff.checkCapacity(buff.getValueLen(v)); buff.writeValue(v); } }
@Override public void remove(Session session, Row row) { if (tableData.getContainsLargeObject()) { for (int i = 0, len = row.getColumnCount(); i < len; i++) { Value v = row.getValue(i); if (v.isLinkedToTable()) { session.removeAtCommitStop(v); } else { try { long key = row.getKey(); PageData root = getPage(rootPageId, 0); root.remove(key); row.setDeleted(true); if (delta == null) { delta = new HashSet<>();
row.setValue(0, ValueInt.get(index.getId())); row.setValue(1, ValueInt.get(type)); row.setValue(2, ValueInt.get(table.getId())); row.setValue(3, ValueInt.get(index.getRootPageId())); row.setValue(4, ValueString.get(options)); row.setValue(5, ValueString.get(columnList)); row.setKey(index.getId() + 1); metaIndex.add(session, row);
private boolean removeIfExists(Session session, Row row) { // maybe it was inserted by the same session just before Cursor c = delta.find(session, row, row); while (c.next()) { Row r = c.get(); if (r.getKey() == row.getKey() && r.getVersion() == row.getVersion()) { if (r != row && table.getScanIndex(session).compareRows(r, row) != 0) { row.setVersion(r.getVersion() + 1); } else { delta.remove(session, r); return true; } } } return false; }
@Override public void removeRow(Session session, Row row) { if (database.isMultiVersion()) { if (row.isDeleted()) { throw DbException.get(ErrorCode.CONCURRENT_UPDATE_1, getName()); int old = row.getSessionId(); int newId = session.getId(); if (old == 0) { row.setSessionId(newId); } else if (old != newId) { throw DbException.get(ErrorCode.CONCURRENT_UPDATE_1, getName());
if (row.isDeleted()) { row.setDeleted(false); table.removeRow(session, row); table.fireAfterRow(session, row, null, true); row.commit(); } catch (DbException e) { if (session.getDatabase().getLockMode() == Constants.LOCK_MODE_OFF
Data data = dataBuffer; data.reset(); int columns = row.getColumnCount(); data.writeVarInt(columns); data.checkCapacity(row.getByteCount(data)); if (session.isRedoLogBinaryEnabled()) { for (int i = 0; i < columns; i++) { data.writeValue(row.getValue(i)); Value v = row.getValue(i); if (v.getType() == Value.BYTES) { data.writeValue(ValueNull.INSTANCE); buffer.writeVarInt(session.getId()); buffer.writeVarInt(tableId); buffer.writeVarLong(row.getKey()); if (add) { buffer.writeVarInt(data.length());
@Override public Row get() { if (row == null) { if (current != null) { ValueArray array = (ValueArray) current.getValue(); row = session.createRow(array.getList(), 0); row.setKey(current.getKey().getLong()); } } return row; }
public void remove(Session session, Row row) throws SQLException { if (storage != null) { storage.removeRecord(session, row.getPos()); if (tableData.getContainsLargeObject()) { for (int i = 0; i < row.getColumnCount(); i++) { Value v = row.getValue(i); if (v.isLinked()) { session.unlinkAtCommit((ValueLob) v); Row free = new Row(null, 0); free.setPos(firstFree); int key = row.getPos(); rows.set(key, free); firstFree = key; row.setDeleted(true); if (delta == null) { delta = new HashSet();
@Override public void remove(Session session, Row row) { if (mvTable.getContainsLargeObject()) { for (int i = 0, len = row.getColumnCount(); i < len; i++) { Value v = row.getValue(i); if (v.isLinkedToTable()) { session.removeAtCommit(v); } } } TransactionMap<Value, Value> map = getMap(session); try { Value old = map.remove(ValueLong.get(row.getKey())); if (old == null) { throw DbException.get(ErrorCode.ROW_NOT_FOUND_WHEN_DELETING_1, getSQL() + ": " + row.getKey()); } } catch (IllegalStateException e) { throw mvTable.convertException(e); } }
@Override public boolean next() { try { boolean result = rs.next(); if (!result) { rs.close(); tableLink.reusePreparedStatement(prep, sql); current = null; return false; } } catch (SQLException e) { throw DbException.convert(e); } current = tableLink.getTemplateRow(); for (int i = 0; i < current.getColumnCount(); i++) { Column col = tableLink.getColumn(i); Value v = DataType.readValue(session, rs, i + 1, col.getType()); current.setValue(i, v); } return true; }