static MemoryMapDBAdapter upgrade(DBHandle handle, MemoryMapDBAdapter oldAdapter,
			MemoryMapDB memMap, TaskMonitor monitor) throws VersionException, IOException {

		try {
			monitor.setMessage("Upgrading Memory Blocks...");
			List<MemoryBlockDB> blocks = oldAdapter.getMemoryBlocks();
			oldAdapter.deleteTable(handle);

			monitor.initialize(blocks.size() * 2);

			MemoryMapDBAdapter newAdapter =
				new MemoryMapDBAdapterV3(handle, memMap, Memory.GBYTE, true);
			for (MemoryBlockDB block : blocks) {
				MemoryBlock newBlock = null;
				if (block.isInitialized()) {
					DBBuffer buf = block.getBuffer();
					newBlock = newAdapter.createInitializedBlock(block.getName(), block.getStart(),
						buf, block.getFlags());
				}
				else {
					Address mappedAddress = null;

					if (block.isMapped()) {
						MemoryBlockSourceInfo info = block.getSourceInfos().get(0);
						mappedAddress = info.getMappedRange().get().getMinAddress();
					}
					newBlock =
						newAdapter.createBlock(block.getType(), block.getName(), block.getStart(),
							block.getSize(), mappedAddress, false, block.getFlags(), 0);
				}
				newBlock.setComment(block.getComment());
				newBlock.setSourceName(block.getSourceName());
			}
			newAdapter.refreshMemory();
			return newAdapter;
		}
		catch (AddressOverflowException e) {
			// This should not occur
			throw new AssertException(e);
		}
	}
Subblock record long data2 usage:
<ul>
<li>{@link BufferSubMemoryBlock} - (not used) 0</li>
<li>{@link FileBytesSubMemoryBlock} - starting byte offset within file bytes buffer</li>
<li>{@link ByteMappedSubMemoryBlock} - encoded mapped source address</li>
<li>{@link BitMappedSubMemoryBlock} - encoded mapped source address</li>
<li>{@link UninitializedSubMemoryBlock} - (not used) 0</li>
</ul>
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/mem/MemoryMapDBAdapter.java