Persistence code samples

Revision as of 11:54, 23 April 2009 by Marco Piccioni (Talk | contribs) (PERSISTENCE_FORMAT)

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

New persistence diagram.png

PERSISTENCE_MANAGER

class
	PERSISTENCE_MANAGER
 
feature -- Access
 
	medium: PERSISTENCE_MEDIUM -- the chosen medium
 
	format: PERSISTENCE_FORMAT	-- the chosen format
 
feature -- Basic operations
 
	store (an_object:ANY)
			-- persists an_object using the format and medium stored by current object
		require
			an_object_exists:an_object /= Void
			medium_exists: medium /= Void
		do
			format.store(an_object,medium)
		end
 
	retrieve: ANY
			-- retrieves an_object using the medium and format stored by current object
		require
			medium_exists: medium /= Void
		do
			Result:=format.retrieve(medium)
		end
end

BINARY_SERIALIZATION_MANAGER

class
	BINARY_SERIALIZATION_MANAGER
 
inherit
	PERSISTENCE_MANAGER
 
create
	make
 
feature -- Initialization
 
	make (file_name: STRING)
			-- Initialization procedure
		require
			file_name_exists: file_name /= Void
		do
			create {FILE_MEDIUM} medium.make (file_name)
			create {INDEPENDENT_BINARY_FORMAT} format
		ensure
			medium_exists: medium /= Void
			format_exists: format /= Void
		end
 
end

PERSISTENCE_FORMAT

deferred class
	PERSISTENCE_FORMAT
 
feature -- Basic operations
 
       serialized_form: SERIALIZED_FORM
 
       set_serialized_form (custom_ser: SERIALIZED_FORM)
				-- Set desired custom serialized form. This is what will be serialized.
		require
			object_exists: custom_ser /= Void
		do
			 serialized_form := custom_ser
		ensure
			object_set: custom_ser = serialized_form
		end
 
	store (object:ANY; medium:PERSISTENCE_MEDIUM)
			-- stores object using medium
		require
			object_exists: object /= Void
			medium_exists: medium /= Void
		deferred
		end
 
	retrieve (medium: PERSISTENCE_MEDIUM):ANY
		require
			medium_exists: medium /= Void
		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
	require
		object_to_store_exists:object_to_store/=Void
		deferred
	end
 
	retrieve (data_file:FILE_MEDIUM):ANY
			-- retrieves 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_set: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)
	require
		a_file_name_exists:a_file_name /= Void
	do
		create raw_file.make (a_file_name)
		file_name:=a_file_name
	ensure
		raw_file_exists: raw_file /=Void
		file_name_set: 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
	require
		a_file_name_exists:a_file_name /= Void
	do
		raw_file.reopen_write (a_file_name)
	end
 
	open_write
			-- opens the current file for writing
	require
		a_file_to_open_exists:raw_file /= Void
	do
		raw_file.open_write
	end
 
	open_read
			-- opens the current file for reading
	do
		raw_file.open_read
	end
 
end