diff --git a/src/calibre/library/__init__.py b/src/calibre/library/__init__.py index 0f8e5e5496..8ff23c0a0a 100644 --- a/src/calibre/library/__init__.py +++ b/src/calibre/library/__init__.py @@ -6,3 +6,53 @@ def db(path=None): from calibre.library.database2 import LibraryDatabase2 from calibre.utils.config import prefs return LibraryDatabase2(path if path else prefs['library_path']) + + +def generate_test_db(library_path, + num_of_records=20000, + num_of_authors=6000, + num_of_tags=10000, + tag_length=7, + author_length=7, + title_length=10, + max_authors=10, + max_tags=10 + ): + import random, string, os, sys, time + + if not os.path.exists(library_path): + os.makedirs(library_path) + + def randstr(length): + return ''.join(random.choice(string.letters) for i in + xrange(length)) + + all_tags = [randstr(tag_length) for j in xrange(num_of_tags)] + print 'Generated', num_of_tags, 'tags' + all_authors = [randstr(author_length) for j in xrange(num_of_authors)] + print 'Generated', num_of_authors, 'authors' + all_titles = [randstr(title_length) for j in xrange(num_of_records)] + print 'Generated', num_of_records, 'titles' + + testdb = db(library_path) + + print 'Creating', num_of_records, 'records...' + + start = time.time() + + for i, title in enumerate(all_titles): + print i+1, + sys.stdout.flush() + authors = random.randint(1, max_authors) + authors = [random.choice(all_authors) for i in xrange(authors)] + tags = random.randint(0, max_tags) + tags = [random.choice(all_tags) for i in xrange(tags)] + from calibre.ebooks.metadata.book.base import Metadata + mi = Metadata(title, authors) + mi.tags = tags + testdb.import_book(mi, []) + + t = time.time() - start + print '\nGenerated', num_of_records, 'records in:', t, 'seconds' + print 'Time per record:', t/float(num_of_records) + diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 44e7449295..21a54a4dd6 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -2089,8 +2089,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): mi.timestamp = utcnow() if mi.pubdate is None: mi.pubdate = utcnow() - self.set_metadata(id, mi, ignore_errors=True, commit=False) - self.conn.commit() + self.set_metadata(id, mi, ignore_errors=True, commit=True) if cover is not None: try: self.set_cover(id, cover) @@ -2130,8 +2129,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): mi.timestamp = utcnow() if mi.pubdate is None: mi.pubdate = utcnow() - self.set_metadata(id, mi, commit=False) - self.conn.commit() + self.set_metadata(id, mi, commit=True, ignore_errors=True) npath = self.run_import_plugins(path, format) format = os.path.splitext(npath)[-1].lower().replace('.', '').upper() stream = lopen(npath, 'rb') @@ -2169,7 +2167,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): mi.timestamp = utcnow() if mi.pubdate is None: mi.pubdate = utcnow() - self.set_metadata(id, mi, ignore_errors=True) + self.set_metadata(id, mi, ignore_errors=True, commit=True) if preserve_uuid and mi.uuid: self.set_uuid(id, mi.uuid, commit=False) for path in formats: