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

DataStore

Um Datastore é o objeto de interface subministrado por ORDA para referenciar e acessar a uma base de dados. Objetos Datastore são retornado pelos comandos abaixo:

  • ds: um atalho para datastore principl
  • Open datastore: para abrir qualquer datastore remota

Resumo

.cancelTransaction()    cancela a transação
.clearAllRemoteContexts()    permite desativar qualquer acesso de dados em web admin port, incluindo as sessões Data Explorer in WebAdmin
.dataclassName : 4D. DataClass    contém uma descrição do dataclass
.encryptionStatus(): Object    devolve um objecto que fornece o estado de encriptação para o ficheiro de dados actual
.flushAndLock()    descarrega o cache do datastore local e impede outros processos de realizar operações de escrita na base de dados
.getAllRemoteContexts() : Collection    retorna True se Data Explorer acesso for desativado para a sessão de trabalho
.getInfo(): Object    devolve um objecto que fornece informação sobre o datastore
.getRemoteContextInfo(contextName : Text) : Object      retorna um objeto que contém informações sobre a otimização de contexto contextName na datastore.
.getRequestLog() : Collection    devolve os pedidos ORDA registados na memória do lado do cliente
.locked() : Boolean    retorna Verdadeiro se o datastore local estiver actualmente bloqueado
.makeSelectionsAlterable()    estabelece todas as seleções de entidade como editável como padrão nas datastore de aplicação atuais.
.provideDataKey( curPassPhrase : Text ) : Object
.provideDataKey( curDataKey : Object ) : Object
    permite oferecer uma chave de criptografia de dados para o arquivo de dados atual da datastore e detecta se a chave corresponder com os dados criptografados.
.setAdminProtection( status : Boolean )    permite desativar qualquer acesso de dados em web admin port, incluindo as sessões Data Explorer in WebAdmin
.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 }} )
    conecta os atributos de dataclass especificados ao contexto de otimização contextName
.startRequestLog()
.startRequestLog( file : 4D.File )
.startRequestLog( file : 4D.File ; options : Integer )
.startRequestLog( reqNum : Integer )
    inicia o registo dos pedidos ORDA no lado do cliente ou no lado do servidor
.startTransaction()    inicia uma transação no processo atual na base de dados que corresponde à base de dados à qual se aplica
.stopRequestLog()     pára qualquer registo de pedidos ORDA na máquina a que é chamado (cliente ou servidor)
.unlock()    remove o bloqueio actual das operações de escrita no datastore, se este tiver sido definido no mesmo processo
.validateTransaction()     aceita a transação

ds

Histórico
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 devolve uma referência ao datastore que corresponde à base de dados 4D actual ou à base de dados designada 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 armazém de dados se abre automaticamente e está disponível diretamente através de ds.

Também pode obter uma referencia em um datastore remoto aberto passando seu id local no parâmetro localID. O armazém de dados deve ter sido aberto previamente com o comando Open datastore pelo banco de dados atual (local 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 não encontrar nenhum armazém de dados localID, o comando devolve Null.

Os objectos disponíveis no site cs. Datastore são mapeados a partir da base de dados alvo no que respeita às regras gerais da ORDA.

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órico
ReleaseMudanças
20.3New passwordAlgorithm property
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

localID is a local alias for the session opened on remote datastore. If localID already exists on the application, it is used. Otherwise, a new localID session is created when the datastore object is used.

O banco de dados connectionInfo 4D deve estar disponível como armazém de dados remoto, ou seja:

  • seu servidor web deve ser lançado com http ou https ativado,
  • sua opção Expor como servidor REST deve estar marcada,
  • se dispõe de ao menos uma licença cliente.

Se não se encontrar nenhum banco de dados coincidente, Open datastore devolve Null.

localID é um alias local para a sessão aberta no armazém de dados remoto. Se localID já existir na aplicação, se utiliza. Em caso contrário, se cria uma nova sessão localID quando se utiliza o objeto datastore.

Os objectos disponíveis no site cs. Datastore são mapeados a partir da base de dados alvo no que respeita às regras gerais da ORDA.

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

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):

PropriedadeTipoDescrição
hostnameTextNome ou endereço IP da database remota + ":" + número de porta (o numero de porta é obrigatório)
userTextNome de usuario
senhaTextUser password. By default, the password is sent in clear form, therefore it is strongly recommended to use encrypted communications by passing true in the tls property.
idleTimeoutLongintTempo 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). Se for omitido, o valor normal é 60 minutos (1hora) O valor não pode ser inferior a 60: se definir um valor inferior, o tempo de espera se eleva até 60). Para saber mais informação, consulte Fechamento de sessões.
tlsParâmetrosUtilize uma conexão segura(*). Se omitido, false por defeito. Se for omitido, o normal é falso Usar uma conexão segura é recomendado sempre que possível.
passwordAlgorithmTextPass "4d-rest-digest" if the server validates the password using the Validate password command with the digest parameter set to true.
typeTextDeve ser "4D Server"

(*) Se tls for true, se utiliza o protocolo HTTPS 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
  • um certificado válido e uma chave privada de criptografia estão instalados no banco de dados. Senão é mostrado o erro "1610 - A remote request to host xxx has failed"

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")

Gestão de erros

Em caso de erro, o comando devolve 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". Pode interceptar este erro com um método instalado por ON ERR CALL.

.dataclassName

Histórico
ReleaseMudanças
17Adicionado

.dataclassName : 4D. DataClass

Descrição

Um Datastore é o objeto de interface subministrado por ORDA para referenciar e acessar a uma base de dados. O objeto devolvido contém uma descrição do 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órico
ReleaseMudanças
18Adicionado

.cancelTransaction()

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

|

Descrição

A função .cancelTransaction() cancela a transação aberto pela função .startTransaction() ao nível correspondente no processo actual para o datastore especificado.

A função .cancelTransaction() cancela qualquer mudança realizado nos dados 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 a função .validateTransaction().

Exemplo

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

.clearAllRemoteContexts()

Histórico
ReleaseMudanças
19 R5Adicionado

.clearAllRemoteContexts()

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

|

Descrição

A função .setAdminProtection() permite desativar qualquer acesso de dados em web admin port, incluindo as sessões Data Explorer in WebAdmin.

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.

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

Veja também

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

.encryptionStatus()

Histórico
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() devolve um objecto que fornece o estado de encriptação para o ficheiro de dados actual (ou seja, o ficheiro de dados do datastore ds). Também se proporciona o estado de cada tabela.

Utilizar o comando Estado de encriptação de ficheiros de dados para determinar o estado de encriptação de qualquer outro ficheiro 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) //the database is encrypted
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
Else
ALERT("This database is not encrypted.")
End if
Else
ALERT("This database is not encrypted.")
End if

.flushAndLock()

Histórico
ReleaseMudanças
20Adicionado

.flushAndLock()

| Parâmetro | Tipo | | Descrição | | --------- | ---- | | ----------------------------------------------------- | | | | | Não exige nenhum parâmetro|

|

Descrição

A função .flushAndLock() descarrega o cache do datastore local e impede outros processos de realizar operações de escrita na base 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:

  • sobre a datastore local (ds).
  • no ambiente cliente/servidor, na máquina do servidor.

Uma vez esta função executada, operações de escrita como .save() ou outro .flushAndLock() são congeladas chamadas em todos os outros processos até que a datastore seja desbloqueada.

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 a datastore já estiver bloqueada de outro processo, a .flushAndLock() chamada é congelada e será executada quando a datastore for desbloqueada.

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

caution

Outras características e serviços 4D incluindo backup, vss, e MSC podem também bloquear a datastore. Antes de ligar para .flushAndLock(), certifique-se de que nenhuma outra acção de bloqueio está a ser utilizada, a fim de evitar qualquer interacçã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órico
ReleaseMudanças
19 R5Adicionado

.getAllRemoteContexts() : Collection

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

|

Modo avançado: Esta função destina-se a programadores que necessitem personalizar as características padrão ORDA para configurações específicas. Na maioria dos casos, não necessitará de o utilizar.

Descrição

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

Para mais informações sobre como podem ser criados contextos, ver optimização cliente/servidor.

Cada objeto da coleção devolvida ccontém as propriedades listadas na seção..getRemoteContextInfo().

Exemplo

O código abaixo define dois contextos e os recupera utilizando .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()

.getInfo()

Histórico
ReleaseMudanças
17Adicionado

.getInfo(): Object

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

|

Descrição

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

Objeto devolvido

PropriedadeTipoDescrição
typestring
  • "4D": armazém de dados principal, disponível através de ds
  • "4D Server": datastore remoto, aberto com Open datastore
  • networkedboolean
  • True: a datastore se alcança através de uma conexão de rede.
  • False: não se alcança a datastore através de uma conexão de rede (base de dados local)
  • localIDtextID do armazém de dados na máquina. Corresponde à string localId dada com o comando Open datastore. String vazia ("") para o datastore principal.
    connectionobjectObjeto descrevendo a conexão remota da datastore (não retornado para datastore principal) Propriedades disponiveis: Propriedades disponiveis: Propriedades disponiveis:
    PropriedadeTipoDescrição
    hostnametextEndereço IP ou nome da datastore remota + ":" + número porta
    tlsbooleanTrue se conexão segura for usada com a datastore remota
    idleTimeoutnumberTempo de inatividade da sessão (em minutos)
    usertextUsuario autentificado no datastore remoto
    • Se a função .getInfo() for executada em um 4D Server ou 4D monoposto, networked é False.
    • Se a função .getInfo() for executada em um 4D remoto, networked é 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 $status : Object

    $status:=dataStore.encryptionStatus()

    If($status.isEncrypted) //the database is encrypted
    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
    Else
    ALERT("This database is not encrypted.")
    End if

    .getRemoteContextInfo()

    Histórico
    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: Esta função destina-se a programadores que necessitem personalizar as características padrão 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 a otimização de contexto contextName na datastore..

    Para saber mais sobre como contextos de otimização podem ser criados veja client/server optimization.

    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 page mode se o contexto for linkado a uma list box. Devolvido como Nulo ou elemento de texto vazio se o nome do contexto não for utilizado para uma caixa de listagem, ou se não houver contexto para o actualItem

    Como os contextos se comportam como filtros de atributos, se principal for devolvido vazio, significa que nenhum filtro é aplicado, e que o servidor devolve todos os atributos de dataclass.

    Exemplo

    Ver o exemplo da secção .setRemoteContextInfo().

    Veja também

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

    .getRequestLog()

    Histórico
    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() devolve os pedidos ORDA registados na memória do lado do cliente. .

    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 uma descrição do formato do registro de petições de ORDA, consulte a seção Perguntas do cliente ORDA.

    Exemplo

    Ver o exemplo 2 de .startRequestLog().

    .isAdminProtected()

    Histórico
    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 .startRequestLog() inicia o registo dos pedidos ORDA no lado do cliente.

    Como padrão, o acesso ao Explorador de Dados se concede para as sessões webAdmin, mas pode ser desativada para evitar qualquer acesso aos dados por parte dos administradores (ver a função .setAdminProtection()).

    Veja também

    .setAdminProtection()

    .locked()

    Histórico
    ReleaseMudanças
    20Adicionado

    .locked() : Boolean

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

    |

    Descrição

    A função .locked() retorna Verdadeiro se o datastore local estiver actualmente bloqueado.

    Pode bloquear o datastore usando a função .flushAndLock() antes de executar um instantâneo do ficheiro de dados, por exemplo.

    caution

    A função também retornará True se a datastore foi bloqueada por outra funcionalidade de administração como backup ou vss (ver .flushAndLock()).

    Veja também

    .flushAndLock()
    .unlock()

    .makeSelectionsAlterable()

    Histórico
    ReleaseMudanças
    18 R5Adicionado

    .makeSelectionsAlterable()

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

    |

    Descrição

    A função .makeSelectionsAlterable() estabelece todas as seleções de entidade como editável como padrão nas datastore de aplicação atuais. (incluindo remote datastores). Está pensado para ser utilizado uma vez, por exemplo no método base On Startup.

    quando nesta função não for chamada, as novas seleções de entidades podem ser compartilháveis, dependendo da natureza de seu "pai", ou de como foram criadas.

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

    Compatibilidade: esta função só deve ser utilizada em projetos convertidos desde versões de 4D anteriores a 4D v18 R5 e que contenham chamadas .add(). Nste contexto, o uso de .makeSelectionsAlterable() pode poupar tempo ao restaurar instantaneamente o comportamento anterior de 4D nos projetos existentes. Por outro lado, utilizar este método em projetos novos criados em 4D v18 R5 e superiores não é recomendável, já que impede compartir as seleções de entidades, o que oferece maior rendimento e escalabilidade.

    .provideDataKey()

    Histórico
    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 oferecer uma chave de criptografia de dados para o arquivo de dados atual da datastore e detecta se a chave corresponder com os 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 criptografada. Se for chamado em uma database não criptografada, o erro 2003 (a chave de criptografia não corresponde aos dados) é retornada. Utilize o comando Estado de cifrado do arquivo de dados para determinar se o banco de dados estiver cifrada.
    • A função .provideDataKey() não pode ser chamada desde um 4D remoto ou uma datastore remoto encriptado.

    Se utilizar o parâmetro curPassPhrase, passe a string utilizada para gerar a chave de cifrado de dados. Quando usar este parâmetro, uma chave de criptografia é gerada.

    Se utilizar o parâmetro curDataKey, passe um objeto (com a propriedade encodedKey) que contenha a chave de cifrado dos dados. Esta chave pode ter sido gerada com o comando New data key.

    Se aportar uma chave de cifrado de dados válida, se adicionar a keyChain da memória e se ativa o modo de cifrado:

    • 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

    Resultados

    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 seguintes propriedades são devolvidas só se success 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 não for dada uma curPassphrase ou curDataKey, .provideDataKey() devolve null (não é gerado nenhum erro).

    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órico
    ReleaseMudanças
    18 R6Adicionado

    .setAdminProtection( status : Boolean )

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

    |

    Descrição

    A função .setAdminProtection() permite desativar qualquer acesso de dados em web admin port, incluindo as sessões Data Explorer in WebAdmin.

    Por padrão, quando não chamar a função, o acesso aos dados se concede sempre no porto 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, pode chamar a esta função para desabilitar o acesso aos dados do Explorador de Dados no porto de administração web da máquina, mesmo se a sessão de usuário tiver 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

    Se criar um método projeto protectDataFile para chamar antes dos lançamentos, por exemplo:

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

    Veja também

    .isAdminProtected()

    .setRemoteContextInfo()

    Histórico
    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: Esta função destina-se a programadores que necessitem personalizar as características padrão ORDA para configurações específicas. Na maioria dos casos, não necessitará de o utilizar.

    Descrição

    A função .setRemoteContextInfo() conecta os atributos de dataclass especificados 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 pageLength) são imediatamente perguntadas ao servidor com apenas os atributos no contexto

    Para saber mais sobre os contextos de otimização são construidos, veja client/server optimization paragraph

    em contextName, passe o nome do contexto de otimização ao link para os atributos de dataclass.

    Para designar a dataclass que vai receber o contexto, passa dataClassName ou dataClassObject.

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

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

    Pode passar contextType para especificar se o contexto é um contexto padrão ou o contexto do item de seleção de entidade atual exibido em uma list box:

    • Se estabelecido como "main" (padrão), contextName designa um contexto padrão.
    • Se definido para "currentItem", os atributos passados são colocados no contexto do item actual. Ver List box baseado na seleção da entidade.

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

    Pode passar um pageLength para um atributo relacional que é uma selecção de entidade (uma a muitas). A sintaxe é relationAttributeName:pageLength (e.g. 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 seguinte pedaço de código solicita páginas de 30 entidades do Endereço dataclass do servidor. As entidades devolvidas contêm apenas o atributo zipCode.

    Para cada endereço entidade, 20 pessoas entidades são devolvidas, e só contêm os atributos último nome e primeiro nome :

    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órico
    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 registo dos pedidos 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 do registo de petições ORDA, consulte a secção petiçõ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 passar um objeto file criado com o comando File, os dados de registro se escrevem neste 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 .startRequestLog() for chamado com um arquivo enquanto o registro em log tiver sido iniciado anteriormente na memória, o registro em memória será interrompido e esvaziado.

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

    • Se passar um inteiro reqNum, se esvazia o registro em memória (se houver) e se inicializa um novo registro. 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 chamou previamente a .startRequestLog() com um reqNum (antes de um .stopRequestLog()), os datos do registro são empilhados em memória até a próxima vez que se esvazie o registro ou se chame a .stopRequestLog().

    Do lado do servidor

    Para criar um registro de pedidos ORDA no lado do servidor, chame essa função no máquina servidor. Os dados de registo são escritos num ficheiro no formato .jsonl. 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 null, os dados de registro serão gravados em um arquivo chamado ordaRequests.jsonl e armazenados na pasta "/LOGS".
    • O parâmetro options pode ser usado para especificar se a resposta do servidor deve 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") //logs folder

    SET DATABASE PARAMETER(Client Log Recording;1) //to trigger the global log sequence number
    ds.startRequestLog($file)
    $e:=ds. Persons.get(30001) //send a request
    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órico
    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 na base de dados que corresponde à base de dados à qual 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 cancelar a transação principal, também se cancelam todas suas subtransações, mesmo se tiver validado individualmente mediante 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órico
    ReleaseMudanças
    20Suporte do lado do servidor
    17 R6Adicionado

    .stopRequestLog()

    | Parâmetro | Tipo | | Descrição | | --------- | ---- | | ----------------------------------------------------- | | | | | Não exige nenhum parâmetro|

    |

    Descrição

    A função .stopRequestLog() pára qualquer registo de pedidos ORDA na máquina a que é chamado (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

    Ver exemplos .startRequestLog().

    .unlock()

    Histórico
    ReleaseMudanças
    20Adicionado

    .unlock()

    | Parâmetro | Tipo | | Descrição | | --------- | ---- | | ----------------------------------------------------- | | | | | Não exige nenhum parâmetro|

    |

    Descrição

    A função .unlock() remove o bloqueio actual das operações de escrita no datastore, se este tiver sido definido no mesmo processo. As operações de escrita podem ser bloqueadas no datastore 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() foi chamada várias vezes no processo, o mesmo número de .unlock() deve ser chamado para realmente desbloquear o datastore.

    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 numa datastore desbloqueada, não faz nada.

    Veja também

    .flushAndLock()
    .locked()

    .validateTransaction()

    Histórico
    ReleaseMudanças
    18Adicionado

    .validateTransaction()

    | Parâmetro | Tipo | | Descrição | | --------- | ---- | | ----------------------------------------------------- | | | | | Não exige nenhum parâmetro|

    |

    Descrição

    A função .validateTransaction() aceita a transação que foi iniciado com .startTransaction() ao nível correspondente no datastore 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

    Ver exemplos .startTransaction().