Dispara a execução de um comando a ser processado pelo servidor Redis.
Sintaxe
oRedisAfter := oRedisClient:Exec(cCommand, [cParam, ] @retVal)
Parâmetros
Nome | Tipo | Descrição | Obrigatório | Referência | Observações |
---|
cCommand | Caracter | Comando Redis a ser executado | X |
|
|
cParameter | Caracter | Complemento do comando |
|
| Substituirá a interrogação (ou ? ) eventual no comando. |
retVal | Variável | Receberá o resultado da execução | X | X |
|
Retorno
Nome | Tipo | Descrição | Observações |
---|
oRedisAfter | objeto tRedisClient | Có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,
oRedisCli:Exec(cCommand, @retVal):lOk
testará se o comando foi bem sucedido, sem a necessidade de uma consulta à parte a ::lOk
sobre o objeto oRedisClient
.
Observações
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 set
retorna uma cadeia de caracteres, ou string.
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("tec-clima", 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.