SQL update: two diffs left, in family and place

svn: r12935
This commit is contained in:
Doug Blank 2009-08-09 17:40:36 +00:00
parent 65f72560d1
commit 0a476e2a3c
2 changed files with 122 additions and 47 deletions

View File

@ -1,6 +1,6 @@
# Gramps - a GTK+/GNOME based genealogy program # Gramps - a GTK+/GNOME based genealogy program
# #
# Copyright (C) 2008 Douglas S. Blank # Copyright (C) 2008 Douglas S. Blank <doug.blank@gmail.com>
# #
# This program is free software; you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
@ -18,27 +18,41 @@
# #
# $Id$ # $Id$
# #
"Export to SQLite Database"
#------------------------------------------------------------------------ #------------------------------------------------------------------------
# #
# python modules # Standard Python Modules
# #
#------------------------------------------------------------------------ #------------------------------------------------------------------------
from gettext import gettext as _ from gettext import gettext as _
from gettext import ngettext
import sqlite3 as sqlite import sqlite3 as sqlite
import re import time
#------------------------------------------------------------------------
#
# Set up logging
#
#------------------------------------------------------------------------
import logging
log = logging.getLogger(".ExportSql")
#------------------------------------------------------------------------ #------------------------------------------------------------------------
# #
# GRAMPS modules # GRAMPS modules
# #
#------------------------------------------------------------------------ #------------------------------------------------------------------------
import gen.lib
from gen.plug import PluginManager, ExportPlugin from gen.plug import PluginManager, ExportPlugin
import DateHandler
from gui.utils import ProgressMeter
import ExportOptions import ExportOptions
from Utils import create_id from Utils import create_id
#-------------------------------------------------------------------------
#
# Export functions
#
#-------------------------------------------------------------------------
def lookup(index, event_ref_list): def lookup(index, event_ref_list):
""" """
Get the unserialized event_ref in an list of them and return it. Get the unserialized event_ref in an list of them and return it.
@ -60,6 +74,7 @@ def makeDB(db):
db.query("""drop table event;""") db.query("""drop table event;""")
db.query("""drop table family;""") db.query("""drop table family;""")
db.query("""drop table repository;""") db.query("""drop table repository;""")
db.query("""drop table repository_ref;""")
db.query("""drop table date;""") db.query("""drop table date;""")
db.query("""drop table place;""") db.query("""drop table place;""")
db.query("""drop table source;""") db.query("""drop table source;""")
@ -77,6 +92,7 @@ def makeDB(db):
db.query("""drop table location;""") db.query("""drop table location;""")
db.query("""drop table attribute;""") db.query("""drop table attribute;""")
db.query("""drop table url;""") db.query("""drop table url;""")
db.query("""drop table datamap;""")
db.query("""CREATE TABLE note ( db.query("""CREATE TABLE note (
handle CHARACTER(25), handle CHARACTER(25),
@ -193,6 +209,14 @@ def makeDB(db):
marker1 TEXT, marker1 TEXT,
private BOOLEAN);""") private BOOLEAN);""")
db.query("""CREATE TABLE repository_ref (
handle CHARACTER(25),
ref CHARACTER(25),
call_number TEXT,
source_media_type0 INTEGER,
source_media_type1 TEXT,
private BOOLEAN);""")
db.query("""CREATE TABLE repository ( db.query("""CREATE TABLE repository (
handle CHARACTER(25), handle CHARACTER(25),
gid CHARACTER(25), gid CHARACTER(25),
@ -252,7 +276,7 @@ def makeDB(db):
place CHARACTER(25), place CHARACTER(25),
famc CHARACTER(25), famc CHARACTER(25),
temple TEXT, temple TEXT,
status TEXT, status INTEGER,
private BOOLEAN);""") private BOOLEAN);""")
db.query("""CREATE TABLE media_ref ( db.query("""CREATE TABLE media_ref (
@ -295,6 +319,12 @@ def makeDB(db):
private BOOLEAN); private BOOLEAN);
""") """)
db.query("""CREATE TABLE datamap (
handle CHARACTER(25),
key_field TEXT,
value_field TXT);
""")
class Database(object): class Database(object):
""" """
The db connection. The db connection.
@ -740,6 +770,17 @@ def export_link(db, from_type, from_handle, to_type, to_handle):
to_handle) values (?, ?, ?, ?)""", to_handle) values (?, ?, ?, ?)""",
from_type, from_handle, to_type, to_handle) from_type, from_handle, to_type, to_handle)
def export_datamap_dict(db, from_type, from_handle, datamap):
for key_field in datamap:
handle = create_id()
value_field = datamap[key_field]
db.query("""INSERT INTO datamap (
handle,
key_field,
value_field) values (?, ?, ?)""",
handle, key_field, value_field)
export_link(db, from_type, from_handle, "datamap", handle)
def export_address(db, from_type, from_handle, address): def export_address(db, from_type, from_handle, address):
(private, asource_list, anote_list, date, location) = address (private, asource_list, anote_list, date, location) = address
addr_handle = create_id() addr_handle = create_id()
@ -776,10 +817,36 @@ def export_location(db, from_type, from_handle, location):
# finally, link the parent to the address # finally, link the parent to the address
export_link(db, from_type, from_handle, "location", handle) export_link(db, from_type, from_handle, "location", handle)
def export_repository_ref_list(db, from_type, from_handle, reporef_list):
for repo in reporef_list:
(note_list,
ref,
call_number,
source_media_type,
private) = repo
handle = create_id()
db.query("""insert INTO repository_ref (
handle,
ref,
call_number,
source_media_type0,
source_media_type1,
private) VALUES (?,?,?,?,?,?);""",
handle,
ref,
call_number,
source_media_type[0],
source_media_type[1],
private)
export_list(db, "repository_ref", handle, "note", note_list)
# finally, link this to parent
export_link(db, from_type, from_handle, "repository_ref", handle)
def exportData(database, filename, option_box=None, callback=None): def exportData(database, filename, option_box=None, callback=None):
if not callable(callback): if not callable(callback):
callback = lambda (percent): None # dummy callback = lambda (percent): None # dummy
start = time.time()
total = (len(database.note_map) + total = (len(database.note_map) +
len(database.person_map) + len(database.person_map) +
len(database.event_map) + len(database.event_map) +
@ -952,14 +1019,8 @@ def exportData(database, filename, option_box=None, callback=None):
marker[0], marker[1], private) marker[0], marker[1], private)
export_list(db, "source", handle, "note", note_list) export_list(db, "source", handle, "note", note_list)
export_media_ref_list(db, "source", handle, media_list) export_media_ref_list(db, "source", handle, media_list)
# FIXME: reporef_list, datamap export_datamap_dict(db, "source", handle, datamap)
#print "FIXME: reporef_list", reporef_list export_repository_ref_list(db, "source", handle, reporef_list)
#print "FIXME: datamap", datamap
#FIXME: reporef_list []
#FIXME: datamap {}
#FIXME: reporef_list [([], u'b2cfa6e37654b308559', '', (2, u''), False)]
#FIXME: datamap {}
count += 1 count += 1
callback(100 * count/total) callback(100 * count/total)
@ -996,12 +1057,18 @@ def exportData(database, filename, option_box=None, callback=None):
count += 1 count += 1
callback(100 * count/total) callback(100 * count/total)
total_time = time.time() - start
msg = ngettext('Export Complete: %d second','Export Complete: %d seconds', total_time ) % total_time
print msg
return True return True
# Future ideas
# Also include meta:
# Bookmarks # Bookmarks
# Header - researcher info # Header - researcher info
# Name formats # Name formats
# Namemaps? # Namemaps?
# GRAMPS Version #, date, exporter
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #

View File

@ -19,7 +19,7 @@
# #
# $Id$ # $Id$
"Import from SQL Database" "Import from SQLite Database"
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
@ -29,7 +29,6 @@
from gettext import gettext as _ from gettext import gettext as _
from gettext import ngettext from gettext import ngettext
import sqlite3 as sqlite import sqlite3 as sqlite
import re
import time import time
#------------------------------------------------------------------------ #------------------------------------------------------------------------
@ -47,15 +46,12 @@ log = logging.getLogger(".ImportSql")
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
import gen.lib import gen.lib
from QuestionDialog import ErrorDialog from QuestionDialog import ErrorDialog
from DateHandler import parser as _dp
from gen.plug import PluginManager, ImportPlugin from gen.plug import PluginManager, ImportPlugin
from Utils import gender as gender_map
from gui.utils import ProgressMeter
from Utils import create_id from Utils import create_id
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
# Import function # Import functions
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
def lookup(handle, event_ref_list): def lookup(handle, event_ref_list):
@ -75,7 +71,7 @@ def lookup(handle, event_ref_list):
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
# SQL Reader # SQLite DB Class
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
class Database(object): class Database(object):
@ -109,6 +105,11 @@ class Database(object):
self.cursor.close() self.cursor.close()
self.db.close() self.db.close()
#-------------------------------------------------------------------------
#
# SQL Reader
#
#-------------------------------------------------------------------------
class SQLReader(object): class SQLReader(object):
def __init__(self, db, filename, callback): def __init__(self, db, filename, callback):
if not callable(callback): if not callable(callback):
@ -174,8 +175,17 @@ class SQLReader(object):
return retval return retval
def get_datamap(self, sql, from_type, from_handle): def get_datamap(self, sql, from_type, from_handle):
# FIXME: handles = self.get_links(sql, from_type, from_handle, "datamap")
return {} datamap = {}
for handle in handles:
row = sql.query("select * from datamap where handle = ?;",
handle)
if len(row) == 1:
(handle, key_field, value_field) = row[0]
datamap[key_field] = value_field
else:
print "ERROR: invalid datamap item '%s'" % handle
return datamap
def get_event_ref_list(self, sql, from_type, from_handle): def get_event_ref_list(self, sql, from_type, from_handle):
results = self.get_links(sql, from_type, from_handle, "event_ref") results = self.get_links(sql, from_type, from_handle, "event_ref")
@ -238,13 +248,13 @@ class SQLReader(object):
def get_note_list(self, sql, from_type, from_handle): def get_note_list(self, sql, from_type, from_handle):
return self.get_links(sql, from_type, from_handle, "note") return self.get_links(sql, from_type, from_handle, "note")
def get_repository_list(self, sql, from_type, from_handle): def get_repository_ref_list(self, sql, from_type, from_handle):
handles = self.get_links(sql, from_type, from_handle, "repository") handles = self.get_links(sql, from_type, from_handle, "repository_ref")
results = [] results = []
for handle in handles: for handle in handles:
results += sql.query("""select * from repository where handle = ?;""", results += sql.query("""select * from repository_ref where handle = ?;""",
handle) handle)
return [self.pack_repository(sql, result) for result in results] return [self.pack_repository_ref(sql, result) for result in results]
def get_source_ref_list(self, sql, from_type, from_handle): def get_source_ref_list(self, sql, from_type, from_handle):
handles = self.get_links(sql, from_type, from_handle, "source_ref") handles = self.get_links(sql, from_type, from_handle, "source_ref")
@ -301,21 +311,19 @@ class SQLReader(object):
role = (role0, role1, role2, role3) role = (role0, role1, role2, role3)
return (private, source_list, note_list, attribute_list, ref, role) return (private, source_list, note_list, attribute_list, ref, role)
def pack_repository(self, sql, data): def pack_repository_ref(self, sql, data):
(handle, (handle,
gid, ref,
the_type0, call_number,
the_type1, source_media_type0,
name, source_media_type1,
change,
marker0,
marker1,
private) = data private) = data
note_list = self.get_note_list(sql, "repository", handle) note_list = self.get_note_list(sql, "repository_ref", handle)
address_list = self.get_address_list(sql, "repository", handle, with_parish=False) return (note_list,
urls = self.get_url_list(sql, "repository", handle) ref,
return (handle, gid, (the_type0, the_type1), name, note_list, call_number,
address_list, urls, change, (marker0, marker1), private) (source_media_type0, source_media_type1),
private)
def pack_url(self, sql, data): def pack_url(self, sql, data):
(handle, (handle,
@ -361,7 +369,7 @@ class SQLReader(object):
private) = data private) = data
note_list = self.get_note_list(sql, "source", handle) note_list = self.get_note_list(sql, "source", handle)
media_list = self.get_media_list(sql, "source", handle) media_list = self.get_media_list(sql, "source", handle)
reporef_list = self.get_repository_list(sql, "source", handle) reporef_list = self.get_repository_ref_list(sql, "source", handle)
datamap = {} datamap = {}
return (handle, gid, title, return (handle, gid, title,
author, pubinfo, author, pubinfo,
@ -768,7 +776,7 @@ class SQLReader(object):
note_list = self.get_note_list(sql, "source", handle) note_list = self.get_note_list(sql, "source", handle)
media_list = self.get_media_list(sql, "source", handle) media_list = self.get_media_list(sql, "source", handle)
datamap = self.get_datamap(sql, "source", handle) datamap = self.get_datamap(sql, "source", handle)
reporef_list = self.get_repository_list(sql, "source", handle) reporef_list = self.get_repository_ref_list(sql, "source", handle)
self.db.source_map[str(handle)] = (str(handle), gid, title, self.db.source_map[str(handle)] = (str(handle), gid, title,
author, pubinfo, author, pubinfo,