168 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			168 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| #
 | |
| # Gramps - a GTK+/GNOME based genealogy program
 | |
| #
 | |
| # Copyright (C) 2000-2007  Donald N. Allingham
 | |
| #
 | |
| # This program is free software; you can redistribute it and/or modify
 | |
| # it under the terms of the GNU General Public License as published by
 | |
| # the Free Software Foundation; either version 2 of the License, or
 | |
| # (at your option) any later version.
 | |
| #
 | |
| # This program is distributed in the hope that it will be useful,
 | |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
| # GNU General Public License for more details.
 | |
| #
 | |
| # You should have received a copy of the GNU General Public License
 | |
| # along with this program; if not, write to the Free Software
 | |
| # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 | |
| #
 | |
| 
 | |
| import unittest
 | |
| import tempfile
 | |
| import shutil
 | |
| 
 | |
| from gramps.gen.db import DbBsddb, DbTxn
 | |
| from gramps.cli.clidbman import CLIDbManager
 | |
| from gramps.gen.lib import (Source, RepoRef, Citation, Repository, Person, 
 | |
|                             Family, Event, Place, MediaObject)
 | |
| 
 | |
| from gramps.gen.constfunc import cuni
 | |
| 
 | |
| class GrampsDbBaseTest(unittest.TestCase):
 | |
|     """Base class for unittest that need to be able to create
 | |
|     test databases."""
 | |
|     
 | |
|     def setUp(self):        
 | |
|         def dummy_callback(dummy):
 | |
|             pass
 | |
|         self._tmpdir = tempfile.mkdtemp()
 | |
|         
 | |
|         self._db = DbBsddb()
 | |
|         dbman = CLIDbManager(None)
 | |
|         self._filename, title = dbman.create_new_db_cli(title=cuni("Test"))
 | |
|         self._db.load(self._filename, dummy_callback, "w")
 | |
| 
 | |
|     def tearDown(self):
 | |
|         self._db.close()
 | |
|         shutil.rmtree(self._tmpdir)
 | |
| 
 | |
|     def _populate_database(self,
 | |
|                            num_sources = 1,
 | |
|                            num_persons = 0,
 | |
|                            num_families = 0,
 | |
|                            num_events = 0,
 | |
|                            num_places = 0,
 | |
|                            num_media_objects = 0,
 | |
|                            num_links = 1):
 | |
| 
 | |
|         # start with sources
 | |
|         sources = []
 | |
|         for i in xrange(0, num_sources):
 | |
|             sources.append(self._add_source())
 | |
| 
 | |
|         # now for each of the other tables. Give each entry a link
 | |
|         # to num_link sources, sources are chosen on a round robin
 | |
|         # basis
 | |
| 
 | |
|         for num, add_func in ((num_persons, self._add_person_with_sources),
 | |
|                               (num_families, self._add_family_with_sources),
 | |
|                               (num_events, self._add_event_with_sources),
 | |
|                               (num_places, self._add_place_with_sources),
 | |
|                               (num_media_objects, self._add_media_object_with_sources)):
 | |
|                                    
 | |
|             source_idx = 1
 | |
|             for person_idx in xrange(0, num):
 | |
| 
 | |
|                 # Get the list of sources to link
 | |
|                 lnk_sources = set()
 | |
|                 for i in xrange(0, num_links):
 | |
|                     lnk_sources.add(sources[source_idx-1])
 | |
|                     source_idx = (source_idx+1) % len(sources)
 | |
| 
 | |
|                 try:
 | |
|                     add_func(lnk_sources)
 | |
|                 except:
 | |
|                     print ("person_idx = ", person_idx)
 | |
|                     print ("lnk_sources = ", repr(lnk_sources))
 | |
|                     raise
 | |
| 
 | |
|         return
 | |
| 
 | |
|     def _add_source(self,repos=None):
 | |
|         # Add a Source
 | |
| 
 | |
|         with DbTxn("Add Source and Citation", self._db) as tran:
 | |
|             source = Source()
 | |
|             if repos is not None:
 | |
|                 repo_ref = RepoRef()
 | |
|                 repo_ref.set_reference_handle(repos.get_handle())
 | |
|                 source.add_repo_reference(repo_ref)
 | |
|             self._db.add_source(source, tran)
 | |
|             self._db.commit_source(source, tran)
 | |
|             citation = Citation()
 | |
|             citation.set_reference_handle(source.get_handle())
 | |
|             self._db.add_citation(citation, tran)
 | |
|             self._db.commit_citation(citation, tran)
 | |
| 
 | |
|         return citation
 | |
| 
 | |
|     def _add_repository(self):
 | |
|         # Add a Repository
 | |
|         
 | |
|         with DbTxn("Add Repository", self._db) as tran:
 | |
|             repos = Repository()
 | |
|             self._db.add_repository(repos, tran)
 | |
|             self._db.commit_repository(repos, tran)
 | |
| 
 | |
|         return repos
 | |
| 
 | |
|                            
 | |
|     def _add_object_with_source(self, citations, object_class, add_method, 
 | |
|                                 commit_method):
 | |
| 
 | |
|         object = object_class()
 | |
| 
 | |
|         with DbTxn("Add Object", self._db) as tran:
 | |
|             for citation in citations:
 | |
|                 object.add_citation(citation.get_handle())
 | |
|             add_method(object, tran)
 | |
|             commit_method(object, tran)
 | |
| 
 | |
|         return object
 | |
| 
 | |
|     def _add_person_with_sources(self, citations):
 | |
| 
 | |
|         return self._add_object_with_source(citations,
 | |
|                                             Person,
 | |
|                                             self._db.add_person,
 | |
|                                             self._db.commit_person)
 | |
| 
 | |
|     def _add_family_with_sources(self, citations):
 | |
| 
 | |
|         return self._add_object_with_source(citations,
 | |
|                                             Family,
 | |
|                                             self._db.add_family,
 | |
|                                             self._db.commit_family)
 | |
| 
 | |
|     def _add_event_with_sources(self, citations):
 | |
| 
 | |
|         return self._add_object_with_source(citations,
 | |
|                                             Event,
 | |
|                                             self._db.add_event,
 | |
|                                             self._db.commit_event)
 | |
| 
 | |
|     def _add_place_with_sources(self, citations):
 | |
| 
 | |
|         return self._add_object_with_source(citations,
 | |
|                                             Place,
 | |
|                                             self._db.add_place,
 | |
|                                             self._db.commit_place)
 | |
| 
 | |
|     def _add_media_object_with_sources(self, citations):
 | |
| 
 | |
|         return self._add_object_with_source(citations,
 | |
|                                             MediaObject,
 | |
|                                             self._db.add_object,
 | |
|                                             self._db.commit_media_object)
 |