package org.reldb.dbrowser.ui.backup; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Calendar; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.FileDialog; import org.reldb.dbrowser.DBrowser; import org.reldb.dbrowser.ui.DbConnection; import org.reldb.rel.client.connection.string.StringReceiverClient; public class Backup { private static FileDialog backupDialog; static String getSuggestedBackupFileName(String dbURL) { String fname; if (dbURL.startsWith("db:")) fname = dbURL.substring(3).replace('.', '_').replace('/', '_').replace('\\', '_').replace(':', '_').replace(' ', '_'); else fname = dbURL.replace('.', '_').replace('/', '_').replace('\\', '_').replace(':', '_').replace(' ', '_'); fname = fname.replace("__", "_"); Calendar cal = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MMMMM_dd_hh_mm_aaa"); String timestamp = sdf.format(cal.getTime()); return "relbackup_" + fname + "_" + timestamp + ".rel"; } static BackupResponse backupToFile(StringReceiverClient client, File outputFile) { BufferedWriter outf; try { outf = new BufferedWriter(new FileWriter(outputFile)); } catch (IOException ioe) { return new BackupResponse(ioe.toString(), "Unable to open output file", BackupResponse.ResponseType.ERROR, false); } boolean receivedOk = false; long linesWritten = 0; try { String r; client.sendExecute("BACKUP;"); try { while ((r = client.receive()) != null) { if (r.equals("\n")) { continue; } else if (r.equals("Ok.")) { receivedOk = true; break; } else if (r.startsWith("ERROR:")) { outf.close(); client.close(); return new BackupResponse(r, "Error executing backup script", BackupResponse.ResponseType.ERROR, false); } else if (r.startsWith("NOTICE")) { } else { linesWritten++; outf.write(r); outf.newLine(); } } } catch (IOException ioe) { outf.close(); client.close(); return new BackupResponse(ioe.toString(), "Error executing backup script", BackupResponse.ResponseType.ERROR, false); } client.close(); } catch (Throwable t) { try { outf.close(); if (client != null) client.close(); } catch (IOException e) { return new BackupResponse(e.toString(), "Error closing output file", BackupResponse.ResponseType.ERROR, false); } return new BackupResponse(t.toString(), "Unable to open database for backup", BackupResponse.ResponseType.ERROR, false); } try { outf.close(); } catch (IOException ioe) { return new BackupResponse(ioe.toString(), "Unable to close output file", BackupResponse.ResponseType.ERROR, false); } if (receivedOk) { if (linesWritten == 0) return new BackupResponse("No data was written to the backup.", "Backup failed", BackupResponse.ResponseType.ERROR, false); else { BufferedReader inf = null; long linesRead = 0; try { inf = new BufferedReader(new FileReader(outputFile)); while (inf.readLine() != null) linesRead++; } catch (IOException ioe) { return new BackupResponse(ioe.toString(), "Unable to read backup file", BackupResponse.ResponseType.ERROR, false); } try { if (inf != null) inf.close(); } catch (IOException ioe2) { return new BackupResponse(ioe2.toString(), "Unable to close backup file after reading it", BackupResponse.ResponseType.ERROR, false); } if (linesWritten == linesRead) return new BackupResponse("Backup Successful! " + linesWritten + " lines were written to\n" + outputFile + "\n\nHowever, you should examine the file to make sure it is complete.", "Backup Complete", BackupResponse.ResponseType.INFORMATION, true); else return new BackupResponse("Backup Failed: " + linesWritten + " lines were written to\n" + outputFile + "\nbut only " + linesRead + " could be read back.", "Backup Failed", BackupResponse.ResponseType.ERROR, false); } } else return new BackupResponse("The backup may be incomplete. Please examine the backup!", "Backup Incomplete", BackupResponse.ResponseType.ERROR, false); } public static void makeBackup(DbConnection connection) { if (backupDialog == null) { backupDialog = new FileDialog(DBrowser.getShell(), SWT.SAVE); backupDialog.setFilterPath(System.getProperty("user.home")); backupDialog.setFilterExtensions(new String[] {"*.rel", "*.*"}); backupDialog.setFilterNames(new String[] {"Rel script", "All Files"}); backupDialog.setText("Save Backup"); backupDialog.setOverwrite(true); } backupDialog.setFileName(getSuggestedBackupFileName(connection.getDbURL())); String fname = backupDialog.open(); if (fname == null) return; BackupResponse response = backupToFile(connection.obtainStringReceiverClient(), new File(fname)); response.showMessage(); } }