HIX - Proyecto Ticket (I)

Proyecto Ticket 


Vamos a crear una pequeña aplicación para los muchachos del pueblo. Solo tendrán de poner su nombre y el sistema lo registrará y les dará una clave para acceder a ver la película, fácil.

Crearemos un fichero llamado ticket.html

<!DOCTYPE html>
<html>
<body>
 
  <h2>Movie Ticket</h2>
 
  <form action="proc_ticket.prg" method='post' >
    <label for="fname">Name:</label><br>
    <input type="text" name="user_name" value="John"><br><br>
    <input type="submit" value="Give me a ticket">
  </form>
 
  <p>If you click the "Submit" button, the form-data will be sent to a page called "proc_ticket.prg".</p>
 
</body>
</html>

Crearemos el proceso de petición de tickets que llamaremos proc_ticket.prg


#define FILE_TICKET  hb_dirbase() + 'ticket.dbf'
#define MAX_TIMEOUT 5
 
function main()
 
     local lExist    := file( FILE_TICKET )
     local hData     := UPost()
     local cAlias, aDbf, cMessage         
    
     if ! file( FILE_TICKET )
    
          aDbf    := {}
          AAdd(aDbf, { 'name', 'C', 40, 0 })
          AAdd(aDbf, { 'data', 'D',  8, 0 })        
          AAdd(aDbf, { 'key'   , 'C',  5, 0 })     
         
          dbCreate( FILE_TICKET, aDbf )
 
     endif
 
     USE ( FILE_TICKET ) SHARED NEW
    
     cAlias := alias()
 
     (cAlias)->( Dbappend() )  
 
     if (cAlias)->( TRlock() )
 
          (cAlias)->name := hData[  'user_name' ]
          (cAlias)->data := date()
          (cAlias)->key   := key()
 
          (cAlias)->( DbUnlock() )
 
     endif          
    
    (cAlias)->( DbCommit() )
    
     cMessage := '<html>'
     cMessage += '<h1>Request processed !</h1><hr>'
     cMessage += '<h3>Hi ' + hData[ 'user_name' ] + '. Your access code is ' + (cAlias)->key + '</h3>'
     cMessage += '<hr><small>' + 'This ticket was processed at ' + dtoc( date() ) + ' ' + time() + '</small>'
     cMessage += '</html>'
 
    (cAlias)->( DbCloseArea() )
 
 RETU cMessage
    
//---------------------------------------------------//
 
function TRLock()
   
    LOCAL lRlock     := .F.
    LOCAL nIni  := Seconds()
    LOCAL cAlias     := Alias()
    LOCAL nElapsed
   
    WHILE !lRlock
    
          lRlock := (cAlias)->(DbRlock())
       
        if !lRlock
            nElapsed := Seconds() - nIni
            if nElapsed >= MAX_TIMEOUT
                EXIT  // Timeout
            endif
            hb_IdleSleep(0.001) 
        endif
         
    END
   
RETU lRlock    
 
//---------------------------------------------------//
 
FUNCTION Key()
 
    LOCAL cKey  := ''
    LOCAL cWords := 'abcdefghijklmnopqrstuvwxyz'
    LOCAL nI, nPos
   
    FOR nI := 1 TO 5
        nPos := hb_RandomInt(1, Len(cWords))
        cKey += SubStr(cWords, nPos, 1)
    NEXT
   
RETURN cKey


Es un código super básico que lo hace todo de manera sencilla, hasta crear la tabla ! 

Evidentemente se puede mejorar un montón: índices, maximo peticiones, cantidad de entradas, máximo aforo,… pero esto os lo dejo para todos vosotros 😊

Arrancamos hix -> start y ejecutamos localhost/ticket.html  y voilà, ya tenemos nuestra primera aplicación lista.



Todos los datos estarán en nuestra tabla.




Fácil ? 😀




Comentarios