Dispara a execução de um comando a ser processado pelo servidor Redis.

Sintaxe

oRedisAfter := oRedisClient:Exec(cCommand [, cParam1 [, cParam2 ... [, cParamN] ], @retVal)

Parâmetros

NomeTipoDescriçãoObrigatórioReferênciaObservações
cCommandCaracterComando Redis a ser executadoX

cParam1
CaracterComplemento do comando

Substituirá a primeira interrogação (ou ?) que houver no comando cCommand.
cParam2
CaracterComplemento do comando

Substituirá a segunda interrogação (ou ?) que houver no comando cCommand.
.........

Quantidade indefinida de parâmetros complementares adicionais
cParamN
Caracter

Complemento do comando



Substituirá a n-ésima interrogação (ou ?) que houver no comando cCommand.
retValVariávelReceberá o resultado da execuçãoXXIrá conter o resultado do comando executado no Redis conforme o tipo de operação, podendo ser status (lógico), numérico, texto (caracter), array, nulo.

Retorno

NomeTipoDescriçãoObservações
oRedisAfter
objeto tRedisClientCópia do objeto sobre o qual foi feita a chamada, alterado por ela.*

Isto permite acoplar outros métodos e propriedades à chamada de ::Exec()
   Por exemplo,
    oRedisClient:Exec(cCommand, @outParm):lOk


   testará se o comando foi bem sucedido, sem a necessidade de uma consulta à parte a ::lOk sobre o objeto oRedisClient.

Observações

  • O número de parâmetros complementares é ao comando é praticamente ilimitado, suficiente para a imensa maioria das aplicações que usem Redis;

  • Alguns comandos do Redis admitem parâmetros adicionais. Neste caso, para facilidade de programação, pode-se ter uma string de comando fixa (ou constante), com possibilidade de substituição por variáveis nos pontos onde for inserido um ponto de interrogação, o caractere ?
  • O método ::Exec() é muito semelhante em propósito ao método ::Append(): ambos disparam a execução de comandos no servidor Redis.
  • A maior diferença é que o programa que dispare ::Exec() terá que aguardar seu término e receberá dele o resultado do comando, ao passo que isso não ocorre com ::Append(). Por isso ::Exec() fica limitado à programação sequencial e síncrona.
  • Pontos importantes a serem observados:
    • o resultado da função é passado para o parâmetro retVal, que deve por isso ser passado por referência. ::Exec() também altera o estado do objeto sobre o qual é chamado. Por isso, também as propriedades do objeto terão que ser avaliadas depois da chamada ao método ::Exec();
  • o tipo de dados do resultado da chamada a ::Exec() vai variar de acordo com o comando executado. Por exemplo, o comando set retorna valor lógico (.T. ou .F.), enquanto que get retorna uma cadeia de caracteres.
  • O comando altera o estado da propriedade tRedisClient:lOk indicando se o comando foi executado corretamente ou com erro, e neste caso o número do erro é atualizado nas propriedades tRedisClient:nError e tRedisClient:cError.

Exemplos

Exemplo 1 - Emissão do comando set para o servidor  Redis

#include 'protheus.ch'
  
User Function execSet()
  Local retVal := Nil
  Local cCommand := ''
  Local cMsg := ''
  Local oRedisClient := Nil
 
  oRedisClient := tRedisClient():New()
 
  // Setup Redis connection
  oRedisClient:Connect("localhost", 6379, "")
 
  If .Not. oRedisClient:lConnected
    ConOut("Could not connect to Redis server")
    Return .F.
  EndIf
 
  // Set the field 'x' to the value 'aaa'
  cCommand := 'set x "aaa"'
  oRedisClient:Exec(cCommand, @retVal)
 
  // If the execution wasn't fine
  If .Not. oRedisClient:lOk
    ConOut("Could not Exec(" + cCommand + ")")
    VarInfo("State of object: ", oRedisClient)
 
    oRdClient:Disconnect()
     
    Return .F.
  EndIf
 
  ConOut("Successful Exec('" + cCommand + "')")
     
  If ValType(retVal) != 'C'
    cMsg := cValToChar(retVal)
  Else
    cMsg := retVal
  EndIf
  
  ConOut("Exec() result: " + cMsg)
  VarInfo("State of the object: ", oRedisClient)
 
  oRedisClient:Disconnect()
Return .T.

  

Exemplo 2 - Emissão do comando set para o servidor  Redis, parametrizado

#include 'protheus.ch'
   
User Function execSetP()
  Local retVal := Nil
  Local cCommand := ''
  Local cParam   := ''
  Local cMsg := ''
  Local oRedisClient := Nil
  Local lRetVal := .T.
  
  oRedisClient := tRedisClient():New()
  
  // Setup Redis connection
  lRetVal := oRedisClient:Connect("localhost", 6379, ""):lOk
  
  If .Not. lRetVal
    ConOut("Could not connect to Redis server")
    Return .F.
  EndIf
  
  cCommand := 'set x ?'
  cParam   := '"aaa"'
  // Set the field 'x' to the value 'aaa'
  oRedisClient:Exec(cCommand, cParam, @retVal)
  
  // If the execution wasn't fine
  If .Not. oRedisClient:lOk
    ConOut("Could not Exec(" + cCommand + ")")
    VarInfo("State of object: ", oRedisClient)
  
    oRdClient:Disconnect()
      
    Return .F.
  EndIf
  
  ConOut("Successful Exec('" + cCommand + "')")
      
  If ValType(retVal) != 'C'
    cMsg := cValToChar(retVal)
  Else
    cMsg := retVal
  EndIf
   
  ConOut("Exec() result: " + cMsg)
  VarInfo("State of the object: ", oRedisClient)
  
  oRedisClient:Disconnect()
Return .T. 

Exemplo 3 - Emissão do comando get para o servidor  Redis 

#include 'totvs.ch'
   
User Function execGet()
  Local retVal := Nil
  Local cCommand := ''
  Local cMsg := ''
  Local oRedisClient := Nil
  
  oRedisClient:= tRedisClient():New()
  
  // Setup Redis connection
  oRedisClient:Connect("localhost", 6379, "")
  
  If .Not. oRedisClient:lConnected
    ConOut("Could not connect to Redis server")
    Return .F.
  EndIf
  
  // Get the value of field 'x'
  cCommand := 'get x'
  oRedisClient:Exec(cCommand, @retVal)
  
  // If the execution wasn't fine
  If .Not. oRedisClient:lOk
    ConOut("Could not Exec('" + cCommand + "')")
    VarInfo("State of object: ", oRedisCli)
  
    oRedisClient:Disconnect()
      
    Return .F.
  EndIf
  
  ConOut("Successful Exec('" + cCommand + "')")
        
  If ValType(retVal) != 'C'
    cMsg := cValToChar(retVal)
  Else
    cMsg := retVal 
  EndIf 
   
  ConOut("Exec() result: " + cMsg)
   
  VarInfo("State of the object: ", oRedisClient)
  
  oRedisClient:Disconnect()
Return .T.