Saltar para o conteúdo principal
Versão: 20 R6

DataStore

Um Datastore é o objeto de interface fornecido pelo ORDA para fazer referência e acessar um banco de dados. Os objetos Datastore são retornados pelos seguintes comandos:

  • ds: um atalho para o datastore principal
  • Abrir datastore: para abrir qualquer datastore remoto

Resumo

.cancelTransaction()
cancela a transação
.clearAllRemoteContexts()
limpa todos os atributos de todos os contextos ativos no repositório de dados
.dataclassName : 4D.DataClass
contém uma descrição da dataclass
.encryptionStatus(): Object
retorna um objeto que fornece o status de criptografia para o arquivo de dados atual
.flushAndLock()
libera o cache do armazenamento de dados local e impede que outros processos executem operações de gravação no banco de dados
.getAllRemoteContexts() : Collection
retorna uma coleção de objetos contendo informações sobre todos os contextos de otimização ativos no repositório de dados
.getGlobalStamp() : Real
retorna o valor atual do carimbo de modificação global do datastore
.getInfo(): Object
retorna um objeto que fornece informações sobre o datastore
.getRemoteContextInfo(contextName : Text) : Object
retorna um objeto que contém informações sobre o contexto de otimização contextName no datastore
.getRequestLog() : Collection
retorna as solicitações ORDA registradas na memória no lado do cliente
.locked() : Boolean
retorna True se o armazenamento de dados local estiver bloqueado no momento
.makeSelectionsAlterable()
define todas as seleções de entidades como alteráveis por padrão nos datastores do aplicativo atual
.provideDataKey( curPassPhrase : Text ) : Object
.provideDataKey( curDataKey : Object ) : Object

permite fornecer uma chave de criptografia de dados para o arquivo de dados atual do armazenamento de dados e detecta se a chave corresponde aos dados criptografados
.setAdminProtection( status : Boolean )
permite desativar qualquer acesso a dados na porta de administração da Web, inclusive para o Data Explorer em sessões WebAdmin
.setGlobalStamp( newStamp : Real)
define newStamp como o novo valor para o carimbo de modificação global atual do datastore
.setRemoteContextInfo( contextName : Text ; dataClassName : Text ; attributes : Text {; contextType : Text { ; pageLength : Integer}})
.setRemoteContextInfo( contextName : Text ; dataClassName : Text; attributesColl : Collection {; contextType : Text { ; pageLength : Integer }} )
.setRemoteContextInfo( contextName : Text ; dataClassObject : 4D.DataClass ; attributes : Text {; contextType : Text { ; pageLength : Integer }})
.setRemoteContextInfo( contextName : Text ; dataClassObject : 4D.DataClass ; attributesColl : Collection {; contextType : Text { ; pageLength : Integer }} )

vincula os atributos da dataclass especificada ao contexto de otimização contextName
.startRequestLog()
.startRequestLog( file : 4D.File )
.startRequestLog( file : 4D.File ; options : Integer )
.startRequestLog( reqNum : Integer )

inicia o registro de solicitações ORDA no lado do cliente ou no lado do servidor
.startTransaction()
inicia uma transação no processo atual no banco de dados correspondente ao armazenamento de dados ao qual ela se aplica
.stopRequestLog()
interrompe qualquer registro de solicitações ORDA na máquina em que é chamada (cliente ou servidor)
.unlock()
remove o bloqueio atual das operações de gravação no datastore, se ele tiver sido definido no mesmo processo
.validateTransaction()
aceita a transação

ds

História
ReleaseMudanças
18Suporte do parámetro localID
17Adicionado

ds { ( localID : Text ) } : cs.DataStore

ParâmetroTipoDescrição
localIDText->ID local del armazém de dados remoto a devolver
Resultadoscs. DataStore<-Referencia ao armazém de dados

Descrição

O comando ds retorna uma referência ao datastore que corresponde ao banco de dados 4D atual ou ao banco de dados designado por localID.

Se omitir o parâmetro localID (ou se passa uma string vazia ""), o comando devolve uma referência ao armazém de dados que coincide com a base de dados local de 4D (ou a base de datos de 4D Server em caso de abrir uma base de dados remota em 4D Server). O repositório de dados é aberto automaticamente e está disponível diretamente por meio do ds.

Você também pode obter uma referência em um datastore remoto aberto passando seu ID local no parâmetro localID. O datastore deve ter sido aberto anteriormente com o comando Open datastore pelo banco de dados atual (host ou componente). A identificação local se define quando se utilizar este comando.

O escopo do id local do banco de dados no qual o armazen de dados foi aberto.

Se nenhum datastore localID for encontrado, o comando retornará Null.

Os objetos disponíveis no cs.Datastore são mapeados a partir do banco de dados de destino de acordo com as [regras gerais do ORDA] (ORDA/dsMapping.md#general-rules).

Exemplo 1

Usar a datastore principal do banco de dados 4D:

 $result:=ds. Employee.query("firstName = :1";"S@")

Exemplo 2

 var $connectTo; $firstFrench; $firstForeign : Object

var $frenchStudents; $foreignStudents : cs.DataStore

$connectTo:=New object("type";"4D Server";"hostname";"192.168.18.11:8044")
$frenchStudents:=Open datastore($connectTo;"french")

$connectTo.hostname:="192.168.18.11:8050"
$foreignStudents:=Open datastore($connectTo;"foreign")
//...
//...
$firstFrench:=getFirst("french";"Students")
$firstForeign:=getFirst("foreign";"Students")
  //getFirst method
//getFirst(localID;dataclass) -> entity
#DECLARE( $localId : Text; $dataClassName : Text ) -> $entity : 4D.Entity

$0:=ds($localId)[$dataClassName].all().first()

Open datastore

História
ReleaseMudanças
20 R6Suporte ao acesso a instâncias Qodly
20 R4Nova propriedade passwordAlgorithm
18Adicionado

Open datastore( connectionInfo : Object ; localID : Text ) : cs.DataStore

ParâmetroTipoDescrição
connectionInfoObject->Propriedades de conexão utilizadas para alcançar o armazém de datos remoto
localIDText->Id para assignar ao armazém de dados aberto na aplicação local (obrigatorio)
Resultadoscs. DataStore<-Objeto do armazém de dados

Descrição

The Open datastore command connects the application to the remote datastore identified by the connectionInfo parameter and returns a matching cs.DataStore object associated with the localID local alias.

Os seguintes datastores remotos são compatíveis com o comando:

tipo de datastoreDescrição
Aplicação 4D remotoA 4D application available as a remote datastore, i.e.:
  • its web server is launched with http and/or https enabled,
  • its datastore is exposed to REST (Expose as REST server option checked).
  • A license can be required (see note)
    Aplicação QodlyUm aplicativo Qodly Server que forneceu a você um api endpoint e uma api key válida associada a um cargo definido. You must pass the api key in the api-key property of the connectionInfo object. You can then work with the returned datastore object, with all privileges granted to the associated role.
    nota

    Open datastore requests rely on the 4D REST API and can require a 4D Client license to open the connection on a remote 4D Server. Consulte a seção user login mode para saber como configurar a autenticação dependendo do modo de login do usuário atual selecionado.

    Passe em connectionInfo um objeto que desceva o armazém de dados remoto ao que quiser se conectar. Pode conter as propriedades abaixo (todas as propriedades são opcionais menos hostname):

    PropriedadeTipoAplicação 4D remotoAplicação Qodly
    hostnameTextNome ou endereço IP da database remota + ":" + número de porta (o numero de porta é obrigatório)API Endpoint de instância Qodly cloud
    userTextNome de usuario- (ignorado)
    senhaTextsenha de usuario- (ignorado)
    idleTimeoutIntegerTempo de espera da sessão de inatividade (em minutos) depois do qual a sessão é fechada automaticamente por 4D. Se omitido, o valor por defeito é 60 (1h). O valor não pode ser < 60 (se for passado um valor menor, o tempo limite será definido como 60). Para obter mais informações, veja Sessões de encerramento.- (ignorado)
    tlsParâmetrosTrue para usar conexão segura(1). Se omitido, false por defeito. Se for omitido, o normal é falso Usar uma conexão segura é recomendado sempre que possível.True para usar conexão segura. Se omitido, false por defeito
    typeTextdeve ser "4D Server"- (ignorado)
    api-keyText- (ignorado)API key da instância Qodly cloud

    (1) Se tls for true, o protocolo HTTPS é utilizado se:

    • HTTPS for ativado no armazém de dados remoto
    • o número de porto especificado coincide com o porto HTTPS configurado nos ajustes do banco de dados
    • a valid certificate and private encryption key are installed in the 4D application. Senão é mostrado o erro "1610 - A remote request to host xxx has failed"

    localID é um alias local para a sessão aberta no armazenamento de dados remoto. Se localID já existir no aplicativo, ele será usado. Caso contrário, uma nova sessão localID é criada quando o objeto de armazenamento de dados é usado.

    Quando abrir a sessão, as sentenças abaixo são equivalentes e devolvem uma referência sobre o mesmo objeto datastore:

     $myds:=Open datastore(connectionInfo;"myLocalId")
    $myds2:=ds("myLocalId")
    //$myds e $myds2 são equivalentes

    Objects available in the cs.Datastore are mapped with respect to the ORDA general rules.

    Se não for encontrado um datastore correspondente, Open datastore retornará Null.

    Exemplo 1

    Conexão a uma datastore remota com usuário/ senha/ timetou/ tls

     var $connectTo : Object
    var $remoteDS : cs. DataStore
    $connectTo:=New object("type";"4D Server";"hostname";"192.168.18.11:8044")
    $remoteDS:=Open datastore($connectTo;"students")
    ALERT("This remote datastore contains "+String($remoteDS. Students.all().length)+" students")

    Exemplo 2

    Conexão a uma datastore remota sem usuário ou senha:

     var $connectTo : Object
    var $remoteDS : cs. DataStore
    $connectTo:=New object("type";"4D Server";"hostname";\"192.168.18.11:4443";\
    "user";"marie";"password";$pwd;"idleTimeout";70;"tls";True)
    $remoteDS:=Open datastore($connectTo;"students")
    ALERT("This remote datastore contains "+String($remoteDS. Students.all().length)+" students")

    Exemplo 3

    Trabalhando com várias datastores remotas:

     var $connectTo : Object
    var $frenchStudents; $foreignStudents : cs. DataStore
    $connectTo:=New object("hostname";"192.168.18.11:8044")
    $frenchStudents:=Open datastore($connectTo;"french")
    $connectTo.hostname:="192.168.18.11:8050"
    $foreignStudents:=Open datastore($connectTo;"foreign")
    ALERT("They are "+String($frenchStudents. Students.all().length)+" French students")
    ALERT("They are "+String($foreignStudents. Students.all().length)+" foreign students")

    Exemplo

    Conexão com uma aplicação Qodly:

    var $connectTo : Object:={hostname: "https://xxx-x54xxx-xx-xxxxx-8xx5-xxxxxx.xx-api.cloud.com"; tls: True}

    var $remoteDS : 4D.DataStoreImplementation
    var $data : 4D.EntitySelection

    $connectTo["api-key"]:="fxxxx-xxxx-4xxx-txxx-xxxxxxxx0" //only for example purpose
    //it is recommended to store the API key in a secured place (e.g. a file)
    //and to load it in the code

    $remoteDS:=Open datastore($connectTo; "remoteId")
    $data:=$remoteDS.item.all()

    ALERT(String($data.length)+" items have been read")

    Gestão de erros

    Em caso de erro, o comando retorna Null. Se não for possível acessar o armazem de dados remotos (endereço incorreto, servidor web não inciiado, http e https não habilitados...), se produz o erro 1610 " Uma petição remota ao host XXX falhou". Você pode interceptar esse erro com um método instalado por ON ERR CALL.

    .dataclassName

    História
    ReleaseMudanças
    17Adicionado

    .dataclassName : 4D.DataClass

    Descrição

    Cada classe de dados em um datastore está disponível como uma propriedade do [objeto DataStore] (ORDA/dsMapping.md#datastore). O objeto retornado contém uma descrição da dataclass.

    Exemplo

     var $emp : cs. Employee
    var $sel : cs. EmployeeSelection
    $emp:=ds. Employee //$emp contains the Employee dataclass
    $sel:=$emp.all() //gets an entity selection of all employees

    //you could also write directly:
    $sel:=ds. Employee.all()

    .cancelTransaction()

    História
    ReleaseMudanças
    18Adicionado

    .cancelTransaction()

    ParâmetroTipoDescrição
    Não exige nenhum parâmetro

    Descrição

    A função .cancelTransaction() cancela a transação aberta pela função .startTransaction() no nível correspondente no processo atual para o armazenamento de dados especificado.

    A função .cancelTransaction() cancela todas as alterações feitas nos dados durante a transação.

    Pode aninhar várias transações (subtransações). Se a transação principal for cancelada, todas as suas subtransações também serão canceladas, mesmo que tenham sido validadas individualmente usando a função .validateTransaction().

    Exemplo

    Veja o exemplo da função .startTransaction().

    .clearAllRemoteContexts()

    História
    ReleaseMudanças
    19 R5Adicionado

    .clearAllRemoteContexts()

    ParâmetroTipoDescrição
    Não exige nenhum parâmetro

    Descrição

    A função .clearAllRemoteContexts() limpa todos os atributos de todos os contextos ativos no repositório de dados.

    Esta função é utilizada principalmente no contexto da depuração. Deve lembrar que quando abrir o depurador ele envia petições ao servidor e pesquisa todos os atributos de dataclasse para exibi-los Isso pode sobrecarregar seus contextos com dados desnecessários. Isso pode sobrecarregar seus contextos com dados desnecessários.

    Nesses casos, você pode usar .clearAllRemoteContexts() para limpar seus contextos e mantê-los limpos.

    Veja também

    .getRemoteContextInfo()
    .getAllRemoteContexts()
    .setRemoteContextInfo()

    .encryptionStatus()

    História
    ReleaseMudanças
    17 R5Adicionado

    .encryptionStatus(): Object

    ParâmetroTipoDescrição
    ResultadosObject<-Informação sobre o cifrado do armazém de dados atual e de cada tabela

    Descrição

    A função .encryptionStatus() retorna um objeto que fornece o status de criptografia para o arquivo de dados atual (ou seja, o arquivo de dados do armazenamento de dados ds). Também se proporciona o estado de cada tabela.

    Use o comando Data file encryption status para determinar o status da criptografia de qualquer outro arquivo de dados.

    Valor retornado

    O objeto retornado contém as propriedades abaixo:

    PropriedadeTipoDescrição
    isEncryptedParâmetrosTrue se o arquivo de dados estiver criptografado
    keyProvidedParâmetrosTrue se proporcionar a chave de encriptação que coincide com o arquivo de dados encriptados(*).
    tabelasObjectObjeto que contém tantas propriedades como tabelas encriptadas ou codificadas.
    tableNameObjectTabla encriptada ou cifrada
    nameTextNombre da tabela
    numNumberNúmero de tabela
    isEncryptableParâmetrosVerdadero se a tabela estiver declarada como encriptada no arquivo de estrutura
    isEncryptedParâmetrosTrue se os registros da tabela estiverem encriptados no arquivo de dados

    (*) a chave de criptografia pode ser fornecida:

    • com o comando .provideDataKey(),
    • na raíz de um dispositivo conectado antes de abrir o datastore,
    • com o comando Discover data key.

    Exemplo

    Se quiser saber o número de tabelas criptografadas no arquivo de dados atual:

     var $status : Object

    $status:=ds.encryptionStatus()

    If($status.isEncrypted) //o banco é criptografado
    C_LONGINT($vcount)
    C_TEXT($tabName)
    For each($tabName;$status.tables)
    If($status.tables[$tabName].isEncrypted)
    $vcount:=$vcount+1
    End if
    End for each
    ALERT(String($vcount)+" encrypted table(s) in this datastore.")
    Else
    ALERT("This database is not encrypted.")
    End if

    .flushAndLock()

    História

    |Lançamento|Mudanças|

    |---|---| |20|Adicionado|

    .flushAndLock()

    ParâmetroTipoDescrição
    Não exige nenhum parâmetro

    Descrição

    A função .flushAndLock() libera o cache do armazenamento de dados local e impede que outros processos executem operações de gravação no banco de dados. O datastore é definido para um estado consistente e congelado. É necessário chamar esta função antes de executar um instantâneo da aplicação, por exemplo.

    info

    Esta função só pode ser chamada:

    • no repositório de dados local (ds).
    • no ambiente cliente/servidor, na máquina do servidor.

    Depois que essa função é executada, as operações de gravação, como .save() ou outras chamadas .flushAndLock(), são congeladas em todos os outros processos até que o armazenamento de dados seja desbloqueado.

    Quando múltiplas chamadas para .flushAndLock() foram feitas no mesmo processo, o mesmo número de .unlock() chamadas devem ser executadas para realmente desbloquear o datastore.

    O datastore é desbloqueado quando:

    • a função .unlock() é chamada no mesmo processo, ou
    • o processo que chamou a função .flushAndLock() é morto.

    Se o repositório de dados já estiver bloqueado por outro processo, a chamada .flushAndLock() será congelada e executada quando o repositório de dados for desbloqueado.

    Um erro é acionado se a função .flushAndLock() não puder ser executada (por exemplo, é executada num 4D remoto), .

    caution

    Outros recursos e serviços 4D, incluindo backup, vss e MSC também pode bloquear o datastore. Antes de chamar .flushAndLock(), certifique-se de que nenhuma outra ação de bloqueio está sendo usada, a fim de evitar qualquer interação inesperada.

    Exemplo

    Se quiser criar uma cópia da pasta de dados juntamente com o seu arquivo de diário actual:

    $destination:=Folder(fk documents folder).folder("Archive") 
    $destination.create()

    ds.flushAndLock() //Bloqueia operações write de outros processos

    $dataFolder:=Folder(fk data folder)
    $dataFolder.copyTo($destination) //Copia a pasta de dados

    $oldJournalPath:=New log file //Fecha o diário e cria um novo
    $oldJournal:=File($oldJournalPath; fk platform path)
    $oldJournal.moveTo($destination) //Salva o diário antigo com dados

    ds.unlock() //Nossa cópia terminou, podemos desbloquear a datastore

    Veja também

    .locked()
    .unlock()

    .getAllRemoteContexts()

    História
    ReleaseMudanças
    19 R5Adicionado

    .getAllRemoteContexts() : Collection

    ParâmetroTipoDescrição
    ResultadosCollection<-Colecção de objectos de contexto de optimização

    Modo avançado: Essa função é destinada a desenvolvedores que precisam personalizar os recursos padrão do ORDA para configurações específicas. Na maioria dos casos, não necessitará de o utilizar.

    Descrição

    A função .getAllRemoteContexts() retorna uma coleção de objetos contendo informações sobre todos os contextos de otimização ativos no repositório de dados.

    Para obter mais informações sobre como os contextos podem ser criados, consulte otimização do cliente/servidor.

    Cada objeto na coleção retornada tem as propriedades listadas na seção .getRemoteContextInfo().

    Exemplo

    O seguinte código configura dois contextos e os recupera usando .getAllRemoteContexts():

    var $ds : 4D. DataStoreImplementation
    var $persons : cs. PersonsSelection
    var $addresses : cs. AddressSelection
    var $p : cs. PersonsEntity
    var $a : cs. AddressEntity
    var $contextA; $contextB : Object
    var $info : Collection
    var $text : Text

    // Open remote datastore
    $ds:=Open datastore(New object("hostname"; "www.myserver.com"); "myDS")

    // Set context A
    $contextA:=New object("context"; "contextA")
    $persons:=$ds. Persons.all($contextA)
    $text:="" For each ($p; $persons)
    $text:=$p.firstname+" lives in "+$p.address.city+" / " End for each

    // Set context B
    $contextB:=New object("context"; "contextB")
    $addresses:=$ds. Address.all($contextB)
    $text:="" For each ($a; $addresses)
    $text:=$a.zipCode End for each

    // Get all remote contexts (in this case, contextA and contextB)
    $info:=$ds.getAllRemoteContexts()
    //$info = [{name:"contextB"; dataclass:"Address"; main:"zipCode"},
    {name:"contextA";dataclass:"Persons";main:"firstname,address.city"}]

    Este exemplo serve como uma demonstração, não se destina a uma implementação real.

    Veja também

    .getRemoteContextInfo()
    .setRemoteContextInfo()
    .clearAllRemoteContexts()

    .getGlobalStamp()

    História
    ReleaseMudanças
    20 R3Adicionado

    .getGlobalStamp() : Real

    ParâmetroTipoDescrição
    ResultadosReal<-Valor atual do marcador de modificação global

    Descrição

    A função .getGlobalStamp() retorna o valor atual do carimbo de modificação global do datastore.

    info

    Esta função só pode ser chamada:

    • no repositório de dados local (ds).
    • no ambiente cliente/servidor, na máquina do servidor.

    Para obter mais informações sobre o carimbo global e o rastreamento de alterações de dados, consulte a página Using the Global Stamp.

    Exemplo

    var $currentStamp : Real
    var $hasModifications : Boolean

    $currentStamp:=ds.getGlobalStamp()
    methodWhichCouldModifyEmployees //chamar algum código
    $hasModifications:=($currentStamp # ds.getGlobalStamp())

    Veja também

    .setGlobalStamp()

    .getInfo()

    História
    ReleaseMudanças
    17Adicionado

    .getInfo(): Object

    ParâmetroTipoDescrição
    ResultadosObject<-Propiedades de datastore

    Descrição

    A função .getInfo() retorna um objeto que fornece informações sobre o datastore. Esta função é útil para configurar o código genérico.

    Objeto devolvido

    PropriedadeTipoDescrição
    typestring
  • "4D": repositório de dados principal, disponível por meio do ds
  • "4D Server": repositório de dados remoto, aberto com Open datastore
  • networkedboolean
  • True: o armazenamento de dados é acessado por meio de uma conexão de rede.
  • False: o armazenamento de dados não é acessado por meio de uma conexão de rede (banco de dados local)
  • localIDtextID do armazém de dados na máquina. ID do armazém de dados na máquina. String vazia ("") para o datastore principal.
    connectionobjectObjeto descrevendo a conexão remota da datastore (não retornado para datastore principal) Propriedades disponiveis: Propriedades disponiveis: Objeto descrevendo a conexão remota da datastore (não retornado para datastore principal) Propriedades disponiveis: Propriedades disponiveis: Propriedades disponíveis:
    PropriedadeTipoDescrição
    hostnametextoEndereço IP ou nome do datastore remoto + ":" + número da porta
    tlsbooleanoTrue se a conexão segura é usada com o datastore remoto
    idleTimeoutnúmeroTempo limite de inatividade da sessão (em minutos)
    usertextoUsuário autenticado no datastore remoto
    • Se a função .getInfo() for executada em um servidor 4D ou um único usuário, networked é Falso.
    • Se a função .getInfo() for executada em um 4D remoto, networked será True

    Exemplo 1

     var $info : Object

    $info:=ds.getInfo() //Executado em 4D Server ou 4D
    //{"type":"4D","networked":false,"localID":""}

    $info:=ds.getInfo() // Executado em 4D remoto
    //{"type":"4D","networked":true,"localID":""}

    Exemplo 2

    Em um armazém de dados remoto:

      var $remoteDS : cs.DataStore
    var $info; $connectTo : Object

    $connectTo:=New object("hostname";"111.222.33.44:8044";"user";"marie";"password";"aaaa")
    $remoteDS:=Open datastore($connectTo;"students")
    $info:=$remoteDS.getInfo()

    //{"type":"4D Server",
    //"localID":"students",
    //"networked":true,
    //"connection":{hostname:"111.222.33.44:8044","tls":false,"idleTimeout":2880,"user":"marie"}}

    .getRemoteContextInfo()

    História
    ReleaseMudanças
    19 R5Adicionado

    .getRemoteContextInfo(contextName : Text) : Object

    ParâmetroTipoDescrição
    contextNameText->Nome do contexto
    ResultadosObject<-Descrição do contexto de optimização

    Modo avançado: Essa função é destinada a desenvolvedores que precisam personalizar os recursos padrão do ORDA para configurações específicas. Na maioria dos casos, não necessitará de o utilizar.

    Descrição

    A função .getRemoteContextInfo() retorna um objeto que contém informações sobre o contexto de otimização contextName no datastore.

    Para saber mais informações sobre como os contextos de otimização podem ser criados, veja otimização cliente/servidor.

    Objeto devolvido

    O objeto retornado tem as propriedades abaixo:

    PropriedadeTipoDescrição
    nameTextNome do contexto
    mainTextAtributo(s) associado(s) ao contexto (os nomes dos atributos são separados por uma vírgula)
    dataclassTextNome do dataclass
    currentItem (opcional)TextOs atributos do modo de página se o contexto estiver vinculado a uma caixa de listagem. Retornado como Null ou elemento de texto vazio se o nome do contexto não for usado para uma caixa de listagem ou se não houver contexto para o currentItem

    Como os contextos se comportam como filtros para atributos, se main for retornado vazio, isso significa que nenhum filtro foi aplicado e que o servidor retorna todos os atributos da classe de dados.

    Exemplo

    Consulte o exemplo da seção .setRemoteContextInfo().

    Veja também

    .setRemoteContextInfo()
    .getAllRemoteContexts()
    .clearAllRemoteContexts()

    .getRequestLog()

    História
    ReleaseMudanças
    17 R6Adicionado

    .getRequestLog() : Collection

    ParâmetroTipoDescrição
    ResultadosCollection<-Coleção de objetos onde cada objeto descreve uma petição

    Descrição

    A função .getRequestLog() retorna as solicitações ORDA registradas na memória no lado do cliente. O registro de solicitações ORDA deve ter sido previamente ativado com a função .startRequestLog().

    Esta função deve ser chamada em um 4D remoto, do contrário devolve uma coleção vazia. Foi criado para depuração em configurações de cliente/servidor.

    Valor retornado

    Coleção de objetos de petição empilhados. A petição mais recente tem indice 0.

    Para obter uma descrição do formato do log de solicitações do ORDA, consulte a seção [ORDA client requests] (https://doc.4d.com/4Dv18/4D/18/Description-of-log-files.300-4575486.en.html#4385373).

    Exemplo

    Consulte o exemplo 2 de .startRequestLog().

    .isAdminProtected()

    História
    ReleaseMudanças
    18 R6Adicionado

    .isAdminProtected() : Boolean

    ParâmetroTipoDescrição
    ResultadosParâmetros<-True se o acesso ao Explorador de Dados estiver desativado, False se estiver ativado (por padrão)

    Descrição

    A função .isAdminProtected() retorna True se o acesso ao Data Explorer tiver sido desativado para a sessão de trabalho.

    Por padrão, o acesso ao Data Explorer é concedido para sessões webAdmin, mas pode ser desativado para impedir qualquer acesso aos dados por parte dos administradores (consulte a função .setAdminProtection()).

    Veja também

    .setAdminProtection()

    .locked()

    História
    ReleaseMudanças
    20Adicionado

    .locked() : Boolean

    ParâmetroTipoDescrição
    ResultadosParâmetros<-Verdadeiro se trancado

    Descrição

    A função .locked() retorna True se o armazenamento de dados local estiver bloqueado no momento.

    Você pode bloquear o armazenamento de dados usando a função .flushAndLock() antes de executar um instantâneo do arquivo de dados, por exemplo.

    caution

    A função também retornará True se o datastore tiver sido bloqueado por outro recurso de administração, como backup ou vss (consulte .flushAndLock()).

    Veja também

    .flushAndLock()
    .unlock()

    .makeSelectionsAlterable()

    História
    ReleaseMudanças
    18 R5Adicionado

    .makeSelectionsAlterable()

    ParâmetroTipoDescrição
    Não exige nenhum parâmetro

    Descrição

    A função .makeSelectionsAlterable() define todas as seleções de entidades como alteráveis por padrão nos datastores do aplicativo atual (incluindo datastores remotos). Ele deve ser usado uma vez, por exemplo, no método de banco de dados On Startup.

    Quando essa função não é chamada, as novas seleções de entidades podem ser compartilháveis, dependendo da natureza de seu "pai" ou [como elas são criadas] (ORDA/entities.md#shareable-or-non-shareable-entity-selections).

    Essa função não modifica as seleções de entidades criadas por .copy() ou OB Copy quando a opção explícita ck shared é utilizada.

    Compatibilidade: Essa função só deve ser usada em projetos convertidos de versões 4D anteriores ao 4D v18 R5 e que contenham chamadas .add(). Nesse contexto, o uso de .makeSelectionsAlterable() pode economizar tempo ao restaurar instantaneamente o comportamento 4D anterior em projetos existentes. Por outro lado, o uso desse método em novos projetos criados no 4D v18 R5 e superior não é recomendado, pois impede que as seleções de entidades sejam compartilhadas, o que proporciona maior desempenho e escalabilidade.

    .provideDataKey()

    História
    ReleaseMudanças
    17 R5Adicionado

    .provideDataKey( curPassPhrase : Text ) : Object
    .provideDataKey( curDataKey : Object ) : Object

    ParâmetroTipoDescrição
    curPassPhraseText->Frase de cifrado atual
    curDataKeyObject->Chave de criptografia de dados atual
    ResultadosObject<-Resultado da coincidência da chave de criptografia

    Descrição

    A função .provideDataKey() permite fornecer uma chave de criptografia de dados para o arquivo de dados atual do armazenamento de dados e detecta se a chave corresponde aos dados criptografados. Esta função pode ser utilizada ao abrir um banco de dados criptografado, ou ao executar qualquer operação de criptografia que precise da chave de criptografia, como por exemplo voltar a criptografar o arquivo de dados.

    • A função .provideDataKey() deve ser chamada em um banco de dados criptografado. Se for chamado em um banco de dados não criptografado, o erro 2003 (a chave de criptografia não corresponde aos dados) é retornado. é retornado. Use o comando Data file encryption status para determinar se o banco de dados está criptografado.
    • A função .provideDataKey() não pode ser chamada de um 4D remoto ou de um datastore remoto criptografado.

    Se você usar o parâmetro curPassPhrase, passe a cadeia de caracteres usada para gerar a chave de criptografia de dados. Quando usar este parâmetro, uma chave de criptografia é gerada.

    Se você usar o parâmetro curDataKey, passe um objeto (com a propriedade encodedKey) que contenha a chave de criptografia de dados. Essa chave pode ter sido gerada com o comando New data key.

    Se for fornecida uma chave de criptografia de dados válida, ela será adicionada à keyChain na memória e o modo de criptografia será ativado:

    • todas as modificações de dados nas tabelas encriptadas são cifradas no disco (.4DD, .journal. 4Dindx)
    • todos os dados carregados desde tabelas criptografadas são descifradas na memória

    Resultado

    O resultado da ordem se descreve no objeto devolvido:

    PropriedadeTipoDescrição
    successParâmetrosTrue se a chave da criptografia proporcionada coincide com os dados encriptados, False em caso contrário
    As propriedades abaixo são retornadas somente se o sucesso for FALSE
    statusNumberCódigo de erro (4 se a chave de encriptação fornecida for errada)
    statusTextTextMensagem de erro
    errorsCollectionPilha de erros. O primeiro erro tem o índice mais alto
    [ ].componentSignatureTextNome do componente interno
    [ ].errCodeNumberNúmero de erro
    [ ].messageTextMensagem de erro

    Se nenhuma curPassphrase ou curDataKey for fornecida, .provideDataKey() retornará null (nenhum erro será gerado).

    Exemplo

     var $keyStatus : Object
    var $passphrase : Text

    $passphrase:=Request("Enter the passphrase")
    If(OK=1)
    $keyStatus:=ds.provideDataKey($passphrase)
    If($keyStatus.success)
    ALERT("You have provided a valid encryption key")
    Else
    ALERT("You have provided an invalid encryption key, you will not be able to work with encrypted data")
    End if
    End if

    .setAdminProtection()

    História
    ReleaseMudanças
    18 R6Adicionado

    .setAdminProtection( status : Boolean )

    ParâmetroTipoDescrição
    statusParâmetros->True para desativar o acesso do Data Explorer aos dados na porta webAdmin, False (padrão) para conceder acesso

    Descrição

    A função .setAdminProtection() permite desativar qualquer acesso a dados na porta de administração da Web, inclusive para o Data Explorer em sessões WebAdmin.

    Por padrão, quando a função não é chamada, o acesso aos dados é sempre concedido na porta de administração web para uma sessão com privilégio WebAdmin utilizando o Explorador de Dados. Em algumas configurações, por exemplo, quando o servidor de aplicações estiver alojado em uma máquina de terceiros, é possivel que não quiser que o administrador possaa ver seus dados, mesmo que possa editar a configuração do servidor, incluindo a configuração da access key.

    Neste caso, você pode chamar esta função para desabilitar o acesso aos dados do Explorador de Dados na porta de administração web da máquina, mesmo que a sessão do usuário tenha o privilégio WebAdmin. Quando esta função for executada, o arquivo de dados é protegido imediatamente e o estado é armazenado no disco: o arquivo de dados é protegido mesmo se a aplicação for restaurada.

    Exemplo

    Você cria um método de projeto protectDataFile para chamar antes das implementações, por exemplo:

     ds.setAdminProtection(True) //Desativa o acesso aos dados do Explorador de dados

    Veja também

    .isAdminProtected()

    .setGlobalStamp()

    História
    ReleaseMudanças
    20 R3Adicionado

    .setGlobalStamp( newStamp : Real)

    ParâmetroTipoDescrição
    newStampReal->Novo valor do marcador de modificação global
    Modo avançado

    Essa função é destinada a desenvolvedores que precisam modificar o valor atual do marcador global. Ele deve ser usado com cuidado.

    Descrição

    A função .setGlobalStamp() define newStamp como o novo valor para o carimbo de modificação global atual do datastore.

    info

    Esta função só pode ser chamada:

    • no repositório de dados local (ds).
    • no ambiente cliente/servidor, na máquina do servidor.

    Para obter mais informações sobre o carimbo global e o rastreamento de alterações de dados, consulte a página Using the Global Stamp.

    Exemplo

    O código a seguir define o carimbo global de modificação:

    var $newValue: Real
    $newValue:=ReadValueFrom //obtém um novo valor para atribuir
    ds.setGlobalStamp($newValue)

    Veja também

    .getGlobalStamp()

    .setRemoteContextInfo()

    História
    ReleaseMudanças
    19 R5Adicionado

    .setRemoteContextInfo( contextName : Text ; dataClassName : Text ; attributes : Text {; contextType : Text { ; pageLength : Integer}})
    .setRemoteContextInfo( contextName : Text ; dataClassName : Text; attributesColl : Collection {; contextType : Text { ; pageLength : Integer }} )
    .setRemoteContextInfo( contextName : Text ; dataClassObject : 4D.DataClass ; attributes : Text {; contextType : Text { ; pageLength : Integer }})
    .setRemoteContextInfo( contextName : Text ; dataClassObject : 4D.DataClass ; attributesColl : Collection {; contextType : Text { ; pageLength : Integer }} )

    ParâmetroTipoDescrição
    contextNameText->Nome do contexto
    dataClassNameText->Nome da dataclass
    dataClassObject4D. DataClass->dataclass object (e.g datastore. Employee)
    attributesText->Lista de atributos separada por vírgulas
    Atributos do tipo BLOB não são gerenciados na datastore.Collection->Coleção de nomes de atributos (text)
    contextTypeText->Se fornecido, o valor deve ser "main" ou "currentItem"
    pageLengthInteger->Duração da página da selecção da entidade ligada ao contexto (por padrão é 80)

    Modo avançado: Essa função é destinada a desenvolvedores que precisam personalizar os recursos padrão do ORDA para configurações específicas. Na maioria dos casos, não necessitará de o utilizar.

    Descrição

    A função .setRemoteContextInfo() vincula os atributos da dataclass especificada ao contexto de otimização contextName. Se já existir um contexto de optimização para os atributos especificados, este comando substitui-o.

    Quando se passa um contexto para as funções da classe ORDA, a optimização do pedido REST é desencadeada imediatamente:

    • a primeira entidade não é carregada totalmente, como no modo automático
    • páginas de 80 entidades (ou entidades pageLength) são imediatamente solicitadas ao servidor com apenas os atributos no contexto

    Para obter mais informações sobre como os contextos de otimização são criados, consulte o parágrafo de otimização do cliente/servidor

    Em contextName, passe o nome do contexto de otimização para vincular os atributos da classe de dados.

    Para designar a dataclass que vai receber o contexto, você pode passar um dataClassName ou um dataClassObject.

    Para designar os atributos a serem vinculados ao contexto, passe uma lista de atributos separados por vírgula em attributes (Texto) ou uma coleção de nomes de atributos em attributesColl (coleção de texto).

    Se attributes for um Text vazio ou attributesColl for uma coleção vazia, todos os atributos escalares da classe de dados serão colocados no contexto de otimização. Se passar um atributo que não existir na dataclass, a função a ignora e um erro é enviado.

    Você pode passar um contextType para especificar se o contexto é um contexto padrão ou o contexto do item de seleção de entidade atual exibido em uma caixa de listagem:

    Em pageLength, especificar o número de entidades dataclass a solicitar ao servidor.

    Você pode passar um pageLength para um atributo de relação que é uma seleção de entidade (um para muitos). A sintaxe é relationAttributeName:pageLength (por exemplo, employees:20).

    Exemplo 1

    var $ds : 4D. DataStoreImplementation
    var $persons : cs. PersonsSelection
    var $p : cs. PersonsEntity
    var $contextA : Object
    var $info : Object
    var $text : Text

    // Open remote datastore
    $ds:=Open datastore(New object("hostname"; "www.myserver.com"); "myDS")

    // Set context info
    $contextA:=New object("context"; "contextA")
    $ds.setRemoteContextInfo("contextA"; $ds. Persons; "firstname, lastname")

    // Send requests to the server using a loop
    $persons:=$ds. Persons.all($contextA)
    $text:="" For each ($p; $persons)
    $text:=$p.firstname + " " + $p.lastname End for each

    // Check contents of the context
    $info:=$ds.getRemoteContextInfo("contextA")
    // $info = {name:"contextA";dataclass:"Persons";main:"firstname, lastname"}

    Este exemplo serve como uma demonstração, não se destina a uma implementação real.

    Exemplo 2

    O trecho de código a seguir solicita páginas de 30 entidades da classe de dados Address do servidor. As entidades devolvidas contêm apenas o atributo zipCode.

    Para cada entidade Address, 20 entidades Persons são retornadas, e elas contêm apenas os atributos lastname e firstname:

    var $ds : 4D. DataStoreImplementation

    $ds:=Open datastore(New object("hostname"; "www.myserver.com"); "myDS")

    $ds.setRemoteContextInfo("contextA"; $ds. Address; "zipCode, persons:20,\
    persons.lastname, persons.firstname"; "main"; 30)

    Exemplo 3 - Listbox

    // When the form loads Case of
    : (Form event code=On Load)

    Form.ds:=Open datastore(New object("hostname"; "www.myserver.com"); "myDS")

    // Set the attributes of the page context
    Form.ds.setRemoteContextInfo("LB"; Form.ds. Persons; "age, gender,\
    children"; "currentItem")

    Form.settings:=New object("context"; "LB")
    Form.persons:=Form.ds. Persons.all(Form.settings)
    // Form.persons is displayed in a list box End case

    // When you get the attributes in the context of the current item: Form.currentItemLearntAttributes:=Form.selectedPerson.getRemoteContextAttributes()
    // Form.currentItemLearntAttributes = "age, gender, children"

    Veja também

    .getRemoteContextInfo()
    .getAllRemoteContexts()
    .clearAllRemoteContexts()

    .startRequestLog()

    História
    ReleaseMudanças
    20Suporte do lado do servidor, novo parâmetro options
    17 R6Adicionado

    .startRequestLog()
    .startRequestLog( file : 4D.File )
    .startRequestLog( file : 4D.File ; options : Integer )
    .startRequestLog( reqNum : Integer )

    ParâmetroTipoDescrição
    file4D. File->Objeto File
    optionsInteger->Opção de registo de resposta (apenas servidor)
    reqNumInteger->Número de pedidos a manter na memória (apenas cliente)

    Descrição

    A função .startRequestLog() inicia o registro de solicitações ORDA no lado do cliente ou no lado do servidor. Foi criado para depuração em configurações de cliente/servidor.

    info

    Para uma descrição do formato de log do pedido ORDA, por favor, consulte a seção solicitações ORDA.

    Do lado do cliente

    Para criar um registo de pedidos ORDA do lado do cliente, chame esta função numa máquina remota. O registro pode ser enviado para um arquivo ou para a memória, dependendo do parâmetro:

    • Se você tiver passado um objeto file criado com o comando File, os dados de registro serão gravados nesse arquivo como uma coleção de objetos (formato JSON). Cada objeto representa uma petição.
      Se o arquivo não existir, será criado. No caso contrário, ou seja, se o arquivo já existir, os novos dados de registro serão adicionados a ele. Se chamar a.startRequestLog() com um arquivo enquanto se iniciou previamente um registro na memória, o registro em memória para e é esvaziado.

    Deve adicionar manualmente um caractere \N ao final do arquivo para realizar uma validação JSON

    • Se você passou um número inteiro reqNum, o registro na memória é esvaziado (se houver) e um novo registro é inicializado. Vai manter reqNum petições em memória até que se alcance o número, em cujo caso se esvaziam as entradas mais antigas (pilha FIFO).
      Se chamar a.startRequestLog() com um reqNum enquanto tiver iniciado previamente um registro em um arquivo, se para o registro do arquivo.

    • Se não tiver passado nenhum parâmetro, o registro se inicia na memória. Se .startRequestLog() tiver sido chamado anteriormente com um reqNum (antes de .stopRequestLog()), os dados de registro serão empilhados na memória até a próxima vez que o registro for esvaziado ou .stopRequestLog() for chamado.

    Do lado do servidor

    Para criar um registro de pedidos ORDA no lado do servidor, chame essa função no máquina servidor. Para criar um registro de pedidos ORDA no lado do servidor, chame essa função no máquina servidor. Cada objeto representa um pedido. Se o ficheiro ainda não existir, é criado. No caso contrário, ou seja, se o arquivo já existir, os novos dados de registro serão adicionados a ele.

    • Se você passou o parâmetro file, os dados de registro serão gravados nesse arquivo, no local solicitado. - Se você omitir o parâmetro file ou se ele for nulo, os dados de registro serão gravados em um arquivo chamado ordaRequests.jsonl e armazenados na pasta "/LOGS".
    • O parâmetro opções pode ser usado para especificar se a resposta do servidor tem de ser registrada e se deve incluir o corpo. Por padrão, quando o parâmetro é omisso, a resposta completa é registrada. As seguintes constantes podem ser utilizadas neste parâmetro:
    ParâmetrosDescrição
    srl log allRegistar a resposta na íntegra (valor predefinido)
    srl log no responseDesativar o registo da resposta
    srl log response without bodyRegistar a resposta sem o corpo

    Exemplo 1

    Se quiser registras as petições dos clientes ORDA em um arquivo e usar o número de sequencia do registro:

     var $file : 4D.File
    var $e : cs.PersonsEntity

    $file:=File("/LOGS/ORDARequests.txt") //pasta logs

    SET DATABASE PARAMETER(Client Log Recording;1) //ativa o número de sequencia global do log
    ds.startRequestLog($file)
    $e:=ds.Persons.get(30001) //enviar uma petição
    ds.stopRequestLog()
    SET DATABASE PARAMETER(Client Log Recording;0)

    Exemplo 2

    Se quiser registrar as petições dos clientes ORDA na memória:

     var $es : cs. PersonsSelection
    var $log : Collection

    ds.startRequestLog(3) //keep 3 requests in memory

    $es:=ds. Persons.query("name=:1";"Marie")
    $es:=ds. Persons.query("name IN :1";New collection("Marie"))
    $es:=ds.Persons.query("name=:1";"So@")

    $log:=ds.getRequestLog()
    ALERT("The longest request lasted: "+String($log.max("duration"))+" ms")

    Exemplo 3

    Você deseja registrar as peticiones do servidor ORDA em um arquivo específico e ativar o número de sequência do registro e a duração:

    SET DATABASE PARAMETER(4D Server Log Recording;1)

    $file:=Folder(fk logs folder).file("myOrdaLog.jsonl")
    ds.startRequestLog($file)
    ...
    ds.stopRequestLog()
    SET DATABASE PARAMETER(4D Server Log Recording;0)


    .startTransaction()

    História
    ReleaseMudanças
    18Adicionado

    .startTransaction()

    ParâmetroTipoDescrição
    Não exige nenhum parâmetro

    Descrição

    A função .startTransaction() inicia uma transação no processo atual no banco de dados correspondente ao armazenamento de dados ao qual ela se aplica. Quaisquer alterações feitas às entidades do datastore no processo da transacção são armazenadas temporariamente até que a transacção seja validada ou cancelada.

    Se chamar a este método no armazém de dados principal (ou seja, o armazém de dados devolvido pelo comando ds), a transação se aplica a todas as operações realizadas no armazém de dados principal e no banco de dados subjacente, incluindo portanto ORDA e as linguagens clássicas.

    Pode aninhar várias transações (subtransações). Cada transação ou subtransação deve ser eventualmente cancelada ou validada. Note que se a transação principal for cancelada, todas as suas subtransações também são canceladas, mesmo se forem validadas individualmente usando a função .validateTransaction().

    Exemplo

     var $connect; $status : Object
    var $person : cs.PersonsEntity
    var $ds : cs.DataStore
    var $choice : Text
    var $error : Boolean

    Case of
    :($choice="local")
    $ds:=ds
    :($choice="remote")
    $connect:=New object("hostname";"111.222.3.4:8044")
    $ds:=Open datastore($connect;"myRemoteDS")
    End case

    $ds.startTransaction()
    $person:=$ds.Persons.query("lastname=:1";"Peters").first()

    If($person#Null)
    $person.lastname:="Smith"
    $status:=$person.save()
    End if
    ...
    ...
    If($error)
    $ds.cancelTransaction()
    Else
    $ds.validateTransaction()
    End if

    .stopRequestLog()

    História
    ReleaseMudanças
    20Suporte do lado do servidor
    17 R6Adicionado

    .stopRequestLog()

    ParâmetroTipoDescrição
    Não exige nenhum parâmetro

    Descrição

    A função .stopRequestLog() interrompe qualquer registro de solicitações ORDA na máquina em que é chamada (cliente ou servidor).

    Fecha efetivamente o documento aberto no disco. No lado do cliente, se o registo tiver sido iniciado na memória, é interrompido.

    Esta função não faz nada se o registo dos pedidos ORDA não tiver sido iniciado na máquina.

    Exemplo

    Consulte os exemplos de .startRequestLog().

    .unlock()

    História
    ReleaseMudanças
    20Adicionado

    .unlock()

    ParâmetroTipoDescrição
    Não exige nenhum parâmetro

    Descrição

    A função .unlock() remove o bloqueio atual das operações de gravação no datastore, se ele tiver sido definido no mesmo processo. As operações de gravação podem ser bloqueadas no repositório de dados local usando a função .flushAndLock().

    Se a fechadura actual era a única fechadura no datastore, as operações de escrita são imediatamente activadas. Se a função .flushAndLock() tiver sido chamada várias vezes no processo, o mesmo número de .unlock() deverá ser chamado para desbloquear de fato o armazenamento de dados.

    A função .unlock() deve ser chamada a partir do processo que chamou o correspondente .flushAndLock(), caso contrário a função nada faz e a fechadura não é removida.

    Se a função .unlock() for chamada em um datastore desbloqueado, ela não fará nada.

    Veja também

    .flushAndLock()
    .locked()

    .validateTransaction()

    História
    ReleaseMudanças
    18Adicionado

    .validateTransaction()

    ParâmetroTipoDescrição
    Não exige nenhum parâmetro

    Descrição

    A função .validateTransaction() aceita a transação que foi iniciada com .startTransaction() no nível correspondente no armazenamento de dados especificado.

    A função salva as mudanças nos dados do datastore que se produziram durante a transação.

    Pode aninhar várias transações (subtransações). Se a transação principal for cancelada, todas suas subtransações também são canceladas, mesmo se validadas individualmente usando esta função.

    Exemplo

    Consulte o exemplo de .startTransaction().