diff --git a/CMakeLists.txt b/CMakeLists.txt
index 4522b6f3..a1535c02 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -125,13 +125,13 @@ list(APPEND SOURCE_LIST
${SOURCEDIR}/gui/ReorderFieldsDialog.cpp
${SOURCEDIR}/gui/RestoreFrame.cpp
${SOURCEDIR}/gui/ServerRegistrationDialog.cpp
+ ${SOURCEDIR}/gui/ServiceBaseFrame.cpp
${SOURCEDIR}/gui/ShutdownStartupBaseFrame.cpp
${SOURCEDIR}/gui/ShutdownFrame.cpp
${SOURCEDIR}/gui/SimpleHtmlFrame.cpp
${SOURCEDIR}/gui/StatementHistoryDialog.cpp
${SOURCEDIR}/gui/StartupFrame.cpp
${SOURCEDIR}/gui/StyleGuide.cpp
- ${SOURCEDIR}/gui/ThreadBaseFrame.cpp
${SOURCEDIR}/gui/UserDialog.cpp
${SOURCEDIR}/gui/UsernamePasswordDialog.cpp
${SOURCEDIR}/logger.cpp
@@ -242,13 +242,13 @@ list(APPEND HEADER_LIST
${SOURCEDIR}/gui/ReorderFieldsDialog.h
${SOURCEDIR}/gui/RestoreFrame.h
${SOURCEDIR}/gui/ServerRegistrationDialog.h
+ ${SOURCEDIR}/gui/ServiceBaseFrame.h
${SOURCEDIR}/gui/ShutdownStartupBaseFrame.h
${SOURCEDIR}/gui/ShutdownFrame.h
${SOURCEDIR}/gui/SimpleHtmlFrame.h
${SOURCEDIR}/gui/StatementHistoryDialog.h
${SOURCEDIR}/gui/StartupFrame.h
${SOURCEDIR}/gui/StyleGuide.h
- ${SOURCEDIR}/gui/ThreadBaseFrame.h
${SOURCEDIR}/gui/UserDialog.h
${SOURCEDIR}/gui/UsernamePasswordDialog.h
${SOURCEDIR}/Isaac.h
diff --git a/GNUmakefile b/GNUmakefile
index b80600e6..332c59a9 100644
--- a/GNUmakefile
+++ b/GNUmakefile
@@ -113,13 +113,13 @@ FLAMEROBIN_OBJECTS = \
flamerobin_ReorderFieldsDialog.o \
flamerobin_RestoreFrame.o \
flamerobin_ServerRegistrationDialog.o \
+ flamerobin_ServiceBaseFrame.o \
flamerobin_ShutdownStartupBaseFrame.o \
flamerobin_ShutdownFrame.o \
flamerobin_SimpleHtmlFrame.o \
flamerobin_StatementHistoryDialog.o \
flamerobin_StartupFrame.o \
flamerobin_StyleGuide.o \
- flamerobin_ThreadBaseFrame.o \
flamerobin_UserDialog.o \
flamerobin_UsernamePasswordDialog.o \
flamerobin_logger.o \
@@ -422,6 +422,9 @@ flamerobin_RestoreFrame.o: ./src/gui/RestoreFrame.cpp
flamerobin_ServerRegistrationDialog.o: ./src/gui/ServerRegistrationDialog.cpp
$(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $<
+flamerobin_ServiceBaseFrame.o: ./${SOURCEDIR}/gui/ServiceBaseFrame.cpp
+ $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $<
+
flamerobin_ShutdownStartupBaseFrame.o: ./${SOURCEDIR}/gui/ShutdownStartupBaseFrame.cpp
$(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $<
@@ -440,9 +443,6 @@ flamerobin_StartupFrame.o: ./${SOURCEDIR}/gui/StartupFrame.cpp
flamerobin_StyleGuide.o: ./src/gui/StyleGuide.cpp
$(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $<
-flamerobin_ThreadBaseFrame.o: ./${SOURCEDIR}/gui/ThreadBaseFrame.cpp
- $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $<
-
flamerobin_UserDialog.o: ./src/gui/UserDialog.cpp
$(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $<
diff --git a/Makefile.in b/Makefile.in
index 58f62385..9be27c02 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -107,13 +107,13 @@ FLAMEROBIN_OBJECTS = \
flamerobin_ReorderFieldsDialog.o \
flamerobin_RestoreFrame.o \
flamerobin_ServerRegistrationDialog.o \
+ flamerobin_ServiceBaseFrame.o \
flamerobin_ShutdownStartupBaseFrame.o \
flamerobin_ShutdownFrame.o \
flamerobin_SimpleHtmlFrame.o \
flamerobin_StatementHistoryDialog.o \
flamerobin_StartupFrame.o \
flamerobin_StyleGuide.o \
- flamerobin_ThreadBaseFrame.o \
flamerobin_UserDialog.o \
flamerobin_UsernamePasswordDialog.o \
flamerobin_logger.o \
@@ -515,6 +515,9 @@ flamerobin_RestoreFrame.o: $(srcdir)/src/gui/RestoreFrame.cpp $(FLAMEROBIN_ODEP)
flamerobin_ServerRegistrationDialog.o: $(srcdir)/src/gui/ServerRegistrationDialog.cpp $(FLAMEROBIN_ODEP)
$(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/ServerRegistrationDialog.cpp
+flamerobin_ServiceBaseFrame.o: $(srcdir)/${SOURCEDIR}/gui/ServiceBaseFrame.cpp $(FLAMEROBIN_ODEP)
+ $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/${SOURCEDIR}/gui/ServiceBaseFrame.cpp
+
flamerobin_ShutdownStartupBaseFrame.o: $(srcdir)/${SOURCEDIR}/gui/ShutdownStartupBaseFrame.cpp $(FLAMEROBIN_ODEP)
$(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/${SOURCEDIR}/gui/ShutdownStartupBaseFrame.cpp
@@ -533,9 +536,6 @@ flamerobin_StartupFrame.o: $(srcdir)/${SOURCEDIR}/gui/StartupFrame.cpp $(FLAMERO
flamerobin_StyleGuide.o: $(srcdir)/src/gui/StyleGuide.cpp $(FLAMEROBIN_ODEP)
$(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/StyleGuide.cpp
-flamerobin_ThreadBaseFrame.o: $(srcdir)/${SOURCEDIR}/gui/ThreadBaseFrame.cpp $(FLAMEROBIN_ODEP)
- $(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/${SOURCEDIR}/gui/ThreadBaseFrame.cpp
-
flamerobin_UserDialog.o: $(srcdir)/src/gui/UserDialog.cpp $(FLAMEROBIN_ODEP)
$(CXXC) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(srcdir)/src/gui/UserDialog.cpp
diff --git a/Makefile.suncc b/Makefile.suncc
index 8ae2af92..0e5c6f09 100644
--- a/Makefile.suncc
+++ b/Makefile.suncc
@@ -116,13 +116,13 @@ FLAMEROBIN_OBJECTS = \
flamerobin_ReorderFieldsDialog.o \
flamerobin_RestoreFrame.o \
flamerobin_ServerRegistrationDialog.o \
+ flamerobin_ServiceBaseFrame.o \
flamerobin_ShutdownStartupBaseFrame.o \
flamerobin_ShutdownFrame.o \
flamerobin_SimpleHtmlFrame.o \
flamerobin_StatementHistoryDialog.o \
flamerobin_StartupFrame.o \
flamerobin_StyleGuide.o \
- flamerobin_ThreadBaseFrame.o \
flamerobin_UserDialog.o \
flamerobin_UsernamePasswordDialog.o \
flamerobin_logger.o \
@@ -419,6 +419,9 @@ flamerobin_RestoreFrame.o: ./src/gui/RestoreFrame.cpp
flamerobin_ServerRegistrationDialog.o: ./src/gui/ServerRegistrationDialog.cpp
$(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $<
+flamerobin_ServiceBaseFrame.o: ./${SOURCEDIR}/gui/ServiceBaseFrame.cpp
+ $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $<
+
flamerobin_ShutdownStartupBaseFrame.o: ./${SOURCEDIR}/gui/ShutdownStartupBaseFrame.cpp
$(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $<
@@ -437,9 +440,6 @@ flamerobin_StartupFrame.o: ./${SOURCEDIR}/gui/StartupFrame.cpp
flamerobin_StyleGuide.o: ./src/gui/StyleGuide.cpp
$(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $<
-flamerobin_ThreadBaseFrame.o: ./${SOURCEDIR}/gui/ThreadBaseFrame.cpp
- $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $<
-
flamerobin_UserDialog.o: ./src/gui/UserDialog.cpp
$(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $<
diff --git a/flamerobin.bkl b/flamerobin.bkl
index e6f240f3..55a913c1 100644
--- a/flamerobin.bkl
+++ b/flamerobin.bkl
@@ -292,13 +292,13 @@ Accepted values: AMD64, IA64.
$(SOURCEDIR)/gui/ReorderFieldsDialog.h
$(SOURCEDIR)/gui/RestoreFrame.h
$(SOURCEDIR)/gui/ServerRegistrationDialog.h
+ ${SOURCEDIR}/gui/ServiceBaseFrame.h
${SOURCEDIR}/gui/ShutdownStartupBaseFrame.h
${SOURCEDIR}/gui/ShutdownFrame.h
$(SOURCEDIR)/gui/SimpleHtmlFrame.h
$(SOURCEDIR)/gui/StatementHistoryDialog.h
${SOURCEDIR}/gui/StartupFrame.h
$(SOURCEDIR)/gui/StyleGuide.h
- ${SOURCEDIR}/gui/ThreadBaseFrame.h
$(SOURCEDIR)/gui/UserDialog.h
$(SOURCEDIR)/gui/UsernamePasswordDialog.h
$(SOURCEDIR)/Isaac.h
@@ -420,13 +420,13 @@ Accepted values: AMD64, IA64.
$(SOURCEDIR)/gui/ReorderFieldsDialog.cpp
$(SOURCEDIR)/gui/RestoreFrame.cpp
$(SOURCEDIR)/gui/ServerRegistrationDialog.cpp
+ ${SOURCEDIR}/gui/ServiceBaseFrame.cpp
${SOURCEDIR}/gui/ShutdownStartupBaseFrame.cpp
${SOURCEDIR}/gui/ShutdownFrame.cpp
$(SOURCEDIR)/gui/SimpleHtmlFrame.cpp
$(SOURCEDIR)/gui/StatementHistoryDialog.cpp
${SOURCEDIR}/gui/StartupFrame.cpp
$(SOURCEDIR)/gui/StyleGuide.cpp
- ${SOURCEDIR}/gui/ThreadBaseFrame.cpp
$(SOURCEDIR)/gui/UserDialog.cpp
$(SOURCEDIR)/gui/UsernamePasswordDialog.cpp
$(SOURCEDIR)/logger.cpp
diff --git a/flamerobin.cbp b/flamerobin.cbp
index 967b5aeb..03550f75 100644
--- a/flamerobin.cbp
+++ b/flamerobin.cbp
@@ -185,20 +185,20 @@
-
+
+
-
+
+
-
+
-
-
diff --git a/flamerobin.xcodeproj/project.pbxproj b/flamerobin.xcodeproj/project.pbxproj
index 200c2ba1..6a1228b8 100644
--- a/flamerobin.xcodeproj/project.pbxproj
+++ b/flamerobin.xcodeproj/project.pbxproj
@@ -888,37 +888,37 @@
};
0000000000000000000000a3 = {
isa = PBXFileReference;
- path = ShutdownStartupBaseFrame.cpp;
+ path = ServiceBaseFrame.cpp;
sourceTree = "";
};
0000000000000000000000a5 = {
isa = PBXFileReference;
- path = ShutdownFrame.cpp;
+ path = ShutdownStartupBaseFrame.cpp;
sourceTree = "";
};
0000000000000000000000a7 = {
isa = PBXFileReference;
- path = SimpleHtmlFrame.cpp;
+ path = ShutdownFrame.cpp;
sourceTree = "";
};
0000000000000000000000a9 = {
isa = PBXFileReference;
- path = StatementHistoryDialog.cpp;
+ path = SimpleHtmlFrame.cpp;
sourceTree = "";
};
0000000000000000000000ab = {
isa = PBXFileReference;
- path = StartupFrame.cpp;
+ path = StatementHistoryDialog.cpp;
sourceTree = "";
};
0000000000000000000000ad = {
isa = PBXFileReference;
- path = StyleGuide.cpp;
+ path = StartupFrame.cpp;
sourceTree = "";
};
0000000000000000000000af = {
isa = PBXFileReference;
- path = ThreadBaseFrame.cpp;
+ path = StyleGuide.cpp;
sourceTree = "";
};
0000000000000000000000b1 = {
@@ -1458,37 +1458,37 @@
};
00000000000000000000014c = {
isa = PBXFileReference;
- path = ShutdownStartupBaseFrame.h;
+ path = ServiceBaseFrame.h;
sourceTree = "";
};
00000000000000000000014d = {
isa = PBXFileReference;
- path = ShutdownFrame.h;
+ path = ShutdownStartupBaseFrame.h;
sourceTree = "";
};
00000000000000000000014e = {
isa = PBXFileReference;
- path = SimpleHtmlFrame.h;
+ path = ShutdownFrame.h;
sourceTree = "";
};
00000000000000000000014f = {
isa = PBXFileReference;
- path = StatementHistoryDialog.h;
+ path = SimpleHtmlFrame.h;
sourceTree = "";
};
000000000000000000000150 = {
isa = PBXFileReference;
- path = StartupFrame.h;
+ path = StatementHistoryDialog.h;
sourceTree = "";
};
000000000000000000000151 = {
isa = PBXFileReference;
- path = StyleGuide.h;
+ path = StartupFrame.h;
sourceTree = "";
};
000000000000000000000152 = {
isa = PBXFileReference;
- path = ThreadBaseFrame.h;
+ path = StyleGuide.h;
sourceTree = "";
};
000000000000000000000153 = {
@@ -2095,9 +2095,9 @@
00000000000000000000009d,
00000000000000000000009f,
0000000000000000000000a1,
- 0000000000000000000000a7,
0000000000000000000000a9,
- 0000000000000000000000ad,
+ 0000000000000000000000ab,
+ 0000000000000000000000af,
0000000000000000000000b1,
0000000000000000000000b3,
00000000000000000000011f,
@@ -2134,9 +2134,9 @@
000000000000000000000149,
00000000000000000000014a,
00000000000000000000014b,
- 00000000000000000000014e,
00000000000000000000014f,
- 000000000000000000000151,
+ 000000000000000000000150,
+ 000000000000000000000152,
000000000000000000000153,
000000000000000000000154,
);
@@ -2176,13 +2176,13 @@
00000000000000000000008d,
0000000000000000000000a3,
0000000000000000000000a5,
- 0000000000000000000000ab,
- 0000000000000000000000af,
+ 0000000000000000000000a7,
+ 0000000000000000000000ad,
000000000000000000000142,
00000000000000000000014c,
00000000000000000000014d,
- 000000000000000000000150,
- 000000000000000000000152,
+ 00000000000000000000014e,
+ 000000000000000000000151,
);
path = "${SOURCEDIR}/gui";
sourceTree = "";
diff --git a/flamerobin_flamerobin.vcxproj b/flamerobin_flamerobin.vcxproj
index 179f7b9b..54b84a55 100644
--- a/flamerobin_flamerobin.vcxproj
+++ b/flamerobin_flamerobin.vcxproj
@@ -1068,7 +1068,7 @@
-
+
@@ -1184,7 +1184,7 @@
-
+
diff --git a/flamerobin_flamerobin.vcxproj.filters b/flamerobin_flamerobin.vcxproj.filters
index d6e1b6c2..209c0833 100644
--- a/flamerobin_flamerobin.vcxproj.filters
+++ b/flamerobin_flamerobin.vcxproj.filters
@@ -357,7 +357,7 @@
Source Files
-
+
Source Files
@@ -704,7 +704,7 @@
Header Files
-
+
Header Files
diff --git a/makefile.bcc b/makefile.bcc
index 9ea9cd58..5485741c 100644
--- a/makefile.bcc
+++ b/makefile.bcc
@@ -130,13 +130,13 @@ FLAMEROBIN_OBJECTS = \
bccu$(R_OPT)$(D_OPT)\flamerobin_ReorderFieldsDialog.obj \
bccu$(R_OPT)$(D_OPT)\flamerobin_RestoreFrame.obj \
bccu$(R_OPT)$(D_OPT)\flamerobin_ServerRegistrationDialog.obj \
+ bccu$(R_OPT)$(D_OPT)\flamerobin_ServiceBaseFrame.obj \
bccu$(R_OPT)$(D_OPT)\flamerobin_ShutdownStartupBaseFrame.obj \
bccu$(R_OPT)$(D_OPT)\flamerobin_ShutdownFrame.obj \
bccu$(R_OPT)$(D_OPT)\flamerobin_SimpleHtmlFrame.obj \
bccu$(R_OPT)$(D_OPT)\flamerobin_StatementHistoryDialog.obj \
bccu$(R_OPT)$(D_OPT)\flamerobin_StartupFrame.obj \
bccu$(R_OPT)$(D_OPT)\flamerobin_StyleGuide.obj \
- bccu$(R_OPT)$(D_OPT)\flamerobin_ThreadBaseFrame.obj \
bccu$(R_OPT)$(D_OPT)\flamerobin_UserDialog.obj \
bccu$(R_OPT)$(D_OPT)\flamerobin_UsernamePasswordDialog.obj \
bccu$(R_OPT)$(D_OPT)\flamerobin_logger.obj \
@@ -473,6 +473,9 @@ bccu$(R_OPT)$(D_OPT)\flamerobin_RestoreFrame.obj: .\src\gui\RestoreFrame.cpp
bccu$(R_OPT)$(D_OPT)\flamerobin_ServerRegistrationDialog.obj: .\src\gui\ServerRegistrationDialog.cpp
$(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\ServerRegistrationDialog.cpp
+bccu$(R_OPT)$(D_OPT)\flamerobin_ServiceBaseFrame.obj: .\${SOURCEDIR}\gui\ServiceBaseFrame.cpp
+ $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\${SOURCEDIR}\gui\ServiceBaseFrame.cpp
+
bccu$(R_OPT)$(D_OPT)\flamerobin_ShutdownStartupBaseFrame.obj: .\${SOURCEDIR}\gui\ShutdownStartupBaseFrame.cpp
$(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\${SOURCEDIR}\gui\ShutdownStartupBaseFrame.cpp
@@ -491,9 +494,6 @@ bccu$(R_OPT)$(D_OPT)\flamerobin_StartupFrame.obj: .\${SOURCEDIR}\gui\StartupFram
bccu$(R_OPT)$(D_OPT)\flamerobin_StyleGuide.obj: .\src\gui\StyleGuide.cpp
$(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\StyleGuide.cpp
-bccu$(R_OPT)$(D_OPT)\flamerobin_ThreadBaseFrame.obj: .\${SOURCEDIR}\gui\ThreadBaseFrame.cpp
- $(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\${SOURCEDIR}\gui\ThreadBaseFrame.cpp
-
bccu$(R_OPT)$(D_OPT)\flamerobin_UserDialog.obj: .\src\gui\UserDialog.cpp
$(CXX) -q -c -P -o$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\UserDialog.cpp
diff --git a/makefile.gcc b/makefile.gcc
index fef5bfb4..0a693047 100644
--- a/makefile.gcc
+++ b/makefile.gcc
@@ -112,13 +112,13 @@ FLAMEROBIN_OBJECTS = \
gccu$(R_OPT)$(D_OPT)\flamerobin_ReorderFieldsDialog.o \
gccu$(R_OPT)$(D_OPT)\flamerobin_RestoreFrame.o \
gccu$(R_OPT)$(D_OPT)\flamerobin_ServerRegistrationDialog.o \
+ gccu$(R_OPT)$(D_OPT)\flamerobin_ServiceBaseFrame.o \
gccu$(R_OPT)$(D_OPT)\flamerobin_ShutdownStartupBaseFrame.o \
gccu$(R_OPT)$(D_OPT)\flamerobin_ShutdownFrame.o \
gccu$(R_OPT)$(D_OPT)\flamerobin_SimpleHtmlFrame.o \
gccu$(R_OPT)$(D_OPT)\flamerobin_StatementHistoryDialog.o \
gccu$(R_OPT)$(D_OPT)\flamerobin_StartupFrame.o \
gccu$(R_OPT)$(D_OPT)\flamerobin_StyleGuide.o \
- gccu$(R_OPT)$(D_OPT)\flamerobin_ThreadBaseFrame.o \
gccu$(R_OPT)$(D_OPT)\flamerobin_UserDialog.o \
gccu$(R_OPT)$(D_OPT)\flamerobin_UsernamePasswordDialog.o \
gccu$(R_OPT)$(D_OPT)\flamerobin_logger.o \
@@ -452,6 +452,9 @@ gccu$(R_OPT)$(D_OPT)\flamerobin_RestoreFrame.o: ./src/gui/RestoreFrame.cpp
gccu$(R_OPT)$(D_OPT)\flamerobin_ServerRegistrationDialog.o: ./src/gui/ServerRegistrationDialog.cpp
$(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $<
+gccu$(R_OPT)$(D_OPT)\flamerobin_ServiceBaseFrame.o: ./${SOURCEDIR}/gui/ServiceBaseFrame.cpp
+ $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $<
+
gccu$(R_OPT)$(D_OPT)\flamerobin_ShutdownStartupBaseFrame.o: ./${SOURCEDIR}/gui/ShutdownStartupBaseFrame.cpp
$(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $<
@@ -470,9 +473,6 @@ gccu$(R_OPT)$(D_OPT)\flamerobin_StartupFrame.o: ./${SOURCEDIR}/gui/StartupFrame.
gccu$(R_OPT)$(D_OPT)\flamerobin_StyleGuide.o: ./src/gui/StyleGuide.cpp
$(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $<
-gccu$(R_OPT)$(D_OPT)\flamerobin_ThreadBaseFrame.o: ./${SOURCEDIR}/gui/ThreadBaseFrame.cpp
- $(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $<
-
gccu$(R_OPT)$(D_OPT)\flamerobin_UserDialog.o: ./src/gui/UserDialog.cpp
$(CXX) -c -o $@ $(FLAMEROBIN_CXXFLAGS) $(CPPDEPS) $<
diff --git a/makefile.vc b/makefile.vc
index bca219b6..7f860618 100644
--- a/makefile.vc
+++ b/makefile.vc
@@ -128,13 +128,13 @@ FLAMEROBIN_OBJECTS = \
vcu$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_ReorderFieldsDialog.obj \
vcu$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_RestoreFrame.obj \
vcu$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_ServerRegistrationDialog.obj \
+ vcu$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_ServiceBaseFrame.obj \
vcu$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_ShutdownStartupBaseFrame.obj \
vcu$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_ShutdownFrame.obj \
vcu$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_SimpleHtmlFrame.obj \
vcu$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_StatementHistoryDialog.obj \
vcu$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_StartupFrame.obj \
vcu$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_StyleGuide.obj \
- vcu$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_ThreadBaseFrame.obj \
vcu$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_UserDialog.obj \
vcu$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_UsernamePasswordDialog.obj \
vcu$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_logger.obj \
@@ -545,6 +545,9 @@ vcu$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_RestoreFrame.obj: .\src\gui\Rest
vcu$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_ServerRegistrationDialog.obj: .\src\gui\ServerRegistrationDialog.cpp
$(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\ServerRegistrationDialog.cpp
+vcu$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_ServiceBaseFrame.obj: .\${SOURCEDIR}\gui\ServiceBaseFrame.cpp
+ $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\${SOURCEDIR}\gui\ServiceBaseFrame.cpp
+
vcu$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_ShutdownStartupBaseFrame.obj: .\${SOURCEDIR}\gui\ShutdownStartupBaseFrame.cpp
$(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\${SOURCEDIR}\gui\ShutdownStartupBaseFrame.cpp
@@ -563,9 +566,6 @@ vcu$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_StartupFrame.obj: .\${SOURCEDIR}
vcu$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_StyleGuide.obj: .\src\gui\StyleGuide.cpp
$(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\StyleGuide.cpp
-vcu$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_ThreadBaseFrame.obj: .\${SOURCEDIR}\gui\ThreadBaseFrame.cpp
- $(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\${SOURCEDIR}\gui\ThreadBaseFrame.cpp
-
vcu$(R_OPT)$(D_OPT)$(DIR_SUFFIX_CPU)\flamerobin_UserDialog.obj: .\src\gui\UserDialog.cpp
$(CXX) /c /nologo /TP /Fo$@ $(FLAMEROBIN_CXXFLAGS) .\src\gui\UserDialog.cpp
diff --git a/src/gui/BackupFrame.cpp b/src/gui/BackupFrame.cpp
index 27214e47..4412f16e 100644
--- a/src/gui/BackupFrame.cpp
+++ b/src/gui/BackupFrame.cpp
@@ -47,161 +47,7 @@
#include "gui/UsernamePasswordDialog.h"
#include "metadata/database.h"
#include "metadata/server.h"
-
-// worker thread class to perform database backup
-class BackupThread: public wxThread {
-public:
- BackupThread(BackupFrame* frame, wxString server,
- wxString username, wxString password, wxString rolename, wxString charset,
- wxString dbfilename, wxString bkfilename,
- IBPP::BRF flags, int interval, wxString skipData, wxString includeData,
- wxString cryptPluginName, wxString keyPlugin, wxString keyEncrypt
- );
-
- virtual void* Entry();
- virtual void OnExit();
-private:
- BackupFrame* frameM;
- wxString serverM;
- wxString usernameM;
- wxString passwordM;
- wxString rolenameM;
- wxString charsetM;
- wxString dbfileM;
- wxString bkfileM;
- IBPP::BRF brfM;
- wxString outputFileM;
- int factorM;
- int intervalM;
- wxString skipDataM;
- wxString includeDataM;
- wxString cryptPluginNameM;
- wxString keyPluginM;
- wxString keyEncryptM;
-
- void logError(wxString& msg);
- void logImportant(wxString& msg);
- void logProgress(wxString& msg);
-};
-
-BackupThread::BackupThread(BackupFrame* frame, wxString server,
- wxString username, wxString password, wxString rolename, wxString charset,
- wxString dbfilename, wxString bkfilename,
- IBPP::BRF flags, int interval,
- wxString skipData, wxString includeData, wxString cryptPluginName,
- wxString keyPlugin, wxString keyEncrypt)
- : wxThread()
-{
- frameM = frame;
- serverM = server;
- usernameM = username;
- passwordM = password;
- rolenameM = rolename;
- charsetM = charset;
- dbfileM = dbfilename;
- bkfileM = bkfilename;
- // always use verbose flag
- brfM = (IBPP::BRF)((int)flags | (int)IBPP::brVerbose);
-
- intervalM = interval;
- skipDataM = skipData;
- includeDataM = includeData;
- cryptPluginNameM = cryptPluginName;
- keyPluginM = keyPlugin;
- keyEncryptM = keyEncrypt;
-
-}
-
-void* BackupThread::Entry()
-{
- wxDateTime now;
- wxString msg;
-
- try
- {
- msg.Printf(_("Connecting to server %s..."), serverM.c_str());
- logImportant(msg);
- IBPP::Service svc = IBPP::ServiceFactory(wx2std(serverM),
- wx2std(usernameM), wx2std(passwordM), wx2std(rolenameM), wx2std(charsetM)
- );
- svc->Connect();
-
- now = wxDateTime::Now();
- msg.Printf(_("Database backup started %s"), now.FormatTime().c_str());
- logImportant(msg);
- svc->StartBackup(wx2std(dbfileM), wx2std(bkfileM), wx2std(outputFileM),
- factorM, brfM, wx2std(cryptPluginNameM), wx2std(keyPluginM),
- wx2std(keyEncryptM), wx2std(skipDataM), wx2std(includeDataM), intervalM
- );
- while (true)
- {
- if (TestDestroy())
- {
- now = wxDateTime::Now();
- msg.Printf(_("Database backup canceled %s"),
- now.FormatTime().c_str());
- logImportant(msg);
- break;
- }
- const char* c = svc->WaitMsg();
- if (c == 0)
- {
- now = wxDateTime::Now();
- msg.Printf(_("Database backup finished %s"),
- now.FormatTime().c_str());
- logImportant(msg);
- break;
- }
- msg = c;
- logProgress(msg);
- }
- svc->Disconnect();
- }
- catch (IBPP::Exception& e)
- {
- now = wxDateTime::Now();
- msg.Printf(_("Database backup canceled %s due to IBPP exception:\n\n"),
- now.FormatTime().c_str());
- msg += e.what();
- logError(msg);
- }
- catch (...)
- {
- now = wxDateTime::Now();
- msg.Printf(_("Database backup canceled %s due to exception"),
- now.FormatTime().c_str());
- logError(msg);
- }
- return 0;
-}
-
-void BackupThread::OnExit()
-{
- if (frameM != 0)
- {
- wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED,
- BackupRestoreBaseFrame::ID_thread_finished);
- wxPostEvent(frameM, event);
- }
-}
-
-void BackupThread::logError(wxString& msg)
-{
- if (frameM != 0)
- frameM->threadOutputMsg(msg, BackupRestoreBaseFrame::error_message);
-}
-
-void BackupThread::logImportant(wxString& msg)
-{
- if (frameM != 0)
- frameM->threadOutputMsg(msg, BackupRestoreBaseFrame::important_message);
-}
-
-void BackupThread::logProgress(wxString& msg)
-{
- if (frameM != 0)
- frameM->threadOutputMsg(msg, BackupRestoreBaseFrame::progress_message);
-}
+#include "ShutdownFrame.h"
BackupFrame::BackupFrame(wxWindow* parent, DatabasePtr db)
: BackupRestoreBaseFrame(parent, db)
@@ -474,7 +320,7 @@ void BackupFrame::OnStartButtonClick(wxCommandEvent& WXUNUSED(event))
startThread(std::make_unique(this,
server->getConnectionString(), username, password, rolename, charset,
database->getPath(), text_ctrl_filename->GetValue(),
- (IBPP::BRF)flags, spinctrl_showlogInterval->GetValue(),
+ (IBPP::BRF)flags, spinctrl_showlogInterval->GetValue(), spinctrl_parallelworkers->GetValue(),
textCtrl_skipdata->GetValue(), textCtrl_includedata->GetValue(),
textCtrl_crypt->GetValue(), textCtrl_keyholder->GetValue(), textCtrl_keyname->GetValue()
)
@@ -483,3 +329,24 @@ void BackupFrame::OnStartButtonClick(wxCommandEvent& WXUNUSED(event))
updateControls();
}
+BackupThread::BackupThread(BackupFrame* frame,
+ wxString server, wxString username, wxString password,
+ wxString rolename, wxString charset, wxString dbfilename,
+ wxString bkfilename, IBPP::BRF flags, int interval, int parallel,
+ wxString skipData, wxString includeData, wxString cryptPluginName,
+ wxString keyPlugin, wxString keyEncrypt)
+ :factorM(0),
+ BackupRestoreThread(frame, server, username, password,rolename, charset,
+ dbfilename,bkfilename, flags, interval, parallel, skipData, includeData, cryptPluginName,
+ keyPlugin, keyEncrypt)
+{
+}
+
+void BackupThread::Execute(IBPP::Service svc)
+{
+ svc->StartBackup(wx2std(dbfileM), wx2std(bkfileM), wx2std(outputFileM),
+ factorM, brfM, wx2std(cryptPluginNameM), wx2std(keyPluginM),
+ wx2std(keyEncryptM), wx2std(skipDataM), wx2std(includeDataM),
+ intervalM, parallelM
+ );
+}
diff --git a/src/gui/BackupFrame.h b/src/gui/BackupFrame.h
index 626bbd7a..3911e242 100644
--- a/src/gui/BackupFrame.h
+++ b/src/gui/BackupFrame.h
@@ -66,4 +66,21 @@ class BackupFrame: public BackupRestoreBaseFrame {
DECLARE_EVENT_TABLE()
};
+class BackupThread : public BackupRestoreThread
+{
+public:
+ BackupThread(BackupFrame* frame, wxString server,
+ wxString username, wxString password, wxString rolename, wxString charset,
+ wxString dbfilename, wxString bkfilename,
+ IBPP::BRF flags, int interval, int parallel,
+ wxString skipData, wxString includeData,
+ wxString cryptPluginName, wxString keyPlugin, wxString keyEncrypt
+ );
+protected:
+ virtual void Execute(IBPP::Service);
+
+ int factorM;
+
+};
#endif // BACKUPFRAME_H
+
diff --git a/src/gui/BackupRestoreBaseFrame.cpp b/src/gui/BackupRestoreBaseFrame.cpp
index 1650ceb6..6d467870 100644
--- a/src/gui/BackupRestoreBaseFrame.cpp
+++ b/src/gui/BackupRestoreBaseFrame.cpp
@@ -44,14 +44,8 @@
BackupRestoreBaseFrame::BackupRestoreBaseFrame(wxWindow* parent,
DatabasePtr db)
- : ThreadBaseFrame(parent, db)
+ : ServiceBaseFrame(parent, db)
{
- //wxASSERT(db);
- //db->attachObserver(this, false);
-
- //threadMsgTimeMillisM = 0;
- verboseMsgsM = true;
-
// create controls in constructor of descendant class (correct tab order)
panel_controls = 0;
checkbox_showlog = 0;
@@ -71,7 +65,7 @@ void BackupRestoreBaseFrame::cancelBackupRestore()
bool BackupRestoreBaseFrame::Destroy()
{
cancelBackupRestore();
- return ThreadBaseFrame::Destroy();
+ return ServiceBaseFrame::Destroy();
}
void BackupRestoreBaseFrame::doReadConfigSettings(const wxString& prefix)
@@ -80,50 +74,69 @@ void BackupRestoreBaseFrame::doReadConfigSettings(const wxString& prefix)
wxString strValue;
- bool boolValue = true;
+ bool boolValue;
int intValue;
+ strValue = "";
config().getValue(prefix + Config::pathSeparator + "backupfilename", strValue);
if (!strValue.empty())
text_ctrl_filename->SetValue(strValue);
+ boolValue = false;
config().getValue(prefix + Config::pathSeparator + "metadata", boolValue);
checkbox_metadata->SetValue(boolValue);
+ boolValue = false;
config().getValue(prefix + Config::pathSeparator + "verboselog", boolValue);
checkbox_showlog->SetValue(boolValue);
+ intValue = 0;
config().getValue(prefix + Config::pathSeparator + "verboselog_interval", intValue);
spinctrl_showlogInterval->SetValue(intValue);
+ strValue = "";
config().getValue(prefix + Config::pathSeparator + "cryptplugin_name", strValue);
if (!strValue.empty())
textCtrl_crypt->SetValue(strValue);
+
+ strValue = "";
config().getValue(prefix + Config::pathSeparator + "keyholder_name", strValue);
if (!strValue.empty())
textCtrl_keyholder->SetValue(strValue);
+
+ strValue = "";
config().getValue(prefix + Config::pathSeparator + "key_name", strValue);
if (!strValue.empty())
textCtrl_keyname->SetValue(strValue);
-
+ strValue = "";
config().getValue(prefix + Config::pathSeparator + "skipdata", strValue);
if (!strValue.empty())
textCtrl_skipdata->SetValue(strValue);
+
+ strValue = "";
config().getValue(prefix + Config::pathSeparator + "includedata", strValue);
if (!strValue.empty())
textCtrl_includedata->SetValue(strValue);
+ boolValue = false;
config().getValue(prefix + Config::pathSeparator + "static_time", boolValue);
checkbox_statictime->SetValue(boolValue);
+ boolValue = false;
config().getValue(prefix + Config::pathSeparator + "static_delta", boolValue);
checkbox_staticdelta->SetValue(boolValue);
+ boolValue = false;
config().getValue(prefix + Config::pathSeparator + "static_pageread", boolValue);
checkbox_staticpageread->SetValue(boolValue);
+ boolValue = false;
config().getValue(prefix + Config::pathSeparator + "static_pagewrite", boolValue);
checkbox_staticpagewrite->SetValue(boolValue);
+ intValue = 0;
+ config().getValue(prefix + Config::pathSeparator + "parallel_workers", intValue);
+ spinctrl_parallelworkers->SetValue(intValue);
+
}
void BackupRestoreBaseFrame::doWriteConfigSettings(const wxString& prefix) const
@@ -161,6 +174,10 @@ void BackupRestoreBaseFrame::doWriteConfigSettings(const wxString& prefix) const
checkbox_staticpageread->GetValue());
config().setValue(prefix + Config::pathSeparator + "static_pagewrite",
checkbox_staticpagewrite->GetValue());
+
+ config().setValue(prefix + Config::pathSeparator + "parallel_workers",
+ spinctrl_parallelworkers->GetValue());
+
}
@@ -173,7 +190,7 @@ const wxString BackupRestoreBaseFrame::getStorageName() const
void BackupRestoreBaseFrame::createControls()
{
- ThreadBaseFrame::createControls();
+ ServiceBaseFrame::createControls();
label_filename = new wxStaticText(panel_controls, wxID_ANY,
_("Backup file:"));
@@ -204,11 +221,13 @@ void BackupRestoreBaseFrame::createControls()
checkbox_staticpageread = new wxCheckBox(panel_controls, wxID_ANY, _("Page reads"));
checkbox_staticpagewrite = new wxCheckBox(panel_controls, wxID_ANY, _("Page writes"));
+ spinctrl_parallelworkers = new wxSpinCtrl(panel_controls, ID_spinctrl_parallelworkers);
+ spinctrl_parallelworkers->SetRange(0, 32767);
}
void BackupRestoreBaseFrame::layoutControls()
{
- ThreadBaseFrame::layoutControls();
+ ServiceBaseFrame::layoutControls();
int wh = text_ctrl_filename->GetMinHeight();
button_browse->SetSize(wh, wh);
@@ -226,14 +245,12 @@ void BackupRestoreBaseFrame::layoutControls()
{
- wxGridSizer* gsizer = new wxGridSizer(1, 3,
+ wxGridSizer* gsizer = new wxGridSizer(1, 4,
styleguide().getCheckboxSpacing(),
styleguide().getUnrelatedControlMargin(wxHORIZONTAL));
gsizer->Add(checkbox_metadata, 0, wxEXPAND);
- //gsizer->Add(0, 0, wxEXPAND);
gsizer->Add(checkbox_showlog, 0, wxEXPAND);
-
{
wxBoxSizer* sizer = new wxBoxSizer(wxHORIZONTAL);
sizer->Add(new wxStaticText(panel_controls, wxID_ANY,
@@ -242,7 +259,15 @@ void BackupRestoreBaseFrame::layoutControls()
sizer->Add(spinctrl_showlogInterval, 1, wxALIGN_CENTER_VERTICAL);
gsizer->Add(sizer);
- //sizerGeneralOptions->Add(0, styleguide().getRelatedControlMargin(wxVERTICAL));
+ }
+ {
+ wxBoxSizer* sizer = new wxBoxSizer(wxHORIZONTAL);
+ sizer->Add(new wxStaticText(panel_controls, wxID_ANY,
+ _("Parallel (FB3.0+)")), 0, wxALIGN_CENTER_VERTICAL);
+ sizer->Add(styleguide().getControlLabelMargin(), 0);
+ sizer->Add(spinctrl_parallelworkers, 1, wxALIGN_CENTER_VERTICAL);
+
+ gsizer->Add(sizer);
}
sizerGeneralOptions->Add(gsizer);
@@ -363,7 +388,7 @@ void BackupRestoreBaseFrame::updateControls()
// empty implementation to allow this to be called from update()
// which could happen in the constructor, when descendant isn't
// completely initialized yet
- ThreadBaseFrame::updateControls();
+ ServiceBaseFrame::updateControls();
bool running = getThreadRunning();
@@ -386,13 +411,13 @@ void BackupRestoreBaseFrame::updateControls()
checkbox_staticdelta->Enable(!running);
checkbox_staticpageread->Enable(!running);
checkbox_staticpagewrite->Enable(!running);
+
+ spinctrl_parallelworkers->Enable(!running);
}
//! event handlers
-BEGIN_EVENT_TABLE(BackupRestoreBaseFrame, ThreadBaseFrame)
+BEGIN_EVENT_TABLE(BackupRestoreBaseFrame, ServiceBaseFrame)
EVT_CHECKBOX(BackupRestoreBaseFrame::ID_checkbox_showlog, BackupRestoreBaseFrame::OnVerboseLogChange)
- EVT_MENU(BackupRestoreBaseFrame::ID_thread_finished, BackupRestoreBaseFrame::OnThreadFinished)
- EVT_MENU(BackupRestoreBaseFrame::ID_thread_output, BackupRestoreBaseFrame::OnThreadOutput)
EVT_TEXT(BackupRestoreBaseFrame::ID_text_ctrl_filename, BackupRestoreBaseFrame::OnSettingsChange)
END_EVENT_TABLE()
@@ -408,3 +433,19 @@ void BackupRestoreBaseFrame::OnVerboseLogChange(wxCommandEvent& WXUNUSED(event))
updateMessages(0, msgsM.GetCount());
}
+
+BackupRestoreThread::BackupRestoreThread(BackupRestoreBaseFrame* frame,
+ wxString server, wxString username, wxString password,
+ wxString rolename, wxString charset, wxString dbfilename,
+ wxString bkfilename, IBPP::BRF flags, int interval, int parallel,
+ wxString skipData, wxString includeData, wxString cryptPluginName,
+ wxString keyPlugin, wxString keyEncrypt)
+ :
+ dbfileM(dbfilename), bkfileM(bkfilename), intervalM(interval), parallelM(parallel),
+ skipDataM(skipData), includeDataM(includeData),
+ cryptPluginNameM(cryptPluginName), keyPluginM(keyPlugin), keyEncryptM(keyEncrypt),
+ ServiceThread(frame, server, username, password, rolename, charset)
+{
+ // always use verbose flag
+ brfM = (IBPP::BRF)((int)flags | (int)IBPP::brVerbose);
+}
diff --git a/src/gui/BackupRestoreBaseFrame.h b/src/gui/BackupRestoreBaseFrame.h
index 8d21b1b9..b21a1997 100644
--- a/src/gui/BackupRestoreBaseFrame.h
+++ b/src/gui/BackupRestoreBaseFrame.h
@@ -33,14 +33,14 @@
#include
#include "core/Observer.h"
-#include "gui/ThreadBaseFrame.h"
+#include "gui/ServiceBaseFrame.h"
#include "metadata/database.h"
#include "metadata/MetadataClasses.h"
class FileTextControl;
class LogTextControl;
-class BackupRestoreBaseFrame: public ThreadBaseFrame//, public Observer
+class BackupRestoreBaseFrame: public ServiceBaseFrame//, public Observer
{
public:
@@ -71,12 +71,11 @@ class BackupRestoreBaseFrame: public ThreadBaseFrame//, public Observer
ID_text_ctrl_filename = 101,
ID_checkbox_showlog,
ID_spinctrl_showlogInterval,
-
ID_button_browse,
- ID_button_showlog
+ ID_button_showlog,
+ ID_spinctrl_parallelworkers
+
- //ID_text_ctrl_log,
- //ID_button_start
};
wxStaticText* label_filename;
@@ -103,6 +102,7 @@ class BackupRestoreBaseFrame: public ThreadBaseFrame//, public Observer
wxCheckBox* checkbox_staticpageread;
wxCheckBox* checkbox_staticpagewrite;
+ wxSpinCtrl* spinctrl_parallelworkers;
private:
@@ -112,4 +112,29 @@ class BackupRestoreBaseFrame: public ThreadBaseFrame//, public Observer
DECLARE_EVENT_TABLE()
};
+class BackupRestoreThread : public ServiceThread
+{
+public:
+ BackupRestoreThread(BackupRestoreBaseFrame* frame, wxString server,
+ wxString username, wxString password, wxString rolename, wxString charset,
+ wxString dbfilename, wxString bkfilename,
+ IBPP::BRF flags, int interval, int parallel,
+ wxString skipData, wxString includeData,
+ wxString cryptPluginName, wxString keyPlugin, wxString keyEncrypt
+ );
+protected:
+ wxString bkfileM;
+ wxString dbfileM;
+ wxString outputFileM;
+ wxString skipDataM;
+ wxString includeDataM;
+ wxString cryptPluginNameM;
+ wxString keyPluginM;
+ wxString keyEncryptM;
+
+ int intervalM;
+ int parallelM;
+ IBPP::BRF brfM;
+};
+
#endif // BACKUPRESTOREBASEFRAME_H
diff --git a/src/gui/RestoreFrame.cpp b/src/gui/RestoreFrame.cpp
index 987a594d..59928b96 100644
--- a/src/gui/RestoreFrame.cpp
+++ b/src/gui/RestoreFrame.cpp
@@ -47,164 +47,6 @@
#include "gui/UsernamePasswordDialog.h"
#include "metadata/database.h"
#include "metadata/server.h"
-
-// worker thread class to perform database restore
-class RestoreThread: public wxThread {
-public:
- RestoreThread(RestoreFrame* frame, wxString server,
- wxString username, wxString password, wxString rolename, wxString charset,
- wxString bkfilename, wxString dbfilename,
- int pagesize, IBPP::BRF flags, int interval, wxString skipData, wxString includeData,
- wxString cryptPluginName, wxString keyPlugin, wxString keyEncrypt
- );
- virtual void* Entry();
- virtual void OnExit();
-private:
- RestoreFrame* frameM;
- wxString serverM;
- wxString usernameM;
- wxString passwordM;
- wxString rolenameM;
- wxString charsetM;
- wxString bkfileM;
- wxString dbfileM;
- int pagesizeM;
- IBPP::BRF brfM;
-
- wxString outputFileM;
- int intervalM;
- wxString skipDataM;
- wxString includeDataM;
- wxString cryptPluginNameM;
- wxString keyPluginM;
- wxString keyEncryptM;
-
- void logError(wxString& msg);
- void logImportant(wxString& msg);
- void logProgress(wxString& msg);
-};
-
-RestoreThread::RestoreThread(RestoreFrame* frame, wxString server,
- wxString username, wxString password, wxString rolename, wxString charset,
- wxString bkfilename, wxString dbfilename,
- int pagesize, IBPP::BRF flags, int interval, wxString skipData, wxString includeData,
- wxString cryptPluginName, wxString keyPlugin, wxString keyEncrypt)
- : wxThread()
-{
- frameM = frame;
- serverM = server;
- usernameM = username;
- passwordM = password;
- rolenameM = rolename;
- charsetM = charset;
-
- bkfileM = bkfilename;
- dbfileM = dbfilename;
- pagesizeM = pagesize;
- // always use verbose flag
- brfM = (IBPP::BRF)((int)flags | (int)IBPP::brVerbose);
- wxString outputFileM;
- intervalM = interval;
- skipDataM = skipData;
- includeDataM = includeData;
- cryptPluginNameM = cryptPluginName;
- keyPluginM = keyPlugin;
- keyEncryptM = keyEncrypt;
-
-}
-
-void* RestoreThread::Entry()
-{
- wxDateTime now;
- wxString msg;
-
- try
- {
- msg.Printf(_("Connecting to server %s..."), serverM.c_str());
- logImportant(msg);
- IBPP::Service svc = IBPP::ServiceFactory(wx2std(serverM),
- wx2std(usernameM), wx2std(passwordM), wx2std(rolenameM), wx2std(charsetM)
- );
- svc->Connect();
-
- now = wxDateTime::Now();
- msg.Printf(_("Database restore started %s"), now.FormatTime().c_str());
- logImportant(msg);
- svc->StartRestore(wx2std(bkfileM), wx2std(dbfileM), wx2std(outputFileM),
- pagesizeM, 0, brfM,
- wx2std(cryptPluginNameM), wx2std(keyPluginM),
- wx2std(keyEncryptM), wx2std(skipDataM), wx2std(includeDataM), intervalM
- );
- while (true)
- {
- if (TestDestroy())
- {
- now = wxDateTime::Now();
- msg.Printf(_("Database restore canceled %s"),
- now.FormatTime().c_str());
- logImportant(msg);
- break;
- }
- const char* c = svc->WaitMsg();
- if (c == 0)
- {
- now = wxDateTime::Now();
- msg.Printf(_("Database restore finished %s"),
- now.FormatTime().c_str());
- logImportant(msg);
- break;
- }
- msg = c;
- logProgress(msg);
- }
- svc->Disconnect();
- }
- catch (IBPP::Exception& e)
- {
- now = wxDateTime::Now();
- msg.Printf(_("Database restore canceled %s due to IBPP exception:\n\n"),
- now.FormatTime().c_str());
- msg += e.what();
- logError(msg);
- }
- catch (...)
- {
- now = wxDateTime::Now();
- msg.Printf(_("Database restore canceled %s due to exception"),
- now.FormatTime().c_str());
- logError(msg);
- }
- return 0;
-}
-
-void RestoreThread::OnExit()
-{
- if (frameM != 0)
- {
- wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED,
- BackupRestoreBaseFrame::ID_thread_finished);
- wxPostEvent(frameM, event);
- }
-}
-
-void RestoreThread::logError(wxString& msg)
-{
- if (frameM != 0)
- frameM->threadOutputMsg(msg, BackupRestoreBaseFrame::error_message);
-}
-
-void RestoreThread::logImportant(wxString& msg)
-{
- if (frameM != 0)
- frameM->threadOutputMsg(msg, BackupRestoreBaseFrame::important_message);
-}
-
-void RestoreThread::logProgress(wxString& msg)
-{
- if (frameM != 0)
- frameM->threadOutputMsg(msg, BackupRestoreBaseFrame::progress_message);
-}
-
RestoreFrame::RestoreFrame(wxWindow* parent, DatabasePtr db)
: BackupRestoreBaseFrame(parent, db)
{
@@ -269,6 +111,9 @@ void RestoreFrame::createControls()
wxDefaultPosition, wxDefaultSize,
sizeof(pagesize_choices) / sizeof(wxString), pagesize_choices);
+ spinctrl_pagebuffers = new wxSpinCtrl(panel_controls, wxID_ANY);
+ spinctrl_pagebuffers->SetRange(0, 2147483646);
+
}
void RestoreFrame::layoutControls()
@@ -300,6 +145,18 @@ void RestoreFrame::layoutControls()
sizerCombo->Add(label_pagesize, 0, wxALIGN_CENTER_VERTICAL);
sizerCombo->Add(styleguide().getControlLabelMargin(), 0);
sizerCombo->Add(choice_pagesize, 1, wxEXPAND);
+ sizerCombo->Add(styleguide().getRelatedControlMargin(wxHORIZONTAL), 0);
+ {
+ wxBoxSizer* sizer = new wxBoxSizer(wxHORIZONTAL);
+ sizer->Add(new wxStaticText(panel_controls, wxID_ANY,
+ _("Page buffers")), 0, wxALIGN_CENTER_VERTICAL);
+ sizer->Add(styleguide().getControlLabelMargin(), 0);
+ sizer->Add(spinctrl_pagebuffers, 1, wxALIGN_CENTER_VERTICAL);
+
+ sizerCombo->Add(sizer);
+ }
+
+
wxBoxSizer* sizerPanelV = new wxBoxSizer(wxVERTICAL);
@@ -351,6 +208,7 @@ void RestoreFrame::updateControls()
checkbox_fix_fss_data->Enable(!running);
checkbox_fix_fss_metadata->Enable(!running);
checkbox_readonlyDB->Enable(!running);
+ spinctrl_pagebuffers->Enable(!running);
//radiobox_replicamode->Enable(!running);
@@ -395,6 +253,11 @@ void RestoreFrame::doReadConfigSettings(const wxString& prefix)
checkbox_readonlyDB->SetValue(
flags.end() != std::find(flags.begin(), flags.end(), "readonlyDB"));
}
+
+ int intValue = 0;
+ config().getValue(prefix + Config::pathSeparator + "page_buffers", intValue);
+ spinctrl_pagebuffers->SetValue(intValue);
+
updateControls();
}
@@ -426,6 +289,10 @@ void RestoreFrame::doWriteConfigSettings(const wxString& prefix) const
flags.push_back("readonlyDB");
config().setValue(prefix + Config::pathSeparator + "options", flags);
+
+ config().setValue(prefix + Config::pathSeparator + "page_buffers",
+ spinctrl_pagebuffers->GetValue());
+
}
const wxString RestoreFrame::getName() const
@@ -540,12 +407,35 @@ void RestoreFrame::OnStartButtonClick(wxCommandEvent& WXUNUSED(event))
startThread(std::make_unique(this,
server->getConnectionString(), username, password, rolename, charset,
- text_ctrl_filename->GetValue(), database->getPath(), pagesize,
- (IBPP::BRF)flags,
- spinctrl_showlogInterval->GetValue(),
+ text_ctrl_filename->GetValue(), database->getPath(), pagesize, spinctrl_pagebuffers->GetValue(),
+ (IBPP::BRF)flags, spinctrl_showlogInterval->GetValue(), spinctrl_parallelworkers->GetValue(),
textCtrl_skipdata->GetValue(), textCtrl_includedata->GetValue(),
textCtrl_crypt->GetValue(), textCtrl_keyholder->GetValue(), textCtrl_keyname->GetValue()
)
);
updateControls();
}
+
+RestoreThread::RestoreThread(RestoreFrame* frame, wxString
+ server, wxString username, wxString password, wxString
+ rolename, wxString charset, wxString bkfilename, wxString dbfilename,
+ int pagesize, int pagebuffers, IBPP::BRF flags, int interval, int parallel,
+ wxString skipData, wxString includeData, wxString cryptPluginName, wxString keyPlugin,
+ wxString keyEncrypt)
+ :pagesizeM(pagesize), pagebuffersM(pagebuffers),
+ BackupRestoreThread(frame, server, username, password, rolename, charset,
+ dbfilename, bkfilename, flags, interval, parallel, skipData, includeData, cryptPluginName,
+ keyPlugin, keyEncrypt)
+
+{
+}
+
+void RestoreThread::Execute(IBPP::Service svc)
+{
+ svc->StartRestore(wx2std(bkfileM), wx2std(dbfileM), wx2std(outputFileM),
+ pagesizeM, pagebuffersM, brfM,
+ wx2std(cryptPluginNameM), wx2std(keyPluginM),
+ wx2std(keyEncryptM), wx2std(skipDataM), wx2std(includeDataM),
+ intervalM, parallelM
+ );
+}
diff --git a/src/gui/RestoreFrame.h b/src/gui/RestoreFrame.h
index 64a81f5b..16b191c9 100644
--- a/src/gui/RestoreFrame.h
+++ b/src/gui/RestoreFrame.h
@@ -50,6 +50,8 @@ class RestoreFrame: public BackupRestoreBaseFrame {
wxRadioBox* radiobox_replicamode;
+ wxSpinCtrl* spinctrl_pagebuffers;
+
void createControls();
void layoutControls();
virtual void updateControls();
@@ -71,4 +73,22 @@ class RestoreFrame: public BackupRestoreBaseFrame {
DECLARE_EVENT_TABLE()
};
+
+class RestoreThread : public BackupRestoreThread
+{
+public:
+ RestoreThread(RestoreFrame* frame, wxString server,
+ wxString username, wxString password, wxString rolename, wxString charset,
+ wxString bkfilename, wxString dbfilename,
+ int pagesize, int pagebuffers, IBPP::BRF flags, int interval, int parallel,
+ wxString skipData, wxString includeData,
+ wxString cryptPluginName, wxString keyPlugin, wxString keyEncrypt
+ );
+protected:
+ virtual void Execute(IBPP::Service);
+
+ int pagesizeM;
+ int pagebuffersM;
+
+};
#endif // RESTOREFRAME_H
diff --git a/src/gui/ThreadBaseFrame.cpp b/src/gui/ServiceBaseFrame.cpp
similarity index 62%
rename from src/gui/ThreadBaseFrame.cpp
rename to src/gui/ServiceBaseFrame.cpp
index ccc73f47..dab8e55e 100644
--- a/src/gui/ThreadBaseFrame.cpp
+++ b/src/gui/ServiceBaseFrame.cpp
@@ -33,16 +33,19 @@
#include
#include
+#include
+
#include "config/Config.h"
#include "core/ArtProvider.h"
-#include "gui/ThreadBaseFrame.h"
+#include "core/StringUtils.h"
+#include "gui/ServiceBaseFrame.h"
#include "gui/controls/DndTextControls.h"
#include "gui/controls/LogTextControl.h"
#include "gui/StyleGuide.h"
#include "metadata/database.h"
#include "metadata/server.h"
-ThreadBaseFrame::ThreadBaseFrame(wxWindow* parent,
+ServiceBaseFrame::ServiceBaseFrame(wxWindow* parent,
DatabasePtr db)
: BaseFrame(parent, wxID_ANY, wxEmptyString), databaseM(db), threadM(0)
{
@@ -57,7 +60,7 @@ ThreadBaseFrame::ThreadBaseFrame(wxWindow* parent,
}
//! implementation details
-void ThreadBaseFrame::addThreadMsg(const wxString msg,
+void ServiceBaseFrame::addThreadMsg(const wxString msg,
bool& notificationNeeded)
{
notificationNeeded = false;
@@ -74,7 +77,7 @@ void ThreadBaseFrame::addThreadMsg(const wxString msg,
}
}
-void ThreadBaseFrame::cancelThread()
+void ServiceBaseFrame::cancelThread()
{
if (threadM != 0)
{
@@ -83,39 +86,39 @@ void ThreadBaseFrame::cancelThread()
}
}
-void ThreadBaseFrame::clearLog()
+void ServiceBaseFrame::clearLog()
{
msgKindsM.Clear();
msgsM.Clear();
text_ctrl_log->ClearAll();
}
-bool ThreadBaseFrame::Destroy()
+bool ServiceBaseFrame::Destroy()
{
cancelThread();
return BaseFrame::Destroy();
}
-DatabasePtr ThreadBaseFrame::getDatabase() const
+DatabasePtr ServiceBaseFrame::getDatabase() const
{
return databaseM.lock();
}
-bool ThreadBaseFrame::getThreadRunning() const
+bool ServiceBaseFrame::getThreadRunning() const
{
return threadM != 0;
}
-void ThreadBaseFrame::subjectRemoved(Subject* subject)
+void ServiceBaseFrame::subjectRemoved(Subject* subject)
{
DatabasePtr db = getDatabase();
if (!db || !db->isConnected() || subject == db.get())
Close();
}
-bool ThreadBaseFrame::startThread(std::unique_ptr thread)
+bool ServiceBaseFrame::startThread(std::unique_ptr thread)
{
wxASSERT(threadM == 0);
if (wxTHREAD_NO_ERROR != thread->Create())
@@ -134,7 +137,7 @@ bool ThreadBaseFrame::startThread(std::unique_ptr thread)
return true;
}
-void ThreadBaseFrame::threadOutputMsg(const wxString msg, MsgKind kind)
+void ServiceBaseFrame::threadOutputMsg(const wxString msg, MsgKind kind)
{
wxString s(msg);
switch (kind)
@@ -161,7 +164,7 @@ void ThreadBaseFrame::threadOutputMsg(const wxString msg, MsgKind kind)
}
}
-void ThreadBaseFrame::createControls()
+void ServiceBaseFrame::createControls()
{
panel_controls = new wxPanel(this, wxID_ANY, wxDefaultPosition,
wxDefaultSize, wxTAB_TRAVERSAL | wxCLIP_CHILDREN);
@@ -173,7 +176,7 @@ void ThreadBaseFrame::createControls()
}
-void ThreadBaseFrame::layoutControls()
+void ServiceBaseFrame::layoutControls()
{
sizerButtons = new wxBoxSizer(wxHORIZONTAL);
@@ -190,7 +193,7 @@ void ThreadBaseFrame::layoutControls()
}
-void ThreadBaseFrame::update()
+void ServiceBaseFrame::update()
{
DatabasePtr db = getDatabase();
if (db)
@@ -199,14 +202,14 @@ void ThreadBaseFrame::update()
Close();
}
-void ThreadBaseFrame::updateControls()
+void ServiceBaseFrame::updateControls()
{
bool running = getThreadRunning();
button_start->Enable(!running);
}
-void ThreadBaseFrame::updateMessages(size_t firstmsg, size_t lastmsg)
+void ServiceBaseFrame::updateMessages(size_t firstmsg, size_t lastmsg)
{
if (lastmsg > msgsM.GetCount())
lastmsg = msgsM.GetCount();
@@ -230,25 +233,25 @@ void ThreadBaseFrame::updateMessages(size_t firstmsg, size_t lastmsg)
//! event handlers
-BEGIN_EVENT_TABLE(ThreadBaseFrame, BaseFrame)
- EVT_MENU(ThreadBaseFrame::ID_thread_finished, ThreadBaseFrame::OnThreadFinished)
- EVT_MENU(ThreadBaseFrame::ID_thread_output, ThreadBaseFrame::OnThreadOutput)
+BEGIN_EVENT_TABLE(ServiceBaseFrame, BaseFrame)
+ EVT_MENU(ServiceBaseFrame::ID_thread_finished, ServiceBaseFrame::OnThreadFinished)
+ EVT_MENU(ServiceBaseFrame::ID_thread_output, ServiceBaseFrame::OnThreadOutput)
END_EVENT_TABLE()
-void ThreadBaseFrame::OnSettingsChange(wxCommandEvent& WXUNUSED(event))
+void ServiceBaseFrame::OnSettingsChange(wxCommandEvent& WXUNUSED(event))
{
if (IsShown())
updateControls();
}
-void ThreadBaseFrame::OnThreadFinished(wxCommandEvent& event)
+void ServiceBaseFrame::OnThreadFinished(wxCommandEvent& event)
{
threadM = 0;
OnThreadOutput(event);
updateControls();
}
-void ThreadBaseFrame::OnThreadOutput(wxCommandEvent& WXUNUSED(event))
+void ServiceBaseFrame::OnThreadOutput(wxCommandEvent& WXUNUSED(event))
{
wxCriticalSectionLocker locker(critsectM);
threadMsgTimeMillisM = ::wxGetLocalTimeMillis();
@@ -281,4 +284,103 @@ void ThreadBaseFrame::OnThreadOutput(wxCommandEvent& WXUNUSED(event))
updateMessages(first, msgsM.GetCount());
}
+ServiceThread::ServiceThread(ServiceBaseFrame* frame, wxString server,
+ wxString username, wxString password, wxString rolename,
+ wxString charset) :
+ frameM(frame), serverM(server), usernameM(username), passwordM(password),
+ rolenameM(rolename), charsetM(charset),
+ wxThread()
+
+{
+}
+
+void* ServiceThread::Entry()
+{
+ wxDateTime now;
+ wxString msg;
+
+ try
+ {
+ msg.Printf(_("Connecting to server %s..."), serverM.c_str());
+ logImportant(msg);
+ IBPP::Service svc = IBPP::ServiceFactory(wx2std(serverM),
+ wx2std(usernameM), wx2std(passwordM), wx2std(rolenameM), wx2std(charsetM)
+ );
+ svc->Connect();
+
+ now = wxDateTime::Now();
+ msg.Printf(_("Database restore started %s"), now.FormatTime().c_str());
+ logImportant(msg);
+ Execute(svc);
+ while (true)
+ {
+ if (TestDestroy())
+ {
+ now = wxDateTime::Now();
+ msg.Printf(_("Database restore canceled %s"),
+ now.FormatTime().c_str());
+ logImportant(msg);
+ break;
+ }
+ const char* c = svc->WaitMsg();
+ if (c == 0)
+ {
+ now = wxDateTime::Now();
+ msg.Printf(_("Database restore finished %s"),
+ now.FormatTime().c_str());
+ logImportant(msg);
+ break;
+ }
+ msg = c;
+ logProgress(msg);
+ }
+ svc->Disconnect();
+ }
+ catch (IBPP::Exception& e)
+ {
+ now = wxDateTime::Now();
+ msg.Printf(_("Database restore canceled %s due to IBPP exception:\n\n"),
+ now.FormatTime().c_str());
+ msg += e.what();
+ logError(msg);
+ }
+ catch (...)
+ {
+ now = wxDateTime::Now();
+ msg.Printf(_("Database restore canceled %s due to exception"),
+ now.FormatTime().c_str());
+ logError(msg);
+ }
+ return 0;
+}
+
+void ServiceThread::OnExit()
+{
+ if (frameM != 0)
+ {
+ wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED,
+ ServiceBaseFrame::ID_thread_finished);
+ wxPostEvent(frameM, event);
+ }
+
+}
+
+void ServiceThread::logError(wxString& msg)
+{
+ if (frameM != 0)
+ frameM->threadOutputMsg(msg, ServiceBaseFrame::error_message);
+}
+
+void ServiceThread::logImportant(wxString& msg)
+{
+ if (frameM != 0)
+ frameM->threadOutputMsg(msg, ServiceBaseFrame::important_message);
+}
+
+void ServiceThread::logProgress(wxString& msg)
+{
+ if (frameM != 0)
+ frameM->threadOutputMsg(msg, ServiceBaseFrame::progress_message);
+
+}
diff --git a/src/gui/ThreadBaseFrame.h b/src/gui/ServiceBaseFrame.h
similarity index 78%
rename from src/gui/ThreadBaseFrame.h
rename to src/gui/ServiceBaseFrame.h
index 3f9e4049..46d7811b 100644
--- a/src/gui/ThreadBaseFrame.h
+++ b/src/gui/ServiceBaseFrame.h
@@ -22,8 +22,8 @@
*/
-#ifndef THREADBASEFRAME_H
-#define THREADBASEFRAME_H
+#ifndef SERVICEBASEFRAME_H
+#define SERVICEBASEFRAME_H
#include
#include
@@ -38,8 +38,9 @@
class FileTextControl;
class LogTextControl;
-class ThreadBaseFrame: public BaseFrame, public Observer
+class ServiceBaseFrame: public BaseFrame, public Observer
{
+ friend class ServiceThread;
public:
enum MsgKind {
progress_message,
@@ -82,7 +83,7 @@ class ThreadBaseFrame: public BaseFrame, public Observer
void updateMessages(size_t firstmsg, size_t lastmsg);
- ThreadBaseFrame(wxWindow* parent, DatabasePtr db);
+ ServiceBaseFrame(wxWindow* parent, DatabasePtr db);
private:
DatabaseWeakPtr databaseM;
wxThread* threadM;
@@ -116,4 +117,30 @@ class ThreadBaseFrame: public BaseFrame, public Observer
DECLARE_EVENT_TABLE()
};
-#endif // THREADBASEFRAME_H
+
+class ServiceThread : public wxThread {
+public:
+ ServiceThread(ServiceBaseFrame* frame, wxString server,
+ wxString username, wxString password, wxString rolename,
+ wxString charset
+ );
+
+ virtual void* Entry();
+ virtual void OnExit();
+
+protected:
+ virtual void Execute(IBPP::Service ) = 0;
+private:
+ ServiceBaseFrame* frameM;
+ wxString serverM;
+ wxString usernameM;
+ wxString passwordM;
+ wxString rolenameM;
+ wxString charsetM;
+
+ void logError(wxString& msg);
+ void logImportant(wxString& msg);
+ void logProgress(wxString& msg);
+};
+
+#endif // SERVICEBASEFRAME_H
diff --git a/src/gui/ShutdownFrame.cpp b/src/gui/ShutdownFrame.cpp
index 52b2256f..80dac598 100644
--- a/src/gui/ShutdownFrame.cpp
+++ b/src/gui/ShutdownFrame.cpp
@@ -46,138 +46,6 @@
#include "gui/UsernamePasswordDialog.h"
#include "metadata/database.h"
#include "metadata/server.h"
-
-// worker thread class to perform database Shutdown
-class ShutdownThread: public wxThread {
-public:
- ShutdownThread(ShutdownFrame* frame, wxString server,
- wxString username, wxString password, wxString rolename, wxString charset,
- wxString dbfilename, IBPP::DSM flags,
- int timeout);
-
- virtual void* Entry();
- virtual void OnExit();
-private:
- ShutdownFrame* frameM;
- wxString serverM;
- wxString usernameM;
- wxString passwordM;
- wxString rolenameM;
- wxString charsetM;
- wxString dbfileM;
- IBPP::DSM dsmM;
- int timeoutM;
- void logError(wxString& msg);
- void logImportant(wxString& msg);
- void logProgress(wxString& msg);
-};
-
-ShutdownThread::ShutdownThread(ShutdownFrame* frame, wxString server,
- wxString username, wxString password, wxString rolename, wxString charset,
- wxString dbfilename,
- IBPP::DSM flags, int timeout)
- : wxThread()
-{
- frameM = frame;
- serverM = server;
- usernameM = username;
- passwordM = password;
- rolenameM = rolename;
- charsetM = charset;
- dbfileM = dbfilename;
- // always use verbose flag
- dsmM = (IBPP::DSM)((int)flags | (int)IBPP::brVerbose);
- timeoutM = timeout;
-}
-
-void* ShutdownThread::Entry()
-{
- wxDateTime now;
- wxString msg;
-
- try
- {
- msg.Printf(_("Connecting to server %s..."), serverM.c_str());
- logImportant(msg);
- IBPP::Service svc = IBPP::ServiceFactory(wx2std(serverM),
- wx2std(usernameM), wx2std(passwordM), wx2std(rolenameM), wx2std(charsetM)
- );
- svc->Connect();
-
- now = wxDateTime::Now();
- msg.Printf(_("Database Shutdown started %s"), now.FormatTime().c_str());
- logImportant(msg);
- svc->Shutdown(wx2std(dbfileM), dsmM, timeoutM);
- while (true)
- {
- if (TestDestroy())
- {
- now = wxDateTime::Now();
- msg.Printf(_("Database Shutdown canceled %s"),
- now.FormatTime().c_str());
- logImportant(msg);
- break;
- }
- const char* c = svc->WaitMsg();
- if (c == 0)
- {
- now = wxDateTime::Now();
- msg.Printf(_("Database Shutdown finished %s"),
- now.FormatTime().c_str());
- logImportant(msg);
- break;
- }
- msg = c;
- logProgress(msg);
- }
- svc->Disconnect();
- }
- catch (IBPP::Exception& e)
- {
- now = wxDateTime::Now();
- msg.Printf(_("Database Shutdown canceled %s due to IBPP exception:\n\n"),
- now.FormatTime().c_str());
- msg += e.what();
- logError(msg);
- }
- catch (...)
- {
- now = wxDateTime::Now();
- msg.Printf(_("Database Shutdown canceled %s due to exception"),
- now.FormatTime().c_str());
- logError(msg);
- }
- return 0;
-}
-
-void ShutdownThread::OnExit()
-{
- if (frameM != 0)
- {
- wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED,
- ShutdownStartupBaseFrame::ID_thread_finished);
- wxPostEvent(frameM, event);
- }
-}
-
-void ShutdownThread::logError(wxString& msg)
-{
- if (frameM != 0)
- frameM->threadOutputMsg(msg, ShutdownStartupBaseFrame::error_message);
-}
-
-void ShutdownThread::logImportant(wxString& msg)
-{
- if (frameM != 0)
- frameM->threadOutputMsg(msg, ShutdownStartupBaseFrame::important_message);
-}
-
-void ShutdownThread::logProgress(wxString& msg)
-{
- if (frameM != 0)
- frameM->threadOutputMsg(msg, ShutdownStartupBaseFrame::progress_message);
-}
-
ShutdownFrame::ShutdownFrame(wxWindow* parent, DatabasePtr db)
: ShutdownStartupBaseFrame(parent, db)
{
@@ -373,3 +241,17 @@ void ShutdownFrame::OnStartButtonClick(wxCommandEvent& WXUNUSED(event))
updateControls();
}
+ShutdownThread::ShutdownThread(ShutdownFrame* frame,
+ wxString server, wxString username, wxString password,
+ wxString rolename, wxString charset, wxString dbfilename,
+ IBPP::DSM flags, int timeout)
+ :timeoutM(timeout),
+ ShutdownStartupThread(frame, server, username, password,
+ rolename, charset, dbfilename, flags)
+{
+}
+
+void ShutdownThread::Execute(IBPP::Service svc)
+{
+ svc->Shutdown(wx2std(dbfileM), dsmM, timeoutM);
+}
diff --git a/src/gui/ShutdownFrame.h b/src/gui/ShutdownFrame.h
index ee2de553..ade9b3a7 100644
--- a/src/gui/ShutdownFrame.h
+++ b/src/gui/ShutdownFrame.h
@@ -62,4 +62,18 @@ class ShutdownFrame: public ShutdownStartupBaseFrame {
DECLARE_EVENT_TABLE()
};
+
+class ShutdownThread : public ShutdownStartupThread
+{
+public:
+ ShutdownThread(ShutdownFrame* frame, wxString server,
+ wxString username, wxString password, wxString rolename, wxString charset,
+ wxString dbfilename, IBPP::DSM flags, int timeout);
+protected:
+ virtual void Execute(IBPP::Service);
+ int timeoutM;
+
+
+
+};
#endif // FR_SHUTDOWNFRAME_H
diff --git a/src/gui/ShutdownStartupBaseFrame.cpp b/src/gui/ShutdownStartupBaseFrame.cpp
index 675d1399..38121894 100644
--- a/src/gui/ShutdownStartupBaseFrame.cpp
+++ b/src/gui/ShutdownStartupBaseFrame.cpp
@@ -43,7 +43,7 @@
ShutdownStartupBaseFrame::ShutdownStartupBaseFrame(wxWindow* parent,
DatabasePtr db)
- : ThreadBaseFrame(parent, db)
+ : ServiceBaseFrame(parent, db)
{
verboseMsgsM = true;
@@ -62,7 +62,7 @@ void ShutdownStartupBaseFrame::cancelShutdownStartup()
bool ShutdownStartupBaseFrame::Destroy()
{
cancelShutdownStartup();
- return ThreadBaseFrame::Destroy();
+ return ServiceBaseFrame::Destroy();
}
void ShutdownStartupBaseFrame::doReadConfigSettings(const wxString& prefix)
@@ -93,7 +93,7 @@ const wxString ShutdownStartupBaseFrame::getStorageName() const
void ShutdownStartupBaseFrame::createControls()
{
- ThreadBaseFrame::createControls();
+ ServiceBaseFrame::createControls();
wxArrayString choices;
choices.Add("normal");
@@ -108,7 +108,7 @@ void ShutdownStartupBaseFrame::createControls()
void ShutdownStartupBaseFrame::layoutControls()
{
- ThreadBaseFrame::layoutControls();
+ ServiceBaseFrame::layoutControls();
}
void ShutdownStartupBaseFrame::subjectRemoved(Subject* subject)
@@ -141,7 +141,6 @@ IBPP::DSM ShutdownStartupBaseFrame::getDatabaseMode()
case 2 :
return IBPP::dsMulti;
break;
-
case 3 :
return IBPP::dsFull;
break;
@@ -152,7 +151,7 @@ IBPP::DSM ShutdownStartupBaseFrame::getDatabaseMode()
void ShutdownStartupBaseFrame::updateControls()
{
- ThreadBaseFrame::updateControls();
+ ServiceBaseFrame::updateControls();
bool running = getThreadRunning();
@@ -161,7 +160,7 @@ void ShutdownStartupBaseFrame::updateControls()
}
//! event handlers
-BEGIN_EVENT_TABLE(ShutdownStartupBaseFrame, ThreadBaseFrame)
+BEGIN_EVENT_TABLE(ShutdownStartupBaseFrame, ServiceBaseFrame)
EVT_MENU(ShutdownStartupBaseFrame::ID_thread_finished, ShutdownStartupBaseFrame::OnThreadFinished)
EVT_MENU(ShutdownStartupBaseFrame::ID_thread_output, ShutdownStartupBaseFrame::OnThreadOutput)
END_EVENT_TABLE()
@@ -178,3 +177,11 @@ void ShutdownStartupBaseFrame::OnVerboseLogChange(wxCommandEvent& WXUNUSED(event
updateMessages(0, msgsM.GetCount());
}
+ShutdownStartupThread::ShutdownStartupThread(ShutdownStartupBaseFrame* frame,
+ wxString server, wxString username, wxString password, wxString rolename,
+ wxString charset, wxString dbfilename, IBPP::DSM flags)
+ :dbfileM(dbfilename),
+ ServiceThread(frame, server, username, password, rolename, charset)
+{
+ dsmM = (IBPP::DSM)((int)flags | (int)IBPP::brVerbose);
+}
diff --git a/src/gui/ShutdownStartupBaseFrame.h b/src/gui/ShutdownStartupBaseFrame.h
index 8afaf108..feb01801 100644
--- a/src/gui/ShutdownStartupBaseFrame.h
+++ b/src/gui/ShutdownStartupBaseFrame.h
@@ -31,14 +31,11 @@
#include
#include "core/Observer.h"
-#include "gui/ThreadBaseFrame.h"
+#include "gui/ServiceBaseFrame.h"
#include "metadata/database.h"
#include "metadata/MetadataClasses.h"
-class FileTextControl;
-class LogTextControl;
-
-class ShutdownStartupBaseFrame: public ThreadBaseFrame//, public Observer
+class ShutdownStartupBaseFrame: public ServiceBaseFrame
{
public:
@@ -80,4 +77,16 @@ class ShutdownStartupBaseFrame: public ThreadBaseFrame//, public Observer
DECLARE_EVENT_TABLE()
};
+class ShutdownStartupThread : public ServiceThread
+{
+public:
+ ShutdownStartupThread(ShutdownStartupBaseFrame* frame, wxString server,
+ wxString username, wxString password, wxString rolename, wxString charset,
+ wxString dbfilename, IBPP::DSM flags
+ );
+protected:
+ wxString dbfileM;
+ IBPP::DSM dsmM;
+};
+
#endif // FR_SHUTDOWNSTARTUPBASEFRAME_H
diff --git a/src/gui/StartupFrame.cpp b/src/gui/StartupFrame.cpp
index d06a6543..7591ac44 100644
--- a/src/gui/StartupFrame.cpp
+++ b/src/gui/StartupFrame.cpp
@@ -47,134 +47,6 @@
#include "metadata/database.h"
#include "metadata/server.h"
-// worker thread class to perform database Start
-class StartupThread: public wxThread {
-public:
- StartupThread(StartupFrame* frame, wxString server,
- wxString username, wxString password, wxString rolename, wxString charset,
- wxString dbfilename, IBPP::DSM flags);
-
- virtual void* Entry();
- virtual void OnExit();
-private:
- StartupFrame* frameM;
- wxString serverM;
- wxString usernameM;
- wxString passwordM;
- wxString rolenameM;
- wxString charsetM;
- wxString dbfileM;
- IBPP::DSM dsmM;
- void logError(wxString& msg);
- void logImportant(wxString& msg);
- void logProgress(wxString& msg);
-};
-
-StartupThread::StartupThread(StartupFrame* frame, wxString server,
- wxString username, wxString password, wxString rolename, wxString charset,
- wxString dbfilename,
- IBPP::DSM flags)
- : wxThread()
-{
- frameM = frame;
- serverM = server;
- usernameM = username;
- passwordM = password;
- rolenameM = rolename;
- charsetM = charset;
- dbfileM = dbfilename;
- // always use verbose flag
- dsmM = (IBPP::DSM)((int)flags | (int)IBPP::brVerbose);
-}
-
-void* StartupThread::Entry()
-{
- wxDateTime now;
- wxString msg;
-
- try
- {
- msg.Printf(_("Connecting to server %s..."), serverM.c_str());
- logImportant(msg);
- IBPP::Service svc = IBPP::ServiceFactory(wx2std(serverM),
- wx2std(usernameM), wx2std(passwordM), wx2std(rolenameM), wx2std(charsetM)
- );
- svc->Connect();
-
- now = wxDateTime::Now();
- msg.Printf(_("Database startup started %s"), now.FormatTime().c_str());
- logImportant(msg);
- svc->Restart(wx2std(dbfileM), dsmM);
- while (true)
- {
- if (TestDestroy())
- {
- now = wxDateTime::Now();
- msg.Printf(_("Database startup canceled %s"),
- now.FormatTime().c_str());
- logImportant(msg);
- break;
- }
- const char* c = svc->WaitMsg();
- if (c == 0)
- {
- now = wxDateTime::Now();
- msg.Printf(_("Database startup finished %s"),
- now.FormatTime().c_str());
- logImportant(msg);
- break;
- }
- msg = c;
- logProgress(msg);
- }
- svc->Disconnect();
- }
- catch (IBPP::Exception& e)
- {
- now = wxDateTime::Now();
- msg.Printf(_("Database startup canceled %s due to IBPP exception:\n\n"),
- now.FormatTime().c_str());
- msg += e.what();
- logError(msg);
- }
- catch (...)
- {
- now = wxDateTime::Now();
- msg.Printf(_("Database startup canceled %s due to exception"),
- now.FormatTime().c_str());
- logError(msg);
- }
- return 0;
-}
-
-void StartupThread::OnExit()
-{
- if (frameM != 0)
- {
- wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED,
- ShutdownStartupBaseFrame::ID_thread_finished);
- wxPostEvent(frameM, event);
- }
-}
-
-void StartupThread::logError(wxString& msg)
-{
- if (frameM != 0)
- frameM->threadOutputMsg(msg, ShutdownStartupBaseFrame::error_message);
-}
-
-void StartupThread::logImportant(wxString& msg)
-{
- if (frameM != 0)
- frameM->threadOutputMsg(msg, ShutdownStartupBaseFrame::important_message);
-}
-
-void StartupThread::logProgress(wxString& msg)
-{
- if (frameM != 0)
- frameM->threadOutputMsg(msg, ShutdownStartupBaseFrame::progress_message);
-}
-
StartupFrame::StartupFrame(wxWindow* parent, DatabasePtr db)
: ShutdownStartupBaseFrame(parent, db)
{
@@ -312,3 +184,16 @@ void StartupFrame::OnStartButtonClick(wxCommandEvent& WXUNUSED(event))
updateControls();
}
+StartupThread::StartupThread(StartupFrame* frame,
+ wxString server, wxString username, wxString password,
+ wxString rolename, wxString charset, wxString
+ dbfilename, IBPP::DSM flags)
+ :ShutdownStartupThread(frame, server, username, password,
+ rolename, charset, dbfilename, flags)
+{
+}
+
+void StartupThread::Execute(IBPP::Service svc)
+{
+ svc->Restart(wx2std(dbfileM), dsmM);
+}
diff --git a/src/gui/StartupFrame.h b/src/gui/StartupFrame.h
index cccc54ae..4c850623 100644
--- a/src/gui/StartupFrame.h
+++ b/src/gui/StartupFrame.h
@@ -56,4 +56,17 @@ class StartupFrame: public ShutdownStartupBaseFrame {
DECLARE_EVENT_TABLE()
};
+
+class StartupThread : public ShutdownStartupThread
+{
+public:
+ StartupThread(StartupFrame* frame, wxString server,
+ wxString username, wxString password, wxString rolename, wxString charset,
+ wxString dbfilename, IBPP::DSM flags);
+protected:
+ virtual void Execute(IBPP::Service);
+
+
+};
+
#endif // FR_STARTUPFRAME_H
diff --git a/src/ibpp/_ibpp.h b/src/ibpp/_ibpp.h
index 8dcdacf8..bb6c770d 100644
--- a/src/ibpp/_ibpp.h
+++ b/src/ibpp/_ibpp.h
@@ -809,17 +809,17 @@ class ServiceImpl : public IBPP::IService
void StartBackup(
const std::string& dbfile, const std::string& bkfile, const std::string& outfile = "",
- const int factor = 0,
- IBPP::BRF flags = IBPP::BRF(0),
+ const int factor = 0, IBPP::BRF flags = IBPP::BRF(0),
const std::string& cryptName = "", const std::string& keyHolder = "", const std::string& keyName = "",
- const std::string& skipData = "", const std::string& includeData = "", const int verboseInteval = 0
+ const std::string& skipData = "", const std::string& includeData = "", const int verboseInteval = 0,
+ const int parallelWorkers = 0
);
void StartRestore(
const std::string& bkfile, const std::string& dbfile, const std::string& outfile = "",
- int pagesize = 0, int buffers = 0,
- IBPP::BRF flags = IBPP::BRF(0),
+ int pagesize = 0, int buffers = 0, IBPP::BRF flags = IBPP::BRF(0),
const std::string& cryptName = "", const std::string& keyHolder = "", const std::string& keyName = "",
- const std::string& skipData = "", const std::string& includeData = "", const int verboseInteval = 0
+ const std::string& skipData = "", const std::string& includeData = "", const int verboseInteval = 0,
+ const int parallelWorkers = 0
);
const char* WaitMsg();
diff --git a/src/ibpp/ibpp.h b/src/ibpp/ibpp.h
index 7deae178..0f732e0b 100644
--- a/src/ibpp/ibpp.h
+++ b/src/ibpp/ibpp.h
@@ -638,18 +638,18 @@ namespace IBPP
virtual void StartBackup(
const std::string& dbfile,const std::string& bkfile, const std::string& outfile = "",
- const int factor = 0,
- BRF flags = BRF(0),
+ const int factor = 0, BRF flags = BRF(0),
const std::string& cryptName = "", const std::string& keyHolder="", const std::string& keyName="",
- const std::string& skipData = "", const std::string& includeData = "", const int verboseInteval = 0
+ const std::string& skipData = "", const std::string& includeData = "", const int verboseInteval = 0,
+ const int parallelWorkers = 0
) = 0;
virtual void StartRestore(
const std::string& bkfile, const std::string& dbfile, const std::string& outfile = "",
- int pagesize = 0, int buffers = 0,
- BRF flags = BRF(0),
+ int pagesize = 0, int buffers = 0, BRF flags = BRF(0),
const std::string & cryptName = "", const std::string & keyHolder = "", const std::string & keyName = "",
- const std::string & skipData = "", const std::string & includeData = "", const int verboseInteval = 0
+ const std::string & skipData = "", const std::string & includeData = "", const int verboseInteval = 0,
+ const int parallelWorkers = 0
) = 0;
virtual const char* WaitMsg() = 0; // With reporting (does not block)
diff --git a/src/ibpp/service.cpp b/src/ibpp/service.cpp
index 260a1745..f109ba26 100644
--- a/src/ibpp/service.cpp
+++ b/src/ibpp/service.cpp
@@ -601,10 +601,11 @@ void ServiceImpl::Repair(const std::string& dbfile, IBPP::RPF flags)
void ServiceImpl::StartBackup(
const std::string& dbfile, const std::string& bkfile, const std::string& outfile,
- const int factor,
- IBPP::BRF flags,
+ const int factor, IBPP::BRF flags,
const std::string& cryptName, const std::string& keyHolder, const std::string& keyName,
- const std::string& skipData, const std::string& includeData, const int verboseInteval)
+ const std::string& skipData, const std::string& includeData, const int verboseInteval,
+ const int parallelWorkers
+ )
{
if (mHandle == 0)
throw LogicExceptionImpl("Service::Backup", _("Service is not connected."));
@@ -637,6 +638,9 @@ void ServiceImpl::StartBackup(
if (!includeData.empty() && versionIsHigherOrEqualTo(4, 0))
spb.InsertString(isc_spb_bkp_include_data, 2, includeData.c_str());
+ if (parallelWorkers > 0 && versionIsHigherOrEqualTo(3, 0))
+ spb.InsertQuad(isc_spb_bkp_parallel_workers, parallelWorkers);
+
if (versionIsHigherOrEqualTo(4, 0)) {
if (!cryptName.empty())
spb.InsertString(isc_spb_bkp_crypt, 2, cryptName.c_str());
@@ -685,11 +689,11 @@ void ServiceImpl::StartBackup(
void ServiceImpl::StartRestore(
const std::string& bkfile, const std::string& dbfile, const std::string& outfile,
- int pagesize, int buffers,
- IBPP::BRF flags,
+ int pagesize, int buffers, IBPP::BRF flags,
const std::string& cryptName, const std::string& keyHolder, const std::string& keyName,
- const std::string& skipData, const std::string& includeData, const int verboseInteval
-)
+ const std::string& skipData, const std::string& includeData, const int verboseInteval,
+ const int parallelWorkers
+ )
{
if (mHandle == 0)
throw LogicExceptionImpl("Service::Restore", _("Service is not connected."));
@@ -719,6 +723,8 @@ void ServiceImpl::StartRestore(
if (buffers > 0)
spb.InsertQuad(isc_spb_res_buffers, buffers);
+ if (parallelWorkers > 0 && versionIsHigherOrEqualTo(3, 0))
+ spb.InsertQuad(isc_spb_bkp_parallel_workers, parallelWorkers);
if (!skipData.empty() && versionIsHigherOrEqualTo(3, 0))
spb.InsertString(isc_spb_res_skip_data, 2, skipData.c_str());