sqlite: add context actions for compact, export, drop table
This commit is contained in:
parent
8f5e1054fb
commit
ce3d08740f
48
db_sqlite.go
48
db_sqlite.go
@ -229,8 +229,52 @@ func (ld *sqliteLoadedDatabase) NavChildren(ndata *navData) ([]string, error) {
|
|||||||
return nil, fmt.Errorf("unknown nav path %#v", ndata.bucketPath)
|
return nil, fmt.Errorf("unknown nav path %#v", ndata.bucketPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ld *sqliteLoadedDatabase) NavContext(ndata *navData) ([]contextAction, error) {
|
func (ld *sqliteLoadedDatabase) NavContext(ndata *navData) (ret []contextAction, err error) {
|
||||||
return nil, nil // No special actions are supported
|
|
||||||
|
if len(ndata.bucketPath) == 0 {
|
||||||
|
ret = append(ret, contextAction{"Compact database", ld.CompactDatabase})
|
||||||
|
ret = append(ret, contextAction{"Export backup...", ld.ExportBackup})
|
||||||
|
}
|
||||||
|
if len(ndata.bucketPath) == 2 {
|
||||||
|
ret = append(ret, contextAction{"Drop table", ld.DropTable})
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ld *sqliteLoadedDatabase) CompactDatabase(sender vcl.IComponent, ndata *navData) error {
|
||||||
|
_, err := ld.db.Exec(`VACUUM;`)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ld *sqliteLoadedDatabase) ExportBackup(sender vcl.IComponent, ndata *navData) error {
|
||||||
|
// Popup for output file
|
||||||
|
dlg := vcl.NewSaveDialog(sender)
|
||||||
|
dlg.SetTitle("Save backup as...")
|
||||||
|
dlg.SetFilter(sqliteFilter)
|
||||||
|
ret := dlg.Execute() // Fake blocking
|
||||||
|
if !ret {
|
||||||
|
return nil // cancelled
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err := ld.db.Exec(`VACUUM INTO ?`, dlg.FileName())
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ld *sqliteLoadedDatabase) DropTable(sender vcl.IComponent, ndata *navData) error {
|
||||||
|
if len(ndata.bucketPath) != 2 {
|
||||||
|
return errors.New("Invalid selection")
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
|
||||||
|
tableName := ndata.bucketPath[1]
|
||||||
|
|
||||||
|
if !vcl_confirm_dialog(sender, "Drop table", fmt.Sprintf("Are you sure you want to drop the table %q?", tableName)) {
|
||||||
|
return nil // cancelled
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err := ld.db.Exec(`DROP TABLE "` + tableName + `"`) // WARNING can't prepare this parameter, but it comes from the DB (trusted)
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ld *sqliteLoadedDatabase) Close() {
|
func (ld *sqliteLoadedDatabase) Close() {
|
||||||
|
27
util_vcl.go
27
util_vcl.go
@ -90,3 +90,30 @@ func vcl_stringgrid_columnwidths(d *vcl.TStringGrid) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func vcl_confirm_dialog(sender vcl.IComponent, title string, message string) bool {
|
||||||
|
|
||||||
|
dlg := vcl.NewTaskDialog(sender)
|
||||||
|
dlg.SetCaption(APPNAME)
|
||||||
|
dlg.SetTitle(title)
|
||||||
|
dlg.SetText(message)
|
||||||
|
dlg.SetCommonButtons(types.NewSet())
|
||||||
|
|
||||||
|
yesBtn := dlg.Buttons().Add()
|
||||||
|
yesBtn.SetCaption("Confirm")
|
||||||
|
yesBtn.SetModalResult(types.MrYes)
|
||||||
|
|
||||||
|
noBtn := dlg.Buttons().Add()
|
||||||
|
noBtn.SetCaption("Cancel")
|
||||||
|
noBtn.SetModalResult(types.MrCancel)
|
||||||
|
|
||||||
|
ret := dlg.Execute()
|
||||||
|
if !ret {
|
||||||
|
return false // dialog closed
|
||||||
|
}
|
||||||
|
if dlg.ModalResult() != types.MrYes {
|
||||||
|
return false // other button clicked
|
||||||
|
}
|
||||||
|
|
||||||
|
return true // confirmed
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user