DataStore
Un Datastore es el objeto de interfaz suministrado por ORDA para referenciar y acceder a una base de datos. Los objetos Datastore son devueltos por los siguientes comandos:
- ds: un acceso directo al datastore principal
- Open datastore: para abrir cualquier datastore remoto
Resumen
| .cancelTransaction() cancela la transacción |
| .clearAllRemoteContexts() borra todos los atributos de todos los contextos activos en el datastore |
| .dataclassName : 4D.DataClass contiene una descripción de la clase de datos |
| .encryptionStatus(): Object devuelve un objeto que suministra el estado de cifrado del archivo de datos actual |
| .flushAndLock() vacía la caché del datastore local e impide que otros procesos realicen operaciones de escritura en la base de datos |
| .generateFineGrainedToken( privilege : Text ; name : Text ; expiry : Date {; info : Object} ) : Object .generateFineGrainedToken( privileges : Collection ; name : Text ; expiry : Date {; info : Object} ) : Object .generateFineGrainedToken( settings : Object ; name : Text ; expiry : Date {; info : Object} ) : Object genera un token de acceso detallado que permite acceder al servidor MCP con los privilegios que se le asignen |
| .getAllRemoteContexts() : Collection devuelve una colección de objetos que contienen información sobre todos los contextos de optimización activos en el datastore |
| .getGlobalStamp() : Real devuelve el valor actual del marcador de modificación global del datastore |
| .getInfo(): Object devuelve un objeto que proporciona información sobre el datastore |
| .getRemoteContextInfo(contextName : Text) : Object devuelve un objeto que contiene información sobre el contexto de optimización contextName en el datastore |
| .getRequestLog() : Collection devuelve las peticiones ORDA registradas en memoria del lado del cliente |
| .listFineGrainedTokens() : Collection returns the description of the Fine-Grained Tokens generated for the MCP server |
| .listOAuthGrants() : Collection returns the description of the grants given to users through the OAuth mode of the MCP server |
| .locked() : Boolean devuelve True si el datastore local está bloqueado actualmente |
| .makeSelectionsAlterable() define todas las selecciones de entidades como alterables por defecto en los datastores de la aplicación actual |
| .provideDataKey( curPassPhrase : Text ) : Object .provideDataKey( curDataKey : Object ) : Object permite suministrar una llave de cifrado de datos para el archivo de datos actual del datastore y detecta si la llave coincide con los datos cifrados |
| .revokeFineGrainedToken( id : Text ) .revokeFineGrainedToken( tokenObj : Object ) revokes a Fine-Grained Token of the MCP server |
| .revokeOAuthGrant( id : Text ) revokes a grant given to a user through the OAuth mode of the MCP server |
| .setAdminProtection( status : Boolean ) permite deshabilitar cualquier acceso a datos en el puerto web admin, incluso para el Explorador de datos en sesiones WebAdmin |
| .setGlobalStamp( newStamp : Real) define newStamp como nuevo valor para del marcador de modificación global actual del 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 los atributos de la dataclass especificada al contexto de optimización contextName |
| .startRequestLog() .startRequestLog( file : 4D.File ) .startRequestLog( file : 4D.File ; options : Integer ) .startRequestLog( reqNum : Integer ) inicia el registro de peticiones ORDA del lado del cliente o del lado del servidor |
| .startTransaction() inicia una transacción en el proceso actual en la base de datos que coincide con el datastore al que se aplica |
| .stopRequestLog() detiene cualquier registro de las peticiones ORDA en la máquina en la que se llama (cliente o servidor) |
| .unlock() elimina el bloqueo actual de las operaciones de escritura en el datastore, si se ha definido en el mismo proceso |
| .validateTransaction() acepta la transacción |
.dataclassName
Historia
| Lanzamiento | Modificaciones |
|---|---|
| 17 | Añadidos |
.dataclassName : 4D.DataClass
Descripción
Cada dataclass en un datastore está disponible como propiedad del objeto DataStore. El objeto devuelto contiene una descripción de la clase de datos.
Ejemplo
var $emp : cs.Employee
var $sel : cs.EmployeeSelection
$emp:=ds.Employee //$emp contiene la dataclass Employee
$sel:=$emp.all() //obtiene una selección de entidades de todos los empleados
//también puede escribir directamente:
$sel:=ds.Employee.all()
.cancelTransaction()
Historia
| Lanzamiento | Modificaciones |
|---|---|
| 18 | Añadidos |
.cancelTransaction()
| Parámetros | Tipo | Descripción | |
|---|---|---|---|
| No requiere ningún parámetro |
Descripción
La función .cancelTransaction() cancela la transacción abierta por la función .startTransaction() en el nivel correspondiente en el proceso actual para el datastore especificado.
La función .cancelTransaction() cancela cualquier cambio realizado en los datos durante la transacción.
Puede anidar varias transacciones (subtransacciones). Si se cancela la transacción principal, también se cancelan todas sus subtransacciones, aunque se hayan validado individualmente mediante la función .validateTransaction().
Ejemplo
Ver el ejemplo de la función .startTransaction() .
.clearAllRemoteContexts()
Historia
| Lanzamiento | Modificaciones |
|---|---|
| 19 R5 | Añadidos |
.clearAllRemoteContexts()
| Parámetros | Tipo | Descripción | |
|---|---|---|---|
| No requiere ningún parámetro |
Descripción
La función .clearAllRemoteContexts() borra todos los atributos de todos los contextos activos en el datastore.
Esta función se utiliza principalmente en el contexto de la depuración. Una cosa a tener en cuenta es que cuando se abre el depurador, éste envía peticiones al servidor y consulta todos los atributos de la clase de datos para mostrarlos. Esto puede sobrecargar sus contextos con datos innecesarios.
En estos casos, puedes utilizar .clearAllRemoteContexts() para borrar sus contextos y mantenerlos limpios.
Ver también
.getRemoteContextInfo()
.getAllRemoteContexts()
.setRemoteContextInfo()
.encryptionStatus()
Historia
| Lanzamiento | Modificaciones |
|---|---|
| 17 R5 | Añadidos |
.encryptionStatus(): Object
| Parámetros | Tipo | Descripción | |
|---|---|---|---|
| Resultado | Object | <- | Información sobre el cifrado del almacén de datos actual y de cada tabla |
Descripción
La función .encryptionStatus() devuelve un objeto que suministra el estado de cifrado del archivo de datos actual (es decir, el archivo de datos del datastore ds). También se proporciona el estado de cada tabla.
Utilice el comando
Data file encryption statuspara determinar el estado de encriptación de cualquier otro archivo de datos.
Valor devuelto
El objeto devuelto contiene las siguientes propiedades:
| Propiedad | Tipo | Descripción | ||
|---|---|---|---|---|
| isEncrypted | Boolean | True si el archivo de datos está encriptado | ||
| keyProvided | Boolean | True si se proporciona la llave de encriptación que coincide con el archivo de datos encriptados(*). | ||
| tablas | Object | Objeto que contiene tantas propiedades como tablas encriptadas o codificadas. | ||
| tableName | Object | Tabla encriptada o cifrada | ||
| name | Text | Nombre de la tabla | ||
| num | Number | Número de tabla | ||
| isEncryptable | Boolean | Verdadero si la tabla está declarada como encriptada en el archivo de estructura | ||
| isEncrypted | Boolean | True si los registros de la tabla están encriptados en el archivo de datos |
(*) Se puede suministrar la llave de encriptación:
- con el comando
.provideDataKey(), - en la raíz de un dispositivo conectado antes de abrir el almacén de datos,
- con el comando
Discover data key.
Ejemplo
Quiere saber el número de tablas encriptadas en el archivo de datos actual:
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
.flushAndLock()
Historia
| Lanzamiento | Modificaciones |
|---|---|
| 20 | Añadidos |
.flushAndLock()
| Parámetros | Tipo | Descripción | |
|---|---|---|---|
| No requiere ningún parámetro |
Descripción
La función .flushAndLock() vacía la caché del datastore local e impide que otros procesos realicen operaciones de escritura en la base de datos. El datastore se pone en un estado consistente y congelado. Es necesario llamar a esta función antes de ejecutar una instantánea de la aplicación, por ejemplo.
Esta función sólo puede llamarse:
- en el datastore local (
ds). - en entorno cliente/servidor, en la máquina servidor.
Una vez ejecutada esta función, las operaciones de escritura como .save() u otras llamadas a .flushAndLock() se congelan en todos los demás procesos hasta que se desbloquee el datastore.
Cuando se han realizado varias llamadas a .flushAndLock() en el mismo proceso, se debe ejecutar el mismo número de llamadas a .unlock() para desbloquear realmente el datastore.
El datastore se desbloquea cuando:
- la función
.unlock()es llamada en el mismo proceso, o - el proceso que llamó a la función
.flushAndLock()es eliminado.
Si el datastore ya está bloqueado desde otro proceso, la llamada a .flushAndLock() se congela y se ejecutará cuando se desbloquee el datastore.
Se produce un error si la función .flushAndLock() no puede ejecutarse (por ejemplo, se ejecuta en un 4D remoto), .
Ejemplo
Desea crear una copia de la carpeta de datos junto con su archivo de historial actual:
$destination:=Folder(fk documents folder).folder("Archive")
$destination.create()
ds.flushAndLock() //Bloquear operaciones de escritura de otros procesos
$dataFolder:=Folder(fk data folder)
$dataFolder.copyTo($destination) //Copiar la carpeta de datos
$oldJournalPath:=New log file //Cerrar el historial y crear uno nuevo
$oldJournal:=File($oldJournalPath; fk platform path)
$oldJournal.moveTo($destination) //Guardar el antiguo historial con datos
ds.unlock() //Nuestra copia ha terminado, ahora podemos desbloquear el datastore
Ver también
.generateFineGrainedToken()
Historia
| Lanzamiento | Modificaciones |
|---|---|
| 21 R6 | Añadidos |
.generateFineGrainedToken( privilege : Text ; name : Text ; expiry : Date {; info : Object} ) : Object
.generateFineGrainedToken( privileges : Collection ; name : Text ; expiry : Date {; info : Object} ) : Object
.generateFineGrainedToken( settings : Object ; name : Text ; expiry : Date {; info : Object} ) : Object
| Parámetros | Tipo | Descripción | |
|---|---|---|---|
| privilege | Text | → | Nombre del privilegio, o nombres de privilegios separados por comas |
| privileges | Collection | → | Colección de nombres de privilegios |
| settings | Object | → | Objeto con una propiedad "privilegios" y/o "roles" |
| name | Text | → | Nombre del token |
| expiry | Fecha | → | Fecha de vencimiento del token |
| info | Object | → | Información almacenada junto con el token y transmitida a ds.mcpAuthenticated() |
| Resultado | Object | ← | {id; token} |
Descripción
La función .generateFineGrainedToken() genera un token de acceso detallado que permite acceder al servidor MCP con los privilegios que se le asignen. Para obtener más información, consulte Tokens de grano fino.
You pass the privileges and/or roles of the token in the same forms as for Session.setPrivileges():
- En el parámetro privilege, pase una cadena que contenga un nombre de privilegio (o varios nombres de privilegio separados por comas).
- En el parámetro privileges, pase una colección de cadenas que contengan nombres de privilegios.
- In the settings parameter, pass an object with a
privilegesand/or arolesproperty (string or collection of strings).
Unlike Session.setPrivileges(), a name that is not declared in the roles.json file raises an error.
In name, pass a name that identifies the token, for example the user and the client that will use it. It is the user name of the MCP sessions opened with the token.
In expiry, pass the expiration date of the token. It is required, and it must be later than the current date and at most 366 days ahead.
In info, you can pass an object that 4D stores with the token as is, and passes to the ds.mcpAuthenticated() function when an MCP session is opened with the token. Since it cannot be modified later, store stable identifiers (such as a user ID) and read the current values in ds.mcpAuthenticated(). Build info from the authenticated session, never from values sent by the client.
The function can only be called in a web context, i.e. from code executed for a web or REST request (for example an exposed function called after the user was authenticated). Every privilege of the token must be held by the current session (Session.getPrivileges(), roles included, promoted privileges excluded). Otherwise, an error is raised.
If an error is raised, no token is created.
Objeto devuelto
| Propiedad | Tipo | Descripción |
|---|---|---|
| id | Text | Identifier of the token. It is not secret: use it to revoke the token |
| token | Text | The token, starting with "4dfgt_". It is returned only once: 4D only stores its hash, in the fgt.json file of the data folder |
Ejemplo
In an exposed function of the DataStore class, called by an authenticated user, you generate a token valid for 3 months:
exposed Function getMCPToken() : Text
var $expiry:=Add to date(Current date; 0; 3; 0)
var $result:=ds.generateFineGrainedToken({roles: "salesperson"}; "Claude Desktop - "+Session.userName; $expiry; {userName: Session.userName})
return $result.token // "4dfgt_..."
Ver también
.listFineGrainedTokens()
.revokeFineGrainedToken()
.getAllRemoteContexts()
Historia
| Lanzamiento | Modificaciones |
|---|---|
| 19 R5 | Añadidos |
.getAllRemoteContexts() : Collection
| Parámetros | Tipo | Descripción | |
|---|---|---|---|
| Resultado | Collection | <- | Colección de objetos contextos de optimización |
Modo avanzado: esta función está pensada para los desarrolladores que necesitan personalizar las funcionalidades por defecto de ORDA para configuraciones específicas. En la mayoría de los casos, no será necesario utilizarla.
Descripción
La función .getAllRemoteContexts() devuelve una colección de objetos que contienen información sobre todos los contextos de optimización activos en el datastore.
Para obtener más información sobre cómo se pueden crear contextos, consulte Optimización cliente/servidor.
Cada objeto de la colección devuelta tiene las propiedades enumeradas en la sección .getRemoteContextInfo().
Ejemplo
El siguiente código define dos contextos y los 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 ejemplo sirve como demostración, no está pensado para una implementación real.
Ver también
.getRemoteContextInfo()
.setRemoteContextInfo()
.clearAllRemoteContexts()
.getGlobalStamp()
Historia
| Lanzamiento | Modificaciones |
|---|---|
| 20 R3 | Añadidos |
.getGlobalStamp() : Real
| Parámetros | Tipo | Descripción | |
|---|---|---|---|
| Resultado | Real | <- | Valor actual del marcador de modificación global |
Descripción
La función .getGlobalStamp() devuelve el valor actual del marcador de modificación global del datastore.
Esta función sólo puede llamarse:
- en el datastore local (
ds). - en entorno cliente/servidor, en la máquina servidor.
Para más información sobre el marcador global y el seguimiento de las modificaciones de datos, por favor consulte la página Uso del marcador global.
Ejemplo
var $currentStamp : Real
var $hasModifications : Boolean
$currentStamp:=ds.getGlobalStamp()
methodWhichCouldModifyEmployees //ejecutar código
$hasModifications:=($currentStamp # ds.getGlobalStamp())
Ver también
.getInfo()
Historia
| Lanzamiento | Modificaciones |
|---|---|
| 17 | Añadidos |
.getInfo(): Object
| Parámetros | Tipo | Descripción | |
|---|---|---|---|
| Resultado | Object | <- | Propiedades del almacén de datos |
Descripción
La función .getInfo() devuelve un objeto que proporciona información sobre el datastore. Esta función es útil para configurar el código genérico.
Objeto devuelto
| Propiedad | Tipo | Descripción | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| type | string | ||||||||||||||||
| networked | boolean | ||||||||||||||||
| localID | text | ID del almacén de datos en la máquina. ID del almacén de datos en la máquina. Cadena vacía ("") para el almacén de datos principal. | |||||||||||||||
| connection | object | Objeto que describe la conexión del almacén de datos remoto (no se devuelve para el almacén de datos principal). Propiedades
disponibles:
|
- Si la función
.getInfo()se ejecuta en un 4D Server o en un 4D monopuesto,networkedes False. - Si la función
.getInfo()se ejecuta en un 4D remoto,networkedes True
Ejemplo 1
var $info : Object
$info:=ds.getInfo() //Ejecutado en 4D Server o 4D
//{"type":"4D","networked":false,"localID":""}
$info:=ds.getInfo() // Ejecutado en 4D remoto
//{"type":"4D","networked":true,"localID":""}
Ejemplo 2
En un almacén de datos remoto:
var $remoteDS : 4D.DataStoreImplementation
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()
Historia
| Lanzamiento | Modificaciones |
|---|---|
| 19 R5 | Añadidos |
.getRemoteContextInfo(contextName : Text) : Object
| Parámetros | Tipo | Descripción | |
|---|---|---|---|
| contextName | Text | -> | Nombre del contexto |
| Resultado | Object | <- | Descripción del contexto |
Modo avanzado: esta función está pensada para los desarrolladores que necesitan personalizar las funcionalidades por defecto de ORDA para configuraciones específicas. En la mayoría de los casos, no será necesario utilizarla.
Descripción
La función .getRemoteContextInfo() devuelve un objeto que contiene información sobre el contexto de optimización contextName en el datastore..
Para obtener más información sobre cómo se pueden crear contextos de optimización, consulte optimización cliente/servidor.
Objeto devuelto
El objeto devuelto tiene las siguientes propiedades:
| Propiedad | Tipo | Descripción |
|---|---|---|
| name | Text | Nombre del contexto |
| main | Text | Atributo(s) asociado(s) al contexto (los nombres de atributos están separados por comas) |
| dataclass | Text | Nombre de la clase de datos |
| currentItem (opcional) | Text | Los atributos del modo página si el contexto está vinculado a un list box. Se devuelve como Null o elemento de texto vacío si el nombre del contexto no se utiliza para un list box, o si no hay contexto para el elemento actual (currentItem) |
Como los contextos se comportan como filtros de atributos, si main se devuelve vacío, significa que no se aplica ningún filtro, y que el servidor devuelve todos los atributos de la dataclass.
Ejemplo
Ver el ejemplo de la sección .setRemoteContextInfo().
Ver también
.setRemoteContextInfo()
.getAllRemoteContexts()
.clearAllRemoteContexts()
.getRequestLog()
Historia
| Lanzamiento | Modificaciones |
|---|---|
| 17 R6 | Añadidos |
.getRequestLog() : Collection
| Parámetros | Tipo | Descripción | |
|---|---|---|---|
| Resultado | Collection | <- | Colección de objetos, donde cada objeto describe una solicitud |
Descripción
La función .getRequestLog() devuelve las peticiones ORDA registradas en memoria del lado del cliente. El registro de peticiones ORDA debe haber sido activado previamente utilizando la función .startRequestLog().
Esta función debe ser llamada en un 4D remoto, de lo contrario devuelve una colección vacía. Está diseñado para fines de depuración en configuraciones cliente/servidor.
Valor devuelto
Colección de objetos de petición apilados. La solicitud más reciente tiene el índice 0.
Para una descripción del formato del registro de peticiones ORDA, por favor consulte la sección Peticiones ORDA.
Ejemplo
Vea el ejemplo 2 de .startRequestLog().
.isAdminProtected()
Historia
| Lanzamiento | Modificaciones |
|---|---|
| 18 R6 | Añadidos |
.isAdminProtected() : Boolean
| Parámetros | Tipo | Descripción | |
|---|---|---|---|
| Resultado | Boolean | <- | True si el acceso al Explorador de Datos está desactivado, False si está activado (por defecto) |
Descripción
La función .isAdminProtected() devuelve True si se ha desactivado el acceso al Data Explorer para la sesión de trabajo.
Por defecto, se concede acceso al Data Explorer para las sesiones webAdmin, pero se puede desactivar para evitar cualquier acceso a los datos por parte de los administradores (ver la función .setAdminProtection()).
Ver también
.listFineGrainedTokens()
Historia
| Lanzamiento | Modificaciones |
|---|---|
| 21 R6 | Añadidos |
.listFineGrainedTokens() : Collection
| Parámetros | Tipo | Descripción | |
|---|---|---|---|
| Resultado | Collection | ← | Collection of token description objects |
Descripción
The .listFineGrainedTokens() function returns the description of the Fine-Grained Tokens generated for the MCP server (see .generateFineGrainedToken()).
When the function is called in a web context (code executed for a web or REST request), the collection only contains the tokens whose privileges are all held by the current session. Elsewhere (for example in a method or a stored procedure), it contains all the tokens.
Cada objeto de la colección devuelta contiene las siguientes propiedades. The token itself and its hash are never returned.
| Propiedad | Tipo | Descripción |
|---|---|---|
| id | Text | Identifier of the token |
| name | Text | Nombre del token |
| privileges | Text, Collection u Object | Privileges and roles of the token, as passed at generation |
| expiry | Text | Fecha de vencimiento del token |
| info | Object | Information stored with the token |
| createdAt | Text | Date and time of the token generation |
Ejemplo
You revoke all the tokens generated for a user:
var $tokens:=ds.listFineGrainedTokens().query("info.userName = :1"; "jsmith")
var $token : Object
For each ($token; $tokens)
ds.revokeFineGrainedToken($token.id)
End for each
.listOAuthGrants()
Historia
| Lanzamiento | Modificaciones |
|---|---|
| 21 R6 | Añadidos |
.listOAuthGrants() : Collection
| Parámetros | Tipo | Descripción | |
|---|---|---|---|
| Resultado | Collection | ← | Collection of grant description objects |
Descripción
The .listOAuthGrants() function returns the description of the grants given to users through the OAuth mode of the MCP server. A grant is created each time a user logs in from an MCP client (see OAuth 2.1 mode).
When the function is called in a web context (code executed for a web or REST request), the collection only contains the grants whose privileges are all held by the current session. Elsewhere, it contains all the grants.
Cada objeto de la colección devuelta contiene las siguientes propiedades:
| Propiedad | Tipo | Descripción |
|---|---|---|
| id | Text | Identifier of the grant |
| userName | Text | User name of the grant (userName returned by ds.mcpGrant(), or the login name) |
| clientId | Text | Identifier of the MCP client |
| clientName | Text | Name of the MCP client |
| privileges | Text, Collection u Object | Privileges and roles returned by ds.mcpGrant() |
| createdAt | Text | Date and time of the login |
| lastUsedAt | Text | Date and time of the last use of the grant |
| expiresAt | Text | Expiration date and time of the grant |
Ejemplo
You list the MCP clients in which a user is logged in:
var $clients:=ds.listOAuthGrants().query("userName = :1"; "jsmith").extract("clientName")
.locked()
Historia
| Lanzamiento | Modificaciones |
|---|---|
| 20 | Añadidos |
.locked() : Boolean
| Parámetros | Tipo | Descripción | |
|---|---|---|---|
| Resultado | Boolean | <- | True si bloqueado |
Descripción
La función .locked() devuelve True si el datastore local está bloqueado actualmente.
Puede bloquear el datastore utilizando la función .flushAndLock() antes de ejecutar una instantánea del archivo de datos, por ejemplo.
La función también devolverá True si el datastore fue bloqueado por otra función de administración como el backup o el vss (ver .flushAndLock()).
Ver también
.makeSelectionsAlterable()
Historia
| Lanzamiento | Modificaciones |
|---|---|
| 18 R5 | Añadidos |
.makeSelectionsAlterable()
| Parámetros | Tipo | Descripción | |
|---|---|---|---|
| No requiere ningún parámetro |
Descripción
La función .makeSelectionsAlterable() define todas las selecciones de entidades como alterables por defecto en los datastores de la aplicación actual (incluyendo datastores remotos). Está pensado para ser utilizado una vez, por ejemplo en el método base On Startup.
Cuando no se llama a esta función, las nuevas selecciones de entidades pueden ser compartibles, dependiendo de la naturaleza de su "padre", o de cómo se crean.
Esta función no modifica las selecciones de entidades creadas por
.copy()oOB Copycuando se utiliza la opción explícitack shared.
Compatibilidad: esta función sólo debe utilizarse en proyectos convertidos desde versiones de 4D anteriores a 4D v18 R5 y que contengan llamadas .add(). En este contexto, el uso de
.makeSelectionsAlterable()puede ahorrar tiempo al restaurar instantáneamente el comportamiento anterior de 4D en los proyectos existentes. Por otro lado, utilizar este método en proyectos nuevos creados en 4D v18 R5 y superiores no es recomendable, ya que impide compartir las selecciones de entidades, lo que ofrece mayor rendimiento y escalabilidad.
.provideDataKey()
Historia
| Lanzamiento | Modificaciones |
|---|---|
| 17 R5 | Añadidos |
.provideDataKey( curPassPhrase : Text ) : Object
.provideDataKey( curDataKey : Object ) : Object
| Parámetros | Tipo | Descripción | |
|---|---|---|---|
| curPassPhrase | Text | -> | Frase de cifrado actual |
| curDataKey | Object | -> | Llave de encriptación de datos actual |
| Resultado | Object | <- | Resultado de la coincidencia de la llave de encriptación |
Descripción
La función .provideDataKey() permite suministrar una llave de cifrado de datos para el archivo de datos actual del datastore y detecta si la llave coincide con los datos cifrados. Esta función se puede utilizar al abrir una base encriptada, o al ejecutar cualquier operación de encriptación que requiera la llave de encriptación, como por ejemplo volver a encriptar el archivo de datos.
- La función
.provideDataKey()debe ser llamada en una base de datos encriptada. Si se llama en una base no cifrada, el error 2003 (la llave de cifrado no coincide con los datos.) es devuelto. Utilice el comandoData file encryption statuspara determinar si la base de datos está encriptada.- La función
.provideDataKey()no puede ser llamada desde un 4D remoto o un datastore remoto encriptado.
Si utiliza el parámetro curPassPhrase, pase la cadena utilizada para generar la llave de cifrado de datos. Cuando se utiliza este parámetro, se genera una llave de encriptación.
Si utiliza el parámetro curDataKey, pase un objeto (con la propiedad encodedKey) que contenga la llave de cifrado de los datos. Esta llave puede haber sido generada con el comando New data key.
Si se aporta una llave de cifrado de datos válida, se añade a la keyChain de la memoria y se activa el modo de cifrado:
- todas las modificaciones de datos en las tablas encriptadas se cifran en el disco (.4DD, .journal. 4Dindx)
- todos los datos cargados desde tablas encriptadas se descifran en memoria
Resultado
El resultado de la orden se describe en el objeto devuelto:
| Propiedad | Tipo | Descripción | |
|---|---|---|---|
| success | Boolean | True si la llave de encriptación proporcionada coincide con los datos encriptados, False en caso contrario | |
| Las siguientes propiedades se devuelven sólo si success es FALSE | |||
| status | Number | Código de error (4 si la llave de encriptación suministrada es errónea) | |
| statusText | Text | Mensaje de error | |
| errors | Collection | Pila de errores. El primer error tiene el índice más alto | |
| [ ].componentSignature | Text | Nombre del componente interno | |
| [ ].errCode | Number | Número de error | |
| [ ].message | Text | Mensaje de error |
Si no se proporciona curPassphrase o curDataKey, .provideDataKey() devuelve null (no se genera ningún error).
Ejemplo
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
.revokeFineGrainedToken()
Historia
| Lanzamiento | Modificaciones |
|---|---|
| 21 R6 | Añadidos |
.revokeFineGrainedToken( id : Text )
.revokeFineGrainedToken( tokenObj : Object )
| Parámetros | Tipo | Descripción | |
|---|---|---|---|
| id | Text | → | Identifier of the token to revoke |
| tokenObj | Object | → | Object with a token property containing the token to revoke |
Descripción
The .revokeFineGrainedToken() function revokes a Fine-Grained Token of the MCP server.
You designate the token:
- in the id parameter, with its identifier (returned by
.generateFineGrainedToken()and.listFineGrainedTokens()), - or in the tokenObj parameter, with an object whose
tokenproperty contains the token itself ("4dfgt_..."), for example to let the holder of a token revoke it.
The token stops working at the next request, and the MCP sessions opened with it are closed. Binary URLs already returned to the client remain valid until they expire (10 minutes at most).
When the function is called in a web context (code executed for a web or REST request), it can only revoke a token whose privileges are all held by the current session.
Ejemplo
You revoke a token by its id:
var $tokens:=ds.listFineGrainedTokens().query("name = :1"; "Claude Desktop - jsmith")
If ($tokens.length>0)
ds.revokeFineGrainedToken($tokens[0].id)
End if
Ver también
.generateFineGrainedToken()
.listFineGrainedTokens()
.revokeOAuthGrant()
Historia
| Lanzamiento | Modificaciones |
|---|---|
| 21 R6 | Añadidos |
.revokeOAuthGrant( id : Text )
| Parámetros | Tipo | Descripción | |
|---|---|---|---|
| id | Text | → | Identifier of the grant to revoke |
Descripción
The .revokeOAuthGrant() function revokes a grant given to a user through the OAuth mode of the MCP server (see .listOAuthGrants()).
The access tokens of the grant get an HTTP 401 status from the next request, its refresh token is refused, and its MCP sessions are closed. The user must log in again from the MCP client.
When the function is called in a web context (code executed for a web or REST request), it can only revoke a grant whose privileges are all held by the current session.
Ejemplo
When you deactivate a user of your application, you revoke their OAuth grants:
var $grant : Object
For each ($grant; ds.listOAuthGrants().query("userName = :1"; "jsmith"))
ds.revokeOAuthGrant($grant.id)
End for each
Ver también
.listOAuthGrants()
.revokeFineGrainedToken()
.setAdminProtection()
Historia
| Lanzamiento | Modificaciones |
|---|---|
| 18 R6 | Añadidos |
.setAdminProtection( status : Boolean )
| Parámetros | Tipo | Descripción | |
|---|---|---|---|
| status | Boolean | -> | True para desactivar el acceso Data Explorer a los datos del puerto webAdmin, False (por defecto) para otorgar el acceso |
Descripción
La función .setAdminProtection() permite deshabilitar cualquier acceso a datos en el puerto web admin, incluso para el Explorador de datos en sesiones WebAdmin.
Por defecto, cuando no se llama a la función, el acceso a los datos se concede siempre en el puerto de administración web para una sesión con privilegio WebAdmin utilizando el Explorador de Datos. En algunas configuraciones, por ejemplo, cuando el servidor de aplicaciones está alojado en una máquina de terceros, es posible que no desee que el administrador pueda ver sus datos, aunque puede editar la configuración del servidor, incluyendo los parámetros access key.
En este caso, puede llamar a esta función para deshabilitar el acceso a los datos del Explorador de Datos en el puerto de administración web de la máquina, incluso si la sesión de usuario tiene el privilegio WebAdmin. Cuando se ejecuta esta función, el archivo de datos se protege inmediatamente y el estado se almacena en el disco: el archivo de datos estará protegido incluso si se reinicia la aplicación.
Ejemplo
Se crea un método proyecto protectDataFile para llamar antes de los despliegues, por ejemplo:
ds.setAdminProtection(True) //Desactiva el acceso a los datos del Explorador de datos
Ver también
.setGlobalStamp()
Historia
| Lanzamiento | Modificaciones |
|---|---|
| 20 R3 | Añadidos |
.setGlobalStamp( newStamp : Real)
| Parámetros | Tipo | Descripción | |
|---|---|---|---|
| newStamp | Real | -> | Nuevo valor del marcador de modificación global |
Esta función está destinada a los desarrolladores que necesiten modificar el valor actual del marcador global. Debe utilizarse con cuidado.
Descripción
La función .setGlobalStamp() define newStamp como nuevo valor para del marcador de modificación global actual del datastore.
Esta función sólo puede llamarse:
- en el datastore local (
ds). - en entorno cliente/servidor, en la máquina servidor.
Para más información sobre el marcador global y el seguimiento de las modificaciones de datos, por favor consulte la página Uso del marcador global.
Ejemplo
El siguiente código define el marcador de modificación global:
var $newValue: Real
$newValue:=ReadValueFrom //obtener un nuevo valor para asignar
ds.setGlobalStamp($newValue)
Ver también
.setRemoteContextInfo()
Historia
| Lanzamiento | Modificaciones |
|---|---|
| 19 R5 | Añadidos |
.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ámetros | Tipo | Descripción | |
|---|---|---|---|
| contextName | Text | -> | Nombre del contexto |
| dataClassName | Text | -> | Nombre de la dataclass |
| dataClassObject | 4D.DataClass | -> | dataclass object (e.g datastore. Employee) |
| attributes | Text | -> | Lista de atributos separados por comas |
| attributesColl | Collection | -> | Colección de nombres de atributos (text) |
| contextType | Text | -> | Si se suministra, el valor debe ser "main" o "currentItem" |
| pageLength | Integer | -> | Longitud de la página de la selección de entidades asociada al contexto (por defecto es 80) |
Modo avanzado: esta función está pensada para los desarrolladores que necesitan personalizar las funcionalidades por defecto de ORDA para configuraciones específicas. En la mayoría de los casos, no será necesario utilizarla.
Descripción
La función .setRemoteContextInfo() vincula los atributos de la dataclass especificada al contexto de optimización contextName. Si ya existe un contexto de optimización para los atributos especificados, este comando lo reemplaza.
Cuando se pasa un contexto a las funciones de clase ORDA, la optimización de las peticiones REST se activa inmediatamente:
- la primera entidad no está totalmente cargada como se hace en el modo automático
- las páginas de 80 entidades (o de
pageLengthentidades) se piden inmediatamente al servidor con sólo los atributos del contexto
Para más información sobre cómo se crean los contextos de optimización, consulte el párrafo de optimización cliente/servidor
En contextName, pase el nombre del contexto de optimización para vincularlo a los atributos de la dataclass.
Para designar la dataclass que recibirá el contexto, puede pasar un dataClassName o un dataClassObject.
Para designar los atributos a vincular al contexto, pase una lista de atributos separados por una coma en attributes (Text), o una colección de nombres de atributos en attributesColl (colección de textos).
Si attributes es un texto vacío, o si attributesColl es una colección vacía, todos los atributos escalares de la dataclass se integran al contexto de optimización. Si se pasa un atributo que no existe en la dataclass, la función lo ignora y se genera un error.
Puede pasar un contextType para especificar si el contexto es un contexto estándar o el contexto del elemento actual de la selección de entidades mostrada en un list box:
- Si el valor es "main" (por defecto), contextName designa un contexto estándar.
- Si su valor es "currentItem", los atributos pasados se ponen en el contexto del elemento actual. Ver List box basado en una entity selection.
En pageLength, especifique el número de entidades de dataclass a solicitar al servidor.
Puede pasar un pageLength para un atributo relacional que es una selección de entidades (de una a muchas). La sintaxis es relationAttributeName:pageLength (por ejemplo, empleados:20).
Ejemplo 1
var $ds : 4D.DataStoreImplementation
var $persons : cs.PersonsSelection
var $p : cs.PersonsEntity
var $contextA : Object
var $info : Object
var $text : Text
// Abrir datastore remoto
$ds:=Open datastore(New object("hostname"; "www.myserver.com"); "myDS")
// Definir el contexto
$contextA:=New object("context"; "contextA")
$ds.setRemoteContextInfo("contextA"; $ds.Persons; "firstname, lastname")
// Envía las peticiones al servidor utilizando un bucle
$persons:=$ds.Persons.all($contextA)
$text:=""
For each ($p; $persons)
$text:=$p.firstname + " " + $p.lastname
End for each
// Verificar el contenido del contexto
$info:=$ds.getRemoteContextInfo("contextA")
// $info = {name:"contextA";dataclass:"Persons";main:"firstname, lastname"}
Este ejemplo sirve como demostración, no está pensado para una implementación real.
Ejemplo 2
El siguiente fragmento de código solicita al servidor páginas de 30 entidades de la dataclass Address. Las entidades devueltas sólo contienen el atributo zipCode.
Por cada entidad Address se devuelven 20 entidades Persons, que sólo contienen los atributos lastname y 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)
Ejemplo 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"
Ver también
.getRemoteContextInfo()
.getAllRemoteContexts()
.clearAllRemoteContexts()
.startRequestLog()
Historia
| Lanzamiento | Modificaciones |
|---|---|
| 20 | Soporte del lado del servidor, nuevo parámetro options |
| 17 R6 | Añadidos |
.startRequestLog()
.startRequestLog( file : 4D.File )
.startRequestLog( file : 4D.File ; options : Integer )
.startRequestLog( reqNum : Integer )
| Parámetros | Tipo | Descripción | |
|---|---|---|---|
| file | 4D.File | -> | Objeto File |
| options | Integer | -> | Opción de registro de respuesta (servidor únicamente) |
| reqNum | Integer | -> | Número de peticiones a mantener en memoria (cliente únicamente) |
Descripción
La función .startRequestLog() inicia el registro de peticiones ORDA del lado del cliente o del lado del servidor. Está diseñado para fines de depuración en configuraciones cliente/servidor.
Para una descripción del formato del registro de peticiones ORDA, por favor consulte la sección Peticiones ORDA.
Del lado del cliente
Para crear un registro de peticiones ORDA del lado del cliente, llame a esta función en una máquina remota. El registro puede enviarse a un archivo o a la memoria, según el tipo de parámetro:
- Si se pasa un objeto file creado con el comando
File, los datos de registro se escriben en este archivo como una colección de objetos (formato JSON). Cada objeto representa una petición.
Si el archivo no existe, se crea. En caso contrario, si el archivo ya existe, los nuevos datos de registro se añaden a él. En caso contrario, si el archivo ya existe, los nuevos datos de registro se añaden a él. Si se llama a.startRequestLog()con un archivo mientras se inició previamente un registro en memoria, el registro en memoria se detiene y se vacía.
Debe añadirse manualmente un carácter \N al final del archivo para realizar una validación JSON
-
Si se pasa un entero reqNum, se vacía el registro en memoria (si lo hay) y se inicializa un nuevo registro. Si se pasa un entero reqNum, se vacía el registro en memoria (si lo hay) y se inicializa un nuevo registro.Conserva las peticiones reqNum en memoria hasta que se alcance el número, en cuyo caso se vacían las entradas más antiguas (pila FIFO).
-
Si no ha pasado ningún parámetro, el registro se inicia en la memoria. Si
.startRequestLog()fue llamado previamente con un reqNum (antes de una.stopRequestLog()), los datos del registro se apilan en memoria hasta la próxima vez que se vacíe el registro o se llame a.stopRequestLog().
Del lado del servidor
Para crear un registro de peticiones ORDA del lado del servidor, llame a esta función en la máquina servidor. Para crear un registro de peticiones ORDA del lado del servidor, llame a esta función en la máquina servidor. Cada objeto representa una petición. Si el archivo no existe, se crea. En caso contrario, si el archivo ya existe, los nuevos datos de registro se añaden a él.
- Si ha pasado el parámetro file, los datos de registro se escriben en este archivo, en la ubicación solicitada. - Si omite el parámetro file o si es null, los datos del registro se escriben en un archivo llamado ordaRequests.jsonl y se almacenan en la carpeta "/LOGS".
- El parámetro options puede utilizarse para especificar si la respuesta del servidor debe registrarse y si debe incluir el cuerpo. Por defecto, cuando se omite el parámetro, se registra la respuesta completa. En este parámetro se pueden utilizar las siguientes constantes:
| Constante | Descripción |
|---|---|
| srl log all | Registrar la respuesta por completo (valor por defecto) |
| srl log no response | Desactivar el registro de la respuesta |
| srl log response without body | Registrar la respuesta sin el cuerpo |
Ejemplo 1
Desea registrar las solicitudes de los clientes ORDA en un archivo y utilizar el número de secuencia del registro:
var $file : 4D.File
var $e : cs.PersonsEntity
$file:=File("/LOGS/ORDARequests.txt") //logs folder
SET DATABASE PARAMETER(Client Log Recording;1) //para activar el número de secuencia log global
ds.startRequestLog($file)
$e:=ds.Persons.get(30001) //send a request
ds.stopRequestLog()
SET DATABASE PARAMETER(Client Log Recording;0)
Ejemplo 2
Quiere registrar las peticiones de los clientes ORDA en la memoria:
var $es : cs.PersonsSelection
var $log : Collection
ds.startRequestLog(3) //mantener 3 peticiones en memoria
$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")
Ejemplo 3
Desea registrar las peticiones del servidor ORDA en un archivo específico y habilitar el número de secuencia de registro y la duración:
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()
Historia
| Lanzamiento | Modificaciones |
|---|---|
| 18 | Añadidos |
.startTransaction()
| Parámetros | Tipo | Descripción | |
|---|---|---|---|
| No requiere ningún parámetro |
Descripción
La función .startTransaction() inicia una transacción en el proceso actual en la base de datos que coincide con el datastore al que se aplica. Todos los cambios realizados en las entidades del almacén de datos en el proceso de la transacción se almacenan temporalmente hasta que la transacción se valida o se cancela.
Si se llama a este método en el almacén de datos principal (es decir, el almacén de datos devuelto por el comando
ds), la transacción se aplica a todas las operaciones realizadas en el almacén de datos principal y en la base de datos subyacente, incluyendo por tanto ORDA y los lenguajes clásicos.
Puede anidar varias transacciones (subtransacciones). Cada transacción o sub-transacción debe ser eventualmente cancelada o validada. Note que si se cancela la transacción principal, también se cancelan todas sus subtransacciones, aunque se hayan validado individualmente mediante la función .validateTransaction().
Ejemplo
var $connect; $status : Object
var $person : cs.PersonsEntity
var $ds : 4D.DataStoreImplementation
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()
Historia
| Lanzamiento | Modificaciones |
|---|---|
| 20 | Soporte del lado del servidor |
| 17 R6 | Añadidos |
.stopRequestLog()
| Parámetros | Tipo | Descripción | |
|---|---|---|---|
| No requiere ningún parámetro |
Descripción
La función .stopRequestLog() detiene cualquier registro de las peticiones ORDA en la máquina en la que se llama (cliente o servidor).
En realidad, cierra el documento abierto en el disco. Del lado del cliente, si el registro se inició en memoria, se detiene.
Esta función no hace nada si el registro de peticiones ORDA no se inició en la máquina.
Ejemplo
Ver ejemplos para .startRequestLog().
.unlock()
Historia
| Lanzamiento | Modificaciones |
|---|---|
| 20 | Añadidos |
.unlock()
| Parámetros | Tipo | Descripción | |
|---|---|---|---|
| No requiere ningún parámetro |
Descripción
La función .unlock() elimina el bloqueo actual de las operaciones de escritura en el datastore, si se ha definido en el mismo proceso. Las operaciones de escritura pueden bloquearse en el almacén de datos local mediante la función .flushAndLock().
Si el bloqueo actual era el único bloqueo en el datastore, las operaciones de escritura se activan inmediatamente. Si la función .flushAndLock() fue llamada varias veces en el proceso, el mismo número de .unlock() debe ser llamado para realmente desbloquear el datastore.
La función .unlock() debe ser llamada desde el proceso que llamó a la correspondiente .flushAndLock(), de lo contrario la función no hace nada y el bloqueo no se elimina.
Si se llama a la función .unlock() en un datastore desbloqueado, no hace nada.
Ver también
.validateTransaction()
Historia
| Lanzamiento | Modificaciones |
|---|---|
| 18 | Añadidos |
.validateTransaction()
| Parámetros | Tipo | Descripción | |
|---|---|---|---|
| No requiere ningún parámetro |
Descripción
La función .validateTransaction() acepta la transacción que se inició con .startTransaction() en el nivel correspondiente en el datastore especificado.
La función guarda los cambios en los datos del almacén de datos que se produjeron durante la transacción.
Puede anidar varias transacciones (subtransacciones). Si se cancela la transacción principal, también se cancelan todas sus subtransacciones, aunque se hayan validado individualmente utilizando esta función.
Ejemplo
Ver el ejemplo de la función .startTransaction().