21.3.5 Projekt – Konsolen-Client 'mysql'

Auch in diesem Projekt werden die Themen 'Prozess-Steuerung' und 'Prozess-Daten' im Zusammenhang mit dem Einsatz der Instruktionen SHELL und EXEC aufgegriffen. Es wird die Basis für eine GUI für den interaktiven Konsolen-Client 'mysql' vorgestellt.

GUI1

Abbildung 21.3.5.1: Basis-GUI für das Konsolen-Programm 'mysql'

Sie können das Projekt in vielfältiger Weise zu Ihrer GUI für den Konsolen-Client 'mysql' ausbauen, die sich an den zu bearbeitenden Aufgaben sowie an den eigenen Vorstellungen orientiert. Folgende Erweiterungen wären denkbar:

In diesem Projekt können Sie nicht nur den Konsolen-Client 'mysql' einsetzen, sondern auch die Konsolen-Clients 'sqlite3' für SQLite3 oder 'psql' für Postgres-Datenbanken, sofern Sie diese Clients installiert haben.

SQLite3

Abbildung 21.3.5.2: Basis-GUI für das Konsolen-Programm 'sqlite3'

In den folgenden Abschnitten wird der Konsolen-Client 'mysql' eingesetzt:

GUI

Abbildung 21.3.5.3: GUI nach dem Start des Clients 'mysql'

Nach dem Start des externen Programms 'mysql' sehen Sie den Namen des externen DB-Clients und die PID des gestarteten Prozesses sowie den Begrüßungstext des Datenbank-Clients in der Ausgabe-Komponente. Danach arbeiten Sie wie in einer normalen Konsole – mit dem Unterschied, dass Sie jetzt alle Ausgaben mit dem Gambas-Programm unter den o.a. Aspekten von Programm-Erweiterungen bearbeiten können:

GUI4

Abbildung 21.3.5.4: Anzeige einer Abfrage – Client 'mysql'

Einige Besonderheiten kennzeichnen das vorgestellte Projekt:


HistoryBox

Wie bei allen Komponenten üblich, wurde auch der HistoryBox von den Autoren ein Icon spendiert, das Sie in der IDE im Fenster Eigenschaften unter 'Form' sehen. Das Icon muss im Projektverzeichnis in einem unsichtbaren Ordner .hidden/control als Bild vom Typ 'png' eingefügt werden, damit es in der IDE im virtuellen Ordner 'Projekt' zu sehen ist.

GUI5

Abbildung 21.3.5.5: Der DB-Client wurde beendet

Es gibt einige Programme – wie die vorgestellten DB-Clients – die ihre Fehlerausgaben permanent auf die Standard-Ausgabe umlenken. Somit entfällt bei diesen Programmen diese Prozedur:

Public Sub myProcess_Error(sFehler As String)
' …
End ' myProcess_Error(..)

Der Quelltext wird vollständig angegeben:

' Gambas class file
 
Private $hProcess As Process
 
' Private sDBClientName As String = "sqlite3"
' Private sStartParameter As String = ""
Private sDBClientName As String = "mysql"
Private sStartParameter As String = "-f -n -vvv -u root -pYourMySQLPassword4SQLRoot"
 
Public Sub Form_Open()
  FMain.Center
  FMain.Resizable = True
  FMain.Arrangement = Arrange.Vertical
  txaOutput.Expand = True
  txaOutput.Clear
  HBoxSpacing.Height = 8
  HBox.Spacing = True
  HBox.Height = 24
  pDynamicPanel.Expand = True
 
  txbHistoryEingabe.Foreground = Color.Gray
  txbHistoryEingabe.Alignment = Align.Center
  txbHistoryEingabe.Text = "*** SQL-Anweisung eingeben und mit ENTER-Taste aktivieren ***" 
  txbHistoryEingabe.ReadOnly = True
  txbHistoryEingabe.History = New History(50)
 
  SetLEDColor("orange")
 
End ' Form_Open()
 
Public Sub btnProcessStart_Click()
 ProcessStart()
 FMain.Text = "Datenbank-Client " & Upper(sDBClientName) & "   :   PID = " &  $hProcess.Id
 txbHistoryEingabe.Alignment = Align.Normal
End ' btnProcessStart
 
Public Sub btnTextAreaClear_Click()
  txaOutput.Clear
  txbHistoryEingabe.SetFocus
End ' btnTextAreaClear
 
Public Sub btnClose_Click()
  FMain.Close
End ' btnClose_Click()
 
'*******************************************************************************************
 
Public Sub ProcessStart()
   Dim sCommand As String
 
  txbHistoryEingabe.Foreground = Color.Black
  txbHistoryEingabe.Clear
  txaOutput.Clear
 
  sCommand = sDBClientName & Chr(32) & sStartParameter
  $hProcess = Shell sCommand For Input Output As "myProcess"
 
  txaOutput.Insert(gb.NewLine)
  txbHistoryEingabe.ReadOnly = False
  txbHistoryEingabe.SetFocus  
  btnProcessStart.Enabled = False
  SetLEDColor("green")
 
End ' ProcessStart()
 
Public Sub myProcess_Read()
  Dim sPuffer As String
 
  txaOutput.Insert(gb.NewLine)
  sPuffer = ""
  Read #$hProcess, sPuffer, Lof($hProcess)
 
  Select sDBClientName  
  Case "mysql"
    sPuffer = Replace(sPuffer, "mysql>", "System-User: " & User.Name & " # >" & gb.NewLine)
  Case "sqlite3"
    sPuffer = Replace(sPuffer, "sqlite>", gb.NewLine & "System-User: " & User.Name & \ 
                      " # >" & gb.NewLine)
  End Select 
  txaOutput.Insert(sPuffer & gb.NewLine)
 
End ' hProcess_Read()
 
' Public Sub myProcess_Error(sFehler As String)
'   Diese Prozedur kann entfallen, da Fehler-Ausgaben sowohl beim MySQL-Client
'   als auch beim SQLite3-Client intern auf die Standard-Ausgabe umgelenkt werden!
' End ' myProcess_Error(..)
 
Public Sub myProcess_Kill()
  txaOutput.Insert(gb.NewLine)
  txaOutput.Foreground = Color.Red
  txaOutput.Insert("Rückgabewert vom Programm '" & sDBClientName & "' =  " \ 
                    & $hProcess.Value & gb.NewLine)  
  Select Case $hProcess.State
  Case 0
   txaOutput.Insert("Prozess (PID = " & $hProcess.Id & ") wurde normal beendet." & gb.NewLine)
  Case 1
   txaOutput.Insert("Prozess (PID = " & $hProcess.Id & ") wurde gestoppt!" & gb.NewLine)
  Case 2
   txaOutput.Insert("Prozess (PID = " & $hProcess.Id & ") wurde beendet!" & gb.NewLine)
  End Select ' $hProcess.State  
  SetLEDColor("red")
End ' myProcess_Kill()
 
Public Sub WriteToMyProcess(sInput As String)  
   If $hProcess Then
      If $hProcess.State = $hProcess.Running Then
         Print #$hProcess, sInput  
      Endif ' Running ?
   Endif ' Process started ?
End ' WriteToMyProcess(sInput As String)
 
Public Sub txbHistoryEingabe_Activate()
  If txbHistoryEingabe.Text = "" Then Return
' txbHistoryEingabe.Text = Trim(txbHistoryEingabe.Text)  ---> Das erledigt die History-Box selbst
  WriteToMyProcess(txbHistoryEingabe.Text)
' txbHistoryEingabe.Clear   ---> Das erledigt die History-Box selbst
End ' txbHistoryEingabe_Activate()
 
Public Sub txaOutput_Change()
  txaOutput.Pos = Len(txaOutput.Text) ' ---> Sprung in die letzte Zeile
End ' txaOutput_Change()
 
Public Sub SetLEDColor(sLEDColor As String)  
   PictureBox1.Picture = Picture["LED/led_" & sLEDColor & ".svg"]  
End '  SetLEDColor(..)
 
Public Sub Form_Close()
  If $hProcess Then
     txaOutput.SetFocus
     txaOutput.Clear
     txaOutput.Insert(gb.NewLine)
     $hProcess.Kill()
     Wait 2
  Endif ' $hProcess ?
End ' Form_Close()

Download