1+ import copy
2+
13from qtpy import QtWidgets
24
5+ import bw2data as bd
6+ import bw_functional as bf
7+
38from activity_browser import application
49from activity_browser .actions .base import ABAction , exception_dialogs
5- from activity_browser .mod import bw2data as bd
610from activity_browser .ui .icons import qicons
711from activity_browser .ui .threading import ABThread
812
13+ from .database_new import NewDatabaseDialog
14+
915
1016class DatabaseDuplicate (ABAction ):
1117 """
@@ -23,28 +29,34 @@ class DatabaseDuplicate(ABAction):
2329 @exception_dialogs
2430 def run (db_name : str ):
2531 assert db_name in bd .databases
32+ backend = bd .databases [db_name ].get ("backend" , "undefined" )
2633
27- new_name , ok = QtWidgets . QInputDialog . getText (
28- application . main_window ,
29- f"Copy { db_name } " ,
30- "Name of new database:" + " " * 25 ,
31- )
32- if not new_name or not ok :
34+ if backend not in [ "sqlite" , "functional_sqlite" ]:
35+ QtWidgets . QMessageBox . information (
36+ application . main_window ,
37+ "Not possible" ,
38+ f"Unsupported database backend { backend } " ,
39+ )
3340 return
3441
35- if new_name in bd .databases :
42+ name , backend , ok = NewDatabaseDialog .get_new_database_data (window_title = "Duplicate database" , backend = backend )
43+
44+ if not name or not ok :
45+ return
46+
47+ if name in bd .databases :
3648 QtWidgets .QMessageBox .information (
3749 application .main_window ,
3850 "Not possible" ,
3951 "A database with this name already exists." ,
4052 )
4153 return
4254
43- DuplicateDatabaseDialog (db_name , new_name , application .main_window )
55+ DuplicateDatabaseDialog (db_name , name , backend , application .main_window )
4456
4557
4658class DuplicateDatabaseDialog (QtWidgets .QProgressDialog ):
47- def __init__ (self , from_db : str , to_db : str , parent = None ):
59+ def __init__ (self , from_db : str , to_db : str , backend : str , parent = None ):
4860 super ().__init__ (parent = parent )
4961 self .setWindowTitle ("Duplicating database" )
5062 self .setLabelText (
@@ -53,12 +65,12 @@ def __init__(self, from_db: str, to_db: str, parent=None):
5365 self .setModal (True )
5466 self .setRange (0 , 0 )
5567
56- self .dup_thread = DuplicateDatabaseThread (from_db , to_db , self )
68+ self .dup_thread = DuplicateDatabaseThread (application )
5769 self .dup_thread .finished .connect (self .thread_finished )
5870
5971 self .show ()
6072
61- self .dup_thread .start ()
73+ self .dup_thread .start (from_db , to_db , backend )
6274
6375 def thread_finished (self ) -> None :
6476 self .dup_thread .exit (0 )
@@ -67,11 +79,24 @@ def thread_finished(self) -> None:
6779
6880
6981class DuplicateDatabaseThread (ABThread ):
70- def __init__ (self , from_db , to_db , parent = None ):
71- super ().__init__ (parent = parent )
72- self .copy_from = from_db
73- self .copy_to = to_db
7482
75- def run_safely (self ):
76- database = bd .Database (self .copy_from )
77- database .copy (self .copy_to )
83+ def run_safely (self , copy_from , copy_to , backend ):
84+ database = bd .Database (copy_from )
85+
86+ data = database .load ()
87+ data = database .relabel_data (data , copy_from , copy_to )
88+
89+ new_database = bd .Database (copy_to , backend = backend )
90+
91+ metadata = copy .copy (database .metadata )
92+ metadata ["format" ] = f"Copied from '{ copy_from } '"
93+ metadata ["backend" ] = backend
94+ new_database .register (** metadata )
95+
96+ if database .backend == "sqlite" and backend == "functional_sqlite" :
97+ data = bf .convert_sqlite_to_functional_sqlite (data )
98+ elif database .backend == "functional_sqlite" and backend == "sqlite" :
99+ data = bf .convert_functional_sqlite_to_sqlite (data )
100+
101+ new_database .write (data , searchable = metadata .get ("searchable" ))
102+ return new_database
0 commit comments