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
@@ -124,219 +124,233 @@ void Converter::start_conversion(){
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}