' Gambas class file

Export

Private $sTable As String
Private $sWhere As String
Private $sType As String
Private $aField As String[]
Private $aOrderBy As String[]
Private $hConn As Connection
Private $sOp As String

Public Sub _new(Connection As Connection)
  
  $hConn = Connection

End

Public Sub Select(Optional Fields As Variant, ...) As SQLRequest
  
  Dim aField As String[]
  
  $sType = "SELECT"
  
  If Fields Then
    Try aField = Fields
    If Error Then 
      aField = [CStr(Fields)]
      aField.Insert(Param.All)
    Else
      aField = aField.Copy()
    Endif
  Endif
  
  $aField = aField
  Return Me
  
End

Public Sub Delete() As SQLRequest
  
  $sType = "DELETE"
  Return Me
  
End


Public Function From(Table As String) As SQLRequest
  
  $sTable = Table
  Return Me
  
End


Public Function Where((Where) As String, ...) As SQLRequest

  Dim aArg As New Variant[]

  Where = Trim(Where)
  If Not Where Then Return Me

  If $sOp Then
    If $sWhere Then
      $sWhere &= " " & $sOp
    Endif
    $sOp = ""
  Endif
  
  aArg.Add(Where)
  aArg.Insert(Param.All)
  $sWhere &= " (" & Object.Call($hConn, "Subst", aArg) & ")"
  $sOp = "AND"
  Return Me
  
End

Public Function OrderBy((OrderBy) As Variant, ...) As SQLRequest
  
  Dim aOrderBy As String[]
  
  If IsNull(OrderBy) Then Return Me
  
  Try aOrderBy = OrderBy
  If Error Then 
    aOrderBy = [CStr(OrderBy)]
    aOrderBy.Insert(Param.All)
  Endif
  
  $aOrderBy = aOrderBy
  
  Return Me
  
End

Public Function Or() As SQLRequest
  
  $sOp = "OR"
  Return Me
  
End

Public Function And() As SQLRequest
  
  $sOp = "AND"
  Return Me
  
End

Public Sub Get() As String
  
  Return _call()
  
End


Public Function _call() As String
  
  Dim sReq As String
  Dim I As Integer
  Dim aScan As String[]
  Dim sField As String
  Dim bDesc As Boolean
  
  If Not $sTable Then Error.Raise("No table specified")

  sReq = $sType

  If $aField Then
    
    sReq &= " "
    
    For I = 0 To $aField.Max
      If I Then sReq &= ","
      aScan = Scan($aField[I], "* AS *")
      If aScan.Count = 2 And If InStr(aScan[1], " ") = 0 Then
        sReq &= $aField[I]
      Else If $aField[I] = "*" Then
        sReq &= "*"
      Else
        sReq &= $hConn.Quote($aField[I])
      Endif
    Next
    
  Else If $sType = "SELECT" Then
    
    sReq &= " *"
    
  Endif
    
  sReq &= " FROM " & $hConn.Quote($sTable, True)
    
  If $sWhere Then sReq &= " WHERE" & $sWhere
    
  If $aOrderBy Then 
    
    sReq &= " ORDER BY "
    
    For I = 0 To $aOrderBy.Max
      If I Then sReq &= ","
      sField = $aOrderBy[I]
      If sField Ends " DESC" Then
        sField = Left(sField, -5)
        bDesc = True
      Else
        bDesc = False
      Endif
      sReq &= $hConn.Quote(sField)
      If bDesc Then sReq &= " DESC"
    Next
    
  Endif
  
  Return sReq
    
End