summaryrefslogtreecommitdiff
authoreilers <eilers>2004-10-26 11:18:23 (UTC)
committer eilers <eilers>2004-10-26 11:18:23 (UTC)
commit8d8b23bff18b8afd42840ef1d4574ef3ea9f8cee (patch) (unidiff)
tree04505b36b73f00bcd31666d30bc7cd80883729e6
parentcd3245ade209b4672ab5c51003aa66b5908c67a1 (diff)
downloadopie-8d8b23bff18b8afd42840ef1d4574ef3ea9f8cee.zip
opie-8d8b23bff18b8afd42840ef1d4574ef3ea9f8cee.tar.gz
opie-8d8b23bff18b8afd42840ef1d4574ef3ea9f8cee.tar.bz2
Protect against error in database format. Recover to old if database was
unreadable ..
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/tools/pimconverter/converter.cpp22
1 files changed, 18 insertions, 4 deletions
diff --git a/noncore/tools/pimconverter/converter.cpp b/noncore/tools/pimconverter/converter.cpp
index e8bd475..d92f382 100644
--- a/noncore/tools/pimconverter/converter.cpp
+++ b/noncore/tools/pimconverter/converter.cpp
@@ -60,283 +60,297 @@ void Converter::start_conversion(){
60 60
61 odebug << "SourceFormat: " << m_selectedSourceFormat << oendl; 61 odebug << "SourceFormat: " << m_selectedSourceFormat << oendl;
62 odebug << "DestFormat: " << m_selectedDestFormat << oendl; 62 odebug << "DestFormat: " << m_selectedDestFormat << oendl;
63 if ( m_selectedSourceFormat == m_selectedDestFormat ){ 63 if ( m_selectedSourceFormat == m_selectedDestFormat ){
64 64
65 QMessageBox::warning( this, tr("PimConverter"), 65 QMessageBox::warning( this, tr("PimConverter"),
66 tr( "<qt>It is not a good idea to use" 66 tr( "<qt>It is not a good idea to use"
67 "the same source and destformat !</qt>")); 67 "the same source and destformat !</qt>"));
68 return; 68 return;
69 } 69 }
70 70
71 switch( m_selectedSourceFormat ){ 71 switch( m_selectedSourceFormat ){
72 case XML: 72 case XML:
73 odebug << "XMLSourceDB = " << m_selectedDatabase << "" << oendl; 73 odebug << "XMLSourceDB = " << m_selectedDatabase << "" << oendl;
74 switch( m_selectedDatabase ){ 74 switch( m_selectedDatabase ){
75 case ADDRESSBOOK:{ 75 case ADDRESSBOOK:{
76 sourceDB = OPimAccessFactory<OPimContactAccess>::create( OPimGlobal::CONTACTLIST, OPimGlobal::XML, "converter" ); 76 sourceDB = OPimAccessFactory<OPimContactAccess>::create( OPimGlobal::CONTACTLIST, OPimGlobal::XML, "converter" );
77 } 77 }
78 break; 78 break;
79 case TODOLIST:{ 79 case TODOLIST:{
80 sourceDB = OPimAccessFactory<OPimTodoAccess>::create( OPimGlobal::TODOLIST, OPimGlobal::XML, "converter" ); 80 sourceDB = OPimAccessFactory<OPimTodoAccess>::create( OPimGlobal::TODOLIST, OPimGlobal::XML, "converter" );
81 }break; 81 }break;
82 case DATEBOOK:{ 82 case DATEBOOK:{
83 sourceDB = OPimAccessFactory<ODateBookAccess>::create( OPimGlobal::DATEBOOK, OPimGlobal::XML, "converter" ); 83 sourceDB = OPimAccessFactory<ODateBookAccess>::create( OPimGlobal::DATEBOOK, OPimGlobal::XML, "converter" );
84 } 84 }
85 break; 85 break;
86 default: 86 default:
87 owarn << "Unknown database selected (" << m_selectedDatabase << ")" << oendl; 87 owarn << "Unknown database selected (" << m_selectedDatabase << ")" << oendl;
88 return; 88 return;
89 } 89 }
90 break; 90 break;
91 case SQL: 91 case SQL:
92 odebug << "SQLSourceDB = " << m_selectedDatabase << "" << oendl; 92 odebug << "SQLSourceDB = " << m_selectedDatabase << "" << oendl;
93 switch( m_selectedDatabase ){ 93 switch( m_selectedDatabase ){
94 case ADDRESSBOOK:{ 94 case ADDRESSBOOK:{
95 sourceDB = OPimAccessFactory<OPimContactAccess>::create( OPimGlobal::CONTACTLIST, OPimGlobal::SQL, "converter" ); 95 sourceDB = OPimAccessFactory<OPimContactAccess>::create( OPimGlobal::CONTACTLIST, OPimGlobal::SQL, "converter" );
96 } 96 }
97 break; 97 break;
98 case TODOLIST:{ 98 case TODOLIST:{
99 sourceDB = OPimAccessFactory<OPimTodoAccess>::create( OPimGlobal::TODOLIST, OPimGlobal::SQL, "converter" ); 99 sourceDB = OPimAccessFactory<OPimTodoAccess>::create( OPimGlobal::TODOLIST, OPimGlobal::SQL, "converter" );
100 }break; 100 }break;
101 case DATEBOOK:{ 101 case DATEBOOK:{
102 sourceDB = OPimAccessFactory<ODateBookAccess>::create( OPimGlobal::DATEBOOK, OPimGlobal::SQL, "converter" ); 102 sourceDB = OPimAccessFactory<ODateBookAccess>::create( OPimGlobal::DATEBOOK, OPimGlobal::SQL, "converter" );
103 } 103 }
104 break; 104 break;
105 default: 105 default:
106 owarn << "Unknown database selected (" << m_selectedDatabase << ")" << oendl; 106 owarn << "Unknown database selected (" << m_selectedDatabase << ")" << oendl;
107 return; 107 return;
108 } 108 }
109 break; 109 break;
110 default: 110 default:
111 owarn << "Unknown source format selected (" << m_selectedSourceFormat << ") !!" << oendl; 111 owarn << "Unknown source format selected (" << m_selectedSourceFormat << ") !!" << oendl;
112 return; 112 return;
113 } 113 }
114 114
115 switch ( m_selectedDestFormat ){ 115 switch ( m_selectedDestFormat ){
116 case XML: 116 case XML:
117 odebug << "XMLDestDB = " << m_selectedDatabase << "" << oendl; 117 odebug << "XMLDestDB = " << m_selectedDatabase << "" << oendl;
118 switch( m_selectedDatabase ){ 118 switch( m_selectedDatabase ){
119 case ADDRESSBOOK:{ 119 case ADDRESSBOOK:{
120 destDB = OPimAccessFactory<OPimContactAccess>::create( OPimGlobal::CONTACTLIST, OPimGlobal::XML, "converter" ); 120 destDB = OPimAccessFactory<OPimContactAccess>::create( OPimGlobal::CONTACTLIST, OPimGlobal::XML, "converter" );
121 } 121 }
122 break; 122 break;
123 case TODOLIST:{ 123 case TODOLIST:{
124 destDB = OPimAccessFactory<OPimTodoAccess>::create( OPimGlobal::TODOLIST, OPimGlobal::XML, "converter" ); 124 destDB = OPimAccessFactory<OPimTodoAccess>::create( OPimGlobal::TODOLIST, OPimGlobal::XML, "converter" );
125 }break; 125 }break;
126 case DATEBOOK:{ 126 case DATEBOOK:{
127 destDB = OPimAccessFactory<ODateBookAccess>::create( OPimGlobal::DATEBOOK, OPimGlobal::XML, "converter" ); 127 destDB = OPimAccessFactory<ODateBookAccess>::create( OPimGlobal::DATEBOOK, OPimGlobal::XML, "converter" );
128 } 128 }
129 break; 129 break;
130 default: 130 default:
131 owarn << "Unknown database selected (" << m_selectedDatabase << ")" << oendl; 131 owarn << "Unknown database selected (" << m_selectedDatabase << ")" << oendl;
132 return; 132 return;
133 } 133 }
134 break; 134 break;
135 case SQL: 135 case SQL:
136 odebug << "SQLDestDB = " << m_selectedDatabase << "" << oendl; 136 odebug << "SQLDestDB = " << m_selectedDatabase << "" << oendl;
137 switch( m_selectedDatabase ){ 137 switch( m_selectedDatabase ){
138 case ADDRESSBOOK:{ 138 case ADDRESSBOOK:{
139 destDB = OPimAccessFactory<OPimContactAccess>::create( OPimGlobal::CONTACTLIST, OPimGlobal::SQL, "converter" ); 139 destDB = OPimAccessFactory<OPimContactAccess>::create( OPimGlobal::CONTACTLIST, OPimGlobal::SQL, "converter" );
140 } 140 }
141 break; 141 break;
142 case TODOLIST:{ 142 case TODOLIST:{
143 destDB = OPimAccessFactory<OPimTodoAccess>::create( OPimGlobal::TODOLIST, OPimGlobal::SQL, "converter" ); 143 destDB = OPimAccessFactory<OPimTodoAccess>::create( OPimGlobal::TODOLIST, OPimGlobal::SQL, "converter" );
144 }break; 144 }break;
145 case DATEBOOK:{ 145 case DATEBOOK:{
146 destDB = OPimAccessFactory<ODateBookAccess>::create( OPimGlobal::DATEBOOK, OPimGlobal::SQL, "converter" ); 146 destDB = OPimAccessFactory<ODateBookAccess>::create( OPimGlobal::DATEBOOK, OPimGlobal::SQL, "converter" );
147 } 147 }
148 break; 148 break;
149 default: 149 default:
150 owarn << "Unknown database selected (" << m_selectedDatabase << ")" << oendl; 150 owarn << "Unknown database selected (" << m_selectedDatabase << ")" << oendl;
151 return; 151 return;
152 } 152 }
153 break; 153 break;
154 default: 154 default:
155 owarn << "Unknown destination format selected (" << m_selectedDestFormat << ")!!" << oendl; 155 owarn << "Unknown destination format selected (" << m_selectedDestFormat << ")!!" << oendl;
156 return; 156 return;
157 } 157 }
158 158
159 if ( !sourceDB || !destDB ) 159 if ( !sourceDB || !destDB )
160 return; 160 return;
161 161
162 m_criticalState = true; 162 m_criticalState = true;
163 163
164 sourceDB -> load(); 164 sourceDB -> load();
165 destDB -> load(); 165 destDB -> load();
166 166
167 QTime t; 167 QTime t;
168 t.start(); 168 t.start();
169 169
170 // Clean the dest-database if requested (isChecked) 170 // Clean the dest-database if requested (isChecked)
171 if ( m_eraseDB -> isChecked() ){ 171 if ( m_eraseDB -> isChecked() ){
172 odebug << "Clearing destination database!" << oendl; 172 odebug << "Clearing destination database!" << oendl;
173 destDB -> clear(); 173 destDB -> clear();
174 } 174 }
175 175
176 // Now transmit every pim-item from the source database to the destination -database 176 // Now transmit every pim-item from the source database to the destination -database
177 QArray<int> uidList = sourceDB->records(); 177 QArray<int> uidList = sourceDB->records();
178 odebug << "Try to move data for addressbook.. (" << uidList.count() << " items) " << oendl; 178 odebug << "Try to move data for addressbook.. (" << uidList.count() << " items) " << oendl;
179 m_progressBar->setTotalSteps( uidList.count() ); 179 m_progressBar->setTotalSteps( uidList.count() );
180 int count = 0; 180 int count = 0;
181 for ( uint i = 0; i < uidList.count(); ++i ){ 181 for ( uint i = 0; i < uidList.count(); ++i ){
182 odebug << "Adding uid: " << uidList[i] << "" << oendl; 182 odebug << "Adding uid: " << uidList[i] << "" << oendl;
183 OPimRecord* rec = sourceDB -> record( uidList[i] ); 183 OPimRecord* rec = sourceDB -> record( uidList[i] );
184 destDB -> add( rec ); 184 destDB -> add( rec );
185 m_progressBar->setProgress( ++count ); 185 m_progressBar->setProgress( ++count );
186 } 186 }
187 187
188 // Now commit data.. 188 // Now commit data..
189 destDB -> save(); 189 destDB -> save();
190 190
191 m_criticalState = false; 191 m_criticalState = false;
192 192
193 // Delete the frontends. Backends will be deleted automatically, too ! 193 // Delete the frontends. Backends will be deleted automatically, too !
194 // We have to cast them back to delete them properly ! 194 // We have to cast them back to delete them properly !
195 switch( m_selectedDatabase ){ 195 switch( m_selectedDatabase ){
196 case ADDRESSBOOK: 196 case ADDRESSBOOK:
197 delete static_cast<OPimContactAccess*> (sourceDB); 197 delete static_cast<OPimContactAccess*> (sourceDB);
198 delete static_cast<OPimContactAccess*> (destDB); 198 delete static_cast<OPimContactAccess*> (destDB);
199 break; 199 break;
200 case TODOLIST: 200 case TODOLIST:
201 delete static_cast<OPimTodoAccess*> (sourceDB); 201 delete static_cast<OPimTodoAccess*> (sourceDB);
202 delete static_cast<OPimTodoAccess*> (destDB); 202 delete static_cast<OPimTodoAccess*> (destDB);
203 break; 203 break;
204 case DATEBOOK: 204 case DATEBOOK:
205 delete static_cast<ODateBookAccess*> (sourceDB); 205 delete static_cast<ODateBookAccess*> (sourceDB);
206 delete static_cast<ODateBookAccess*> (destDB); 206 delete static_cast<ODateBookAccess*> (destDB);
207 break; 207 break;
208 default: 208 default:
209 owarn << "Unknown database selected (" << m_selectedDatabase << ")" << oendl; 209 owarn << "Unknown database selected (" << m_selectedDatabase << ")" << oendl;
210 return; 210 return;
211 } 211 }
212 212
213 213
214 owarn << "Conversion is finished and needed " << t.elapsed() << " ms !" << oendl; 214 owarn << "Conversion is finished and needed " << t.elapsed() << " ms !" << oendl;
215} 215}
216 216
217void Converter::closeEvent( QCloseEvent *e ) 217void Converter::closeEvent( QCloseEvent *e )
218{ 218{
219 219
220 /* Due to the fact that we don't have multitasking here, this 220 /* Due to the fact that we don't have multitasking here, this
221 * critical handling don't make sense, but the future.. 221 * critical handling don't make sense, but the future..
222 */ 222 */
223 if ( m_criticalState ){ 223 if ( m_criticalState ){
224 e->ignore(); 224 e->ignore();
225 return; 225 return;
226 } 226 }
227 e->accept(); 227 e->accept();
228} 228}
229 229
230bool Converter::sqliteMoveAndConvert( const QString& name, const QString& src, const QString &dest ) 230bool Converter::sqliteMoveAndConvert( const QString& name, const QString& src, const QString &dest )
231{ 231{
232 232
233 QMessageBox::information( this, tr( "Pim-Converter" ), 233 QMessageBox::information( this, tr( "Pim-Converter" ),
234 tr( "<qt>Starting to convert the database for %1</qt>" ).arg( name ) ); 234 tr( "<qt>Starting to convert the database for %1</qt>" ).arg( name ) );
235 235
236 236
237 bool error = false; 237 bool error = false;
238 QString cmd; 238 QString cmd;
239 if (!QFile::exists( src ) ) { 239 if (!QFile::exists( src ) ) {
240 cmd = tr( "No SQLite2 database could be found!" ); 240 cmd = tr( "No SQLite2 database could be found!" );
241 error = true; 241 error = true;
242 } 242 }
243 243
244 if( QFile::exists( dest ) ) { 244 if( QFile::exists( dest ) ) {
245 cmd = tr( "The database is already converted!" ); 245 cmd = tr( "The database is already converted!" );
246 error = true; 246 error = true;
247 } 247 }
248 248
249 249
250 if ( error ){ 250 if ( error ){
251 QMessageBox::critical( this, tr("Pim-Converter"), 251 QMessageBox::critical( this, tr("Pim-Converter"),
252 tr("<qt>Conversion not possible: \n" 252 tr("<qt>Conversion not possible: <br>"
253 "Problem: %1</qt>").arg(cmd) ); 253 "Problem: %1</qt>").arg(cmd) );
254 return error; 254 return error;
255 } 255 }
256 256
257 257
258 /* 258 /*
259 * Move it over 259 * Move it over
260 */ 260 */
261 cmd = "mv " + Global::shellQuote(src) + " " + Global::shellQuote(dest); 261 cmd = "mv " + Global::shellQuote(src) + " " + Global::shellQuote(dest);
262 if( ::system( cmd ) != 0 ){ 262 if( ::system( cmd ) != 0 ){
263 error = true; 263 error = true;
264 } 264 }
265 265
266 266
267 /* 267 /*
268 * Convert it 268 * Convert it
269 */ 269 */
270 if ( !error ){ 270 if ( !error ){
271 cmd = "sqlite " + Global::shellQuote(dest) + " .dump | sqlite3 " + Global::shellQuote(src); 271 cmd = "sqlite " + Global::shellQuote(dest) + " .dump | sqlite3 " + Global::shellQuote(src);
272 if ( ::system( cmd ) != 0 ){ 272 if ( ::system( cmd ) != 0 ){
273 error = true; 273 error = true;
274 } 274 }
275 } 275 }
276 276
277
278 /*
279 * Check whether conversion really worked. If not, move old database back to recover it
280 */
281 if ( !QFile::exists( src ) ){
282 cmd = "mv " + Global::shellQuote(dest) + " " + Global::shellQuote(src);
283 if ( ::system( cmd ) != 0 ){
284 }
285 error = true;
286 cmd = "Database-Format is not V2!?";
287 }
288
277 if ( error ){ 289 if ( error ){
278 QMessageBox::critical( this, tr("Pim-Converter"), 290 QMessageBox::critical( this, tr("Pim-Converter"),
279 tr("<qt>An internal error occurred: " 291 tr("<qt>An internal error occurred: <br>"
280 "Converting the database was impossible! " 292 "Converting the database was impossible! <br>"
281 "Command: '%1' </qt>").arg(cmd) ); 293 "Command/Reason: '%1' </qt>").arg(cmd) );
282 294
283 } 295 }
296
297
284} 298}
285 299
286 300
287 301
288void Converter::start_upgrade() 302void Converter::start_upgrade()
289{ 303{
290 odebug << "Start upgrading" << oendl; 304 odebug << "Start upgrading" << oendl;
291 switch( QMessageBox::warning( this, tr("Pim-Converter"), 305 switch( QMessageBox::warning( this, tr("Pim-Converter"),
292 tr("<qt>Are you really sure that you " 306 tr("<qt>Are you really sure that you "
293 "want to convert your database from " 307 "want to convert your database from "
294 "sqlite V2 to sqlite V3?</qt>"), 308 "sqlite V2 to sqlite V3?</qt>"),
295 QMessageBox::Ok | QMessageBox::Default, 309 QMessageBox::Ok | QMessageBox::Default,
296 QMessageBox::Abort | QMessageBox::Escape )) { 310 QMessageBox::Abort | QMessageBox::Escape )) {
297 311
298 case QMessageBox::Abort: // Abort clicked or Escape pressed 312 case QMessageBox::Abort: // Abort clicked or Escape pressed
299 // abort 313 // abort
300 return; 314 return;
301 break; 315 break;
302 } 316 }
303 odebug << "Checking whether sqlite is installed" << oendl; 317 odebug << "Checking whether sqlite is installed" << oendl;
304 if ( system( "which sqlite" ) != 0 ){ 318 if ( system( "which sqlite" ) != 0 ){
305 QMessageBox::critical( this, tr("Pim-Converter"), 319 QMessageBox::critical( this, tr("Pim-Converter"),
306 tr("<qt>An internal error occurred: " 320 tr("<qt>An internal error occurred: "
307 "sqlite was not accessible! " 321 "sqlite was not accessible! "
308 "Please correct the PATH or install " 322 "Please correct the PATH or install "
309 "this packages!</qt>") ); 323 "this packages!</qt>") );
310 return; 324 return;
311 } 325 }
312 if ( system( "which sqlite3" ) != 0 ){ 326 if ( system( "which sqlite3" ) != 0 ){
313 QMessageBox::critical( this, tr("Pim-Converter"), 327 QMessageBox::critical( this, tr("Pim-Converter"),
314 tr("<qt>An internal error occurred: " 328 tr("<qt>An internal error occurred: "
315 "sqlite3 was not accessible! " 329 "sqlite3 was not accessible! "
316 "Please correct the PATH or install " 330 "Please correct the PATH or install "
317 "this packages!</qt>") ); 331 "this packages!</qt>") );
318 return; 332 return;
319 } 333 }
320 334
321 QString src, dest; 335 QString src, dest;
322 bool error = false; 336 bool error = false;
323 337
324 src = Global::applicationFileName("addressbook", "addressbook.db" ); 338 src = Global::applicationFileName("addressbook", "addressbook.db" );
325 dest = Global::applicationFileName("addressbook", "addressbook.db_v2" ); 339 dest = Global::applicationFileName("addressbook", "addressbook.db_v2" );
326 error = sqliteMoveAndConvert( "Addressbook", src, dest ); 340 error = sqliteMoveAndConvert( "Addressbook", src, dest );
327 341
328 src = Global::applicationFileName("datebook", "datebook.db" ); 342 src = Global::applicationFileName("datebook", "datebook.db" );
329 dest = Global::applicationFileName("datebook", "datebook.db_v2" ); 343 dest = Global::applicationFileName("datebook", "datebook.db_v2" );
330 error = sqliteMoveAndConvert( "Datebook", src, dest ); 344 error = sqliteMoveAndConvert( "Datebook", src, dest );
331 345
332 346
333 src = Global::applicationFileName("todolist", "todolist.db" ); 347 src = Global::applicationFileName("todolist", "todolist.db" );
334 dest = Global::applicationFileName("todolist", "todolist.db_v2" ); 348 dest = Global::applicationFileName("todolist", "todolist.db_v2" );
335 error = sqliteMoveAndConvert( "TodoList", src, dest ); 349 error = sqliteMoveAndConvert( "TodoList", src, dest );
336 350
337 if ( !error ){ 351 if ( !error ){
338 QMessageBox::information( this, tr("Pim-Converter"), 352 QMessageBox::information( this, tr("Pim-Converter"),
339 tr("Conversion is finished!"), 353 tr("Conversion is finished!"),
340 QMessageBox::Ok ); 354 QMessageBox::Ok );
341 } 355 }
342} 356}