Skip to content

Commit

Permalink
Merge pull request #73 from jorgerojas26/refactor-dml
Browse files Browse the repository at this point in the history
[WIP] Refactor DML actions handling
  • Loading branch information
jorgerojas26 authored Aug 31, 2024
2 parents c325d45 + be92c60 commit d9469eb
Show file tree
Hide file tree
Showing 17 changed files with 1,559 additions and 740 deletions.
24 changes: 24 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
---
name: Continuous Integration

on:
pull_request:

jobs:
lint:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Set up Go
uses: actions/setup-go@v5

- name: Golangci-lint
uses: golangci/[email protected]

- name: Test
run: go test -v ./...

- name: Build
run: go build -v ./...
10 changes: 1 addition & 9 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,7 @@ jobs:
uses: actions/setup-go@v5

-
name: Golangci-lint
uses: golangci/[email protected]

- name: Install build dependencies
run: |
sudo apt-get update
sudo apt-get install -y build-essential libc6-dev
- name: Run GoReleaser
name: Run GoReleaser
uses: goreleaser/goreleaser-action@v6
with:
# either 'goreleaser' (default) or 'goreleaser-pro'
Expand Down
29 changes: 28 additions & 1 deletion .golangci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
# Author: @ccoVeille
# License: MIT
# Variant: 03-safe
# Version: v1.0.0
# Version: v1.0.0 + gosec + sqlclosecheck + rowserrcheck
#
linters:
# some linters are enabled by default
Expand Down Expand Up @@ -49,6 +49,15 @@ linters:
# Checks for duplicate words in the source code.
- dupword

# Inspects source code for security problems.
- gosec

# Checks that sql.Rows, sql.Stmt, sqlx.NamedStmt, pgx.Query are closed.
- sqlclosecheck

# Checks whether Rows.Err of rows is checked successfully.
- rowserrcheck

linters-settings:
gci: # define the section orders for imports
sections:
Expand Down Expand Up @@ -132,12 +141,30 @@ linters-settings:
# warns when initialism, variable or package naming conventions are not followed.
- name: var-naming

# if-then-else conditional with identical implementations in both branches is an error.
- name: identical-branches

# warns when errors returned by a function are not explicitly handled on the caller side.
- name: unhandled-error
arguments: # here are the exceptions we don't want to be reported
- "fmt.Print.*"
- "fmt.Fprint.*"
- "bytes.Buffer.Write*"
- "strings.Builder.Write*"

dupword:
# Keywords used to ignore detection.
# Default: []
ignore:
# - "blah" # this will accept "blah blah …" as a valid duplicate word

gosec:
# To specify a set of rules to explicitly exclude.
# Available rules: https://github.com/securego/gosec#available-rules
excludes:
- G306 # Poor file permissions used when writing to a new file
- G307 # Poor file permissions used when creating a file with os.Create

misspell:
# Correct spellings using locale preferences for US or UK.
# Setting locale to US will correct the British spelling of 'colour' to 'color'.
Expand Down
23 changes: 15 additions & 8 deletions components/ConnectionForm.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,31 +29,39 @@ func NewConnectionForm(connectionPages *models.ConnectionPages) *ConnectionForm

buttonsWrapper := tview.NewFlex().SetDirection(tview.FlexColumn)

saveButton := tview.NewButton("[darkred]F1 [black]Save")
saveButton := tview.NewButton("[yellow]F1 [dark]Save")
saveButton.SetStyle(tcell.StyleDefault.Background(tview.Styles.PrimaryTextColor))
saveButton.SetBorder(true)

buttonsWrapper.AddItem(saveButton, 0, 1, false)
buttonsWrapper.AddItem(nil, 1, 0, false)

testButton := tview.NewButton("[darkred]F2 [black]Test")
testButton := tview.NewButton("[yellow]F2 [dark]Test")
testButton.SetStyle(tcell.StyleDefault.Background(tview.Styles.PrimaryTextColor))
testButton.SetBorder(true)

buttonsWrapper.AddItem(testButton, 0, 1, false)
buttonsWrapper.AddItem(nil, 1, 0, false)

connectButton := tview.NewButton("[darkred]F3 [black]Connect")
connectButton := tview.NewButton("[yellow]F3 [dark]Connect")
connectButton.SetStyle(tcell.StyleDefault.Background(tview.Styles.PrimaryTextColor))
connectButton.SetBorder(true)

buttonsWrapper.AddItem(connectButton, 0, 1, false)
buttonsWrapper.AddItem(nil, 1, 0, false)

cancelButton := tview.NewButton("[darkred]Esc [black]Cancel")
cancelButton := tview.NewButton("[yellow]Esc [dark]Cancel")
cancelButton.SetStyle(tcell.StyleDefault.Background(tcell.Color(tview.Styles.PrimaryTextColor)))
cancelButton.SetBorder(true)

buttonsWrapper.AddItem(cancelButton, 0, 1, false)

statusText := tview.NewTextView()
statusText.SetBorderPadding(0, 1, 0, 0)
statusText.SetBorderPadding(1, 1, 0, 0)

wrapper.AddItem(addForm, 0, 1, true)
wrapper.AddItem(statusText, 3, 0, false)
wrapper.AddItem(buttonsWrapper, 1, 0, false)
wrapper.AddItem(statusText, 4, 0, false)
wrapper.AddItem(buttonsWrapper, 3, 0, false)

form := &ConnectionForm{
Flex: wrapper,
Expand Down Expand Up @@ -81,7 +89,6 @@ func (form *ConnectionForm) inputCapture(connectionPages *models.ConnectionPages
connectionString := form.GetFormItem(1).(*tview.InputField).GetText()

parsed, err := helpers.ParseConnectionString(connectionString)

if err != nil {
form.StatusText.SetText(err.Error()).SetTextStyle(tcell.StyleDefault.Foreground(tcell.ColorRed))
return event
Expand Down
37 changes: 24 additions & 13 deletions components/ConnectionSelection.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,36 +28,47 @@ func NewConnectionSelection(connectionForm *ConnectionForm, connectionPages *mod

buttonsWrapper := tview.NewFlex().SetDirection(tview.FlexRowCSS)

newButton := tview.NewButton("[darkred]N[black]ew")
newButton.SetStyle(tcell.StyleDefault.Background(tview.Styles.PrimaryTextColor))
newButton := tview.NewButton("[yellow]N[dark]ew")
newButton.SetStyle(tcell.StyleDefault.Background(tview.Styles.PrimitiveBackgroundColor))
newButton.SetBorder(true)

buttonsWrapper.AddItem(newButton, 0, 1, false)
buttonsWrapper.AddItem(nil, 1, 0, false)

connectButton := tview.NewButton("[darkred]C[black]onnect")
connectButton.SetStyle(tcell.StyleDefault.Background(tview.Styles.PrimaryTextColor))
connectButton := tview.NewButton("[yellow]C[dark]onnect")
connectButton.SetStyle(tcell.StyleDefault.Background(tview.Styles.PrimitiveBackgroundColor))
connectButton.SetBorder(true)

buttonsWrapper.AddItem(connectButton, 0, 1, false)
buttonsWrapper.AddItem(nil, 1, 0, false)

editButton := tview.NewButton("[darkred]E[black]dit")
editButton.SetStyle(tcell.StyleDefault.Background(tview.Styles.PrimaryTextColor))
editButton := tview.NewButton("[yellow]E[dark]dit")
editButton.SetStyle(tcell.StyleDefault.Background(tview.Styles.PrimitiveBackgroundColor))
editButton.SetBorder(true)

buttonsWrapper.AddItem(editButton, 0, 1, false)
buttonsWrapper.AddItem(nil, 1, 0, false)

deleteButton := tview.NewButton("[darkred]D[black]elete")
deleteButton.SetStyle(tcell.StyleDefault.Background(tview.Styles.PrimaryTextColor))
deleteButton := tview.NewButton("[yellow]D[dark]elete")
deleteButton.SetStyle(tcell.StyleDefault.Background(tview.Styles.PrimitiveBackgroundColor))
deleteButton.SetBorder(true)

buttonsWrapper.AddItem(deleteButton, 0, 1, false)
buttonsWrapper.AddItem(nil, 1, 0, false)

quitButton := tview.NewButton("[darkred]Q[black]uit")
quitButton.SetStyle(tcell.StyleDefault.Background(tview.Styles.PrimaryTextColor))
quitButton := tview.NewButton("[yellow]Q[dark]uit")
quitButton.SetStyle(tcell.StyleDefault.Background(tview.Styles.PrimitiveBackgroundColor))
quitButton.SetBorder(true)

buttonsWrapper.AddItem(quitButton, 0, 1, false)
buttonsWrapper.AddItem(nil, 1, 0, false)

statusText := tview.NewTextView()
statusText.SetBorderPadding(0, 1, 0, 0)
statusText.SetBorderPadding(1, 1, 0, 0)

wrapper.AddItem(ConnectionListTable, 0, 1, true)
wrapper.AddItem(statusText, 3, 0, false)
wrapper.AddItem(buttonsWrapper, 1, 0, false)
wrapper.AddItem(statusText, 4, 0, false)
wrapper.AddItem(buttonsWrapper, 3, 0, false)

cs := &ConnectionSelection{
Flex: wrapper,
Expand Down
32 changes: 19 additions & 13 deletions components/Home.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package components

import (
"fmt"

"github.com/gdamore/tcell/v2"
"github.com/rivo/tview"

Expand All @@ -21,7 +23,6 @@ type Home struct {
DBDriver drivers.Driver
FocusedWrapper string
ListOfDbChanges []models.DbDmlChange
ListOfDbInserts []models.DbInsert
}

func NewHomePage(connection models.Connection, dbdriver drivers.Driver) *Home {
Expand All @@ -41,7 +42,6 @@ func NewHomePage(connection models.Connection, dbdriver drivers.Driver) *Home {
HelpStatus: NewHelpStatus(),
HelpModal: NewHelpModal(),
ListOfDbChanges: []models.DbDmlChange{},
ListOfDbInserts: []models.DbInsert{},
DBDriver: dbdriver,
}

Expand Down Expand Up @@ -83,19 +83,25 @@ func (home *Home) subscribeToTreeChanges() {
for stateChange := range ch {
switch stateChange.Key {
case "SelectedTable":
databaseName := home.Tree.GetSelectedDatabase()
tableName := stateChange.Value.(string)

tab := home.TabbedPane.GetTabByName(tableName)
tabReference := fmt.Sprintf("%s.%s", databaseName, tableName)

tab := home.TabbedPane.GetTabByReference(tabReference)

var table *ResultsTable

if tab != nil {
table = tab.Content
home.TabbedPane.SwitchToTabByName(tab.Name)
home.TabbedPane.SwitchToTabByReference(tab.Reference)
} else {
table = NewResultsTable(&home.ListOfDbChanges, &home.ListOfDbInserts, home.Tree, home.DBDriver).WithFilter()
table.SetDBReference(tableName)
table = NewResultsTable(&home.ListOfDbChanges, home.Tree, home.DBDriver).WithFilter()
table.SetDatabaseName(databaseName)
table.SetTableName(tableName)

home.TabbedPane.AppendTab(tableName, table, tabReference)

home.TabbedPane.AppendTab(tableName, table)
}

table.FetchRecords(func() {
Expand Down Expand Up @@ -206,7 +212,7 @@ func (home *Home) rightWrapperInputCapture(event *tcell.EventKey) *tcell.EventKe
if !table.GetIsFiltering() && !table.GetIsEditing() && !table.GetIsLoading() {
home.TabbedPane.RemoveCurrentTab()

if home.TabbedPane.GetLenght() == 0 {
if home.TabbedPane.GetLength() == 0 {
home.focusLeftWrapper()
return nil
}
Expand Down Expand Up @@ -267,9 +273,10 @@ func (home *Home) homeInputCapture(event *tcell.EventKey) *tcell.EventKey {

if tab != nil {
home.TabbedPane.SwitchToTabByName(EditorTabName)
tab.Content.SetIsFiltering(true)
} else {
tableWithEditor := NewResultsTable(&home.ListOfDbChanges, &home.ListOfDbInserts, home.Tree, home.DBDriver).WithEditor()
home.TabbedPane.AppendTab(EditorTabName, tableWithEditor)
tableWithEditor := NewResultsTable(&home.ListOfDbChanges, home.Tree, home.DBDriver).WithEditor()
home.TabbedPane.AppendTab(EditorTabName, tableWithEditor, EditorTabName)
tableWithEditor.SetIsFiltering(true)
}
home.HelpStatus.SetStatusOnEditorView()
Expand All @@ -290,7 +297,7 @@ func (home *Home) homeInputCapture(event *tcell.EventKey) *tcell.EventKey {
App.Stop()
}
case commands.Save:
if ((len(home.ListOfDbChanges) > 0) || len(home.ListOfDbInserts) > 0) && !table.GetIsEditing() {
if (len(home.ListOfDbChanges) > 0) && !table.GetIsEditing() {
confirmationModal := NewConfirmationModal("")

confirmationModal.SetDoneFunc(func(_ int, buttonLabel string) {
Expand All @@ -299,13 +306,12 @@ func (home *Home) homeInputCapture(event *tcell.EventKey) *tcell.EventKey {

if buttonLabel == "Yes" {

err := home.DBDriver.ExecutePendingChanges(home.ListOfDbChanges, home.ListOfDbInserts)
err := home.DBDriver.ExecutePendingChanges(home.ListOfDbChanges)

if err != nil {
table.SetError(err.Error(), nil)
} else {
home.ListOfDbChanges = []models.DbDmlChange{}
home.ListOfDbInserts = []models.DbInsert{}

table.FetchRecords(nil)
home.Tree.ForceRemoveHighlight()
Expand Down
Loading

0 comments on commit d9469eb

Please sign in to comment.