author | eilers <eilers> | 2004-10-26 11:18:23 (UTC) |
---|---|---|
committer | eilers <eilers> | 2004-10-26 11:18:23 (UTC) |
commit | 8d8b23bff18b8afd42840ef1d4574ef3ea9f8cee (patch) (unidiff) | |
tree | 04505b36b73f00bcd31666d30bc7cd80883729e6 | |
parent | cd3245ade209b4672ab5c51003aa66b5908c67a1 (diff) | |
download | opie-8d8b23bff18b8afd42840ef1d4574ef3ea9f8cee.zip opie-8d8b23bff18b8afd42840ef1d4574ef3ea9f8cee.tar.gz opie-8d8b23bff18b8afd42840ef1d4574ef3ea9f8cee.tar.bz2 |
Protect against error in database format. Recover to old if database was
unreadable ..
-rw-r--r-- | noncore/tools/pimconverter/converter.cpp | 22 |
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 | ||
217 | void Converter::closeEvent( QCloseEvent *e ) | 217 | void 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 | ||
230 | bool Converter::sqliteMoveAndConvert( const QString& name, const QString& src, const QString &dest ) | 230 | bool 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 | ||
288 | void Converter::start_upgrade() | 302 | void 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 | } |