Skip to content

API DBManager

Victor Bermudez edited this page May 18, 2017 · 4 revisions

Resumen

La API está desarrollada completamente en C++, utilizando como única dependencia el framework Qt v5. El código fuente dispone de los comentarios necesario para generar la documentación técnica del mismo.

Sesión de usuario

La sesión de usuario en CDB se mantiene a través de una cookie, accesible con el getter get_auth_cookie() y pudiéndose establecer con el setter set_auth_cookie() de la instancia del DBMANAGER.

Esto da la libertad de mantener la instancia del DBMANAGER como singleton, instancia global o creando una por cada petición.

Inicio

Funciones con template

Casi todas las funciones que interactúan con las entidades/documentos están desarrolladas utilizando la mecánica de templating de C++. Debido a su funcionamiento, el código fuente de las funciones debe estar disponible para el compilar, de ahí que estén codificadas en los ficheros de cabeceras y no en los de código fuente.

Siempre se debe tener presente la forma de registro de las clases que representan los documento en 'CDB. Si la clase se registra en Qt con namespace, todas las propiedades deben declararse con el mismo namespace, y éste debe utilizarse también en las funciones con template.

Inicio

Entidades y objetos

Existen 7 clases que representan documentos, o partes del uno, y 2 clases que representan estados en CDB.

Clases

Inicio

BaseObject

Define una parte básica de documento. Es la clase raíz de la que derivan el resto de objetos. Esta clase debe utilizarse para crear partes de documentos anidadas.

BaseEntity

Define una entidad básica. Deriva de la clase BaseObject añadiendo las propiedades _id, _rev, collection, name y description. Esta clase debe utilizarse para crear documentos completos no versionables.

BaseReference

Define un documento de relación interno. Deriva de la clase BaseObject. Esta clase debe utilizarse para relacionar una parte de un documento con otra parte anidada del mismo.

BaseUser

Define un documento de usuario básico. Deriva de la clase BaseEntity. Esta clase debe utilizarse para crear objetos de tipo usuario especializados.

VersionableEntity

Define una entidad básica. Deriva de la clase BaseEntity añadiendo las propiedades version, working, locked y locked_by. Esta clase debe utilizarse para crear documentos completos versionables.

RelationEntity

Define una entidad de relación. Deriva de la clase BaseEntity. Esta clase debe utilizarse para crear documentos completos de relación.

ReplicationConfig

Define un documento de configuración de replicación persistente. Deriva de la clase BaseEntity. No se debería derivar a partir de esta clase, sino usarla como tal para especificar configuraciones.

UserContext

Es un objeto de apoyo que contiene el estado del contexto de usuario.

DBManagerResponse

Es un objeto de apoyo que contiene el estado de la respuesta de algunas funciones de DBMANAGER.

Inicio

Relaciones entre documentos

Actualmente existe cuatro formas de relación:

  • N-M
    • Es la que se debería utilizar cuando se requiere relacionar clases versionables.
    • Se debe establecer la relación a través de un documento, y su representación como clase C++.
    • La clase de relación siempre debe ser una lista: QList<…>.
    • Para las propiedades de tipo QList que establezcan relaciones, siempre se debe añadir un método adder con la siguiente firma:
void add_<nombre_propiedad>(CouchDBManager::BaseObject* value);
  • 1-1
    • Se representa por una propiedad de un tipo que deriva de BaseEntity.
  • INDIRECTA
    • El documento es anidado, teniendo como propiedad un documento compuesto por { id, versión, collection } que hace referencia a otro documento.
    • En la clase C++ se representa por una clase que deriva de BaseReference.
  • INTERNA
    • El documento es anidado, y contiene una lista de documentos a los que se hace referencia desde otra parte del propio documento.
    • Sólo hay que representar el documento como tal.
    • Existe el método get_inner_object() que recupera el objeto referenciado para todas las clases que deriven de BaseEntity.

Inicio