public synchronized void append(ChainedBuffer dbBuf) throws IOException {
		if (readOnly) {
			throw new UnsupportedOperationException("Read-only buffer");
		}
		if (uninitializedDataSource != null) {
			throw new UnsupportedOperationException(
				"Buffer size may not be changed when using unintialized data source");
		}
		if (firstBufferId < 0) {
			throw new AssertException("Invalid Buffer");
		}
		if (dbBuf.firstBufferId < 0 || firstBufferId == dbBuf.firstBufferId) {
			throw new IllegalArgumentException("Illegal DBBuffer argument");
		}

		// Grow this buffer - preserve data	
		int offset = size;
		int newSize = size + dbBuf.size;
		grow(newSize, true);

		// Delete dbBuf index buffers
		BufferMgr otherBufMgr = dbBuf.bufferMgr;
		if (dbBuf.indexBufferIdTable != null) {
			for (int element : dbBuf.indexBufferIdTable) {
				otherBufMgr.deleteBuffer(element);
			}
		}
		dbBuf.indexBufferIdTable = null;
		dbBuf.firstBufferId = -1;

		// Copy dbBuf data and delete original buffer
		int cnt = 0;
		int dataSize = dbBuf.dataSpace;
		byte[] data = new byte[dataSize];

		for (int element : dbBuf.dataBufferIdTable) {
			cnt += dataSize;
			if (cnt > dbBuf.size) {
				dataSize -= (cnt - dbBuf.size);
			}
			if (element >= 0) {

				DataBuffer otherDataBuf = otherBufMgr.getBuffer(element);
				try {
					otherDataBuf.get(dbBuf.dataBaseOffset, data, 0, dataSize);
					if (dbBuf.useXORMask) {
						for (int n = 0; n < dataSize; n++) {
							data[n] = xorMaskByte(n, data[n]);
						}
					}
					put(offset, data, 0, dataSize);
				}
				finally {
					otherBufMgr.releaseBuffer(otherDataBuf);
				}

				// Delete dbBuf data buffer
				otherBufMgr.deleteBuffer(element);
			}
			offset += dataSize;
		}

		dbBuf.dataBufferIdTable = null;
		dbBuf.size = 0;
	}
Append the contents of the specified dbBuf onto the end of this buffer.
The size of this buffer increases by the size of dbBuf.  When the operation 
is complete, dbBuf object is no longer valid and must not be used.
@param dbBuf the buffer to be appended to this buffer.
@throws IOException thrown if an IO error occurs
@throws UnsupportedOperationException if read-only, uninitialized data source is used,
or both buffers do not have the same obfuscation enablement
Ghidra/Framework/DB/src/main/java/db/ChainedBuffer.java