Persistence code samples

Below are sketches of essential classes of the PERSIST framework.

For an open discussion on the design choices please have a look at the persistence framework design discussion.

You can download the source code here (TODO: provide a link to the sources)

An example of an actually implemented library built according to the PERSIST framework is dadle.

You can also go back to the persistence unified page.

Simplified BON diagram

Abel class diagram.png

PERSISTENCE_MANAGER

class
	PERSISTENCE_MANAGER
 
feature -- Access
 
	medium: PERSISTENCE_MEDIUM
			-- Chosen medium
 
	format: PERSISTENCE_FORMAT
			-- Chosen format
 
feature -- Basic operations
 
	store (an_object: ANY)
			-- Persists an_object using the format and medium stored by current object.
		do
			format.store (an_object, medium)
		end
 
	retrieve: ANY
			-- Retrieves an_object using the medium and format stored by current object.
		do
			Result := format.retrieve (medium)
		end
 
end

BINARY_PERSISTENCE_MANAGER

class
	BINARY_PERSISTENCE_MANAGER
 
inherit
	PERSISTENCE_MANAGER
 
create
	make
 
feature -- Initialization
 
	make (file_name: STRING)
			-- Initialization procedure
		do
			create {FILE_MEDIUM} medium.make (file_name)
			create {INDEPENDENT_BINARY_FORMAT} format
		end
 
end

PERSISTENCE_FORMAT

deferred class
	PERSISTENCE_FORMAT
 
feature -- Basic operations
 
       serialized_form: SERIALIZED_FORM
			-- Desired serialized form. If exists, this is what will be serialized.
 
       set_serialized_form (custom_serialized: SERIALIZED_FORM)
			-- Set desired custom serialized form. This is what will be serialized.
		do
			 serialized_form := custom_serialized
		ensure
			object_effect: custom_ser = serialized_form
		end
 
	store (object: ANY; medium: PERSISTENCE_MEDIUM)
			-- Store 'object' using medium
		deferred
		end
 
	retrieve (medium: PERSISTENCE_MEDIUM):ANY
		deferred
		end
end

BINARY_FORMAT

deferred class
	BINARY_FORMAT
 
inherit
	PERSISTENCE_FORMAT
		redefine
			store,
			retrieve
		end
 
feature -- Access
 
	store_handler: SED_STORABLE_FACILITIES
 
	serializer: SED_MEDIUM_READER_WRITER
 
feature -- Basic operations
 
	store (object: ANY; data_file: FILE_MEDIUM)
			-- stores 'object' using a FILE_MEDIUM
		do
			create store_handler
			create serializer.make (data_file.raw_file)
			if data_file.exists then
				data_file.reopen_write (data_file.file_name)
			else
				data_file.open_write
			end
			serializer.set_for_writing
			store_now (object)
		end
 
	store_now (object_to_store: ANY)
			-- Proper store operation depends on specific descendant.
		deferred
		end
 
	retrieve (data_file: FILE_MEDIUM): ANY
			-- Retrieve object using a FILE_MEDIUM
		do
			create store_handler
			create serializer.make (data_file.raw_file)
			if data_file.exists then
				data_file.open_read
				serializer.set_for_reading
				Result:= store_handler.retrieved (serializer,true)
			else
				print ("%NData file does not exist! ")
			end
		end
 
end

INDEPENDENT_BINARY_FORMAT

class
	INDEPENDENT_BINARY_FORMAT
 
inherit
	BINARY_FORMAT
 
feature -- Access
 
	optimized_for_retrieval: BOOLEAN
 
feature -- Status setting
 
	set_optimized_for_retrieval (is_optimized_for_retrieval:BOOLEAN)
		do
			optimized_for_retrieval:= is_optimized_for_retrieval
		ensure
			optimized_for_retrieval_effect: optimized_for_retrieval = is_optimized_for_retrieval
		end
 
feature -- Basic operations
 
	store_now (object_to_store:ANY)
		do
			store_handler.independent_store(object_to_store,serializer,optimized_for_retrieval)
		end
 
end

FILE_MEDIUM

class
	FILE_MEDIUM
 
inherit
	PERSISTENCE_MEDIUM
 
create
	make
 
feature -- Initialization
 
	make (a_file_name:STRING)
		do
			create raw_file.make (a_file_name)
			file_name:=a_file_name
		ensure
			file_name_effect: file_name = a_file_name
		end
 
feature -- Access
 
	raw_file: RAW_FILE
 
	file_name: STRING
 
feature -- Status report
 
	exists: BOOLEAN
		do
			Result := raw_file.exists
		end
 
feature -- Basic operations
 
	reopen_write (a_file_name: STRING)
			-- Reopens the file named 'a_file_name' for writing.
		do
			raw_file.reopen_write (a_file_name)
		end
 
	open_write
			-- Open the current file for writing.
		do
			raw_file.open_write
		end
 
	open_read
			-- Open the current file for reading.
		do
			raw_file.open_read
		end
 
end