Revert "Remove mysql and oracle resources for anna-ericsson project"
[anna.git] / include / anna / dbos / CrossedLoader.hpp
diff --git a/include/anna/dbos/CrossedLoader.hpp b/include/anna/dbos/CrossedLoader.hpp
new file mode 100644 (file)
index 0000000..c1516ec
--- /dev/null
@@ -0,0 +1,97 @@
+// ANNA - Anna is Not Nothingness Anymore                                                         //
+//                                                                                                //
+// (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo                         //
+//                                                                                                //
+// See project site at http://redmine.teslayout.com/projects/anna-suite                           //
+// See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
+
+
+#ifndef anna_dbos_CrossedLoader_hpp
+#define anna_dbos_CrossedLoader_hpp
+
+#include <anna/dbos/Accesor.hpp>
+
+namespace anna {
+
+namespace dbms {
+class Database;
+}
+
+namespace dbos {
+
+class Loader;
+
+/**
+ * Interfaz que deben cumplir los cargadores cruzados. Un cargador cruzado facilita que una
+ * misma clase pueda ser cargada usando varios criterios de búsqueda.
+ *
+ * El  criterio de búsqueda más usado y que debería ser más óptimo será desarrollado
+ * mediante la definición del anna::dbos::Loader específico. El resto de criterios de búsqueda,
+ * los cargadores cruzados,  deberían ser capaces obtener los datos usados como clave en el criterio
+ * principal, para a partir de ahí poder aplicar el criterio de búsqueda principal.
+ *
+ * Cada cargador cruzado podría tener una lista de pares (clave_alternativa, clave_principal) que permitirá
+ * acelerar las búsquedas de la clave principal, en base a la clave alternativa usada en este cargador.
+ *
+ * Para obtener los datos de la clave principal en base a los datos de la clave alternativa habrá que
+ * acceder al medio físico.
+ *
+ * Para optimizar el acceso a los pares (Clave alternativa, Clave Principal) se podría usar una
+ * instancia del tipo anna::LRUMap.
+*/
+class CrossedLoader : public Accesor {
+public:
+  /**
+     Metodo de debemos re-escribir para devolver el nombre completo del selector de recursos.
+     Para evitar ambigüedades este nombre deberia incluir la lista completa de \em namespaces
+     a la que pertenece la clase.
+     \return Una cadena con el nombre de este selector.
+  */
+  virtual const char* getClassName() const throw() { return "anna::dbos::CrossedLoader"; }
+
+protected:
+  /**
+     Constructor.
+     \param database Base de datos asociada a este cargador y que deberia servir para
+     obtener los datos de un objeto. Debe tener la misma disponibilidad que este cargador.
+     \param id Identificador de este accesor.
+  */
+  CrossedLoader(dbms::Database& database, const Id id = 0) : Accesor(database, id) {;}
+
+  /**
+     Constructor.
+     \param database Base de datos asociada a este cargador y que deberia servir para
+     obtener los datos de un objeto. Debe tener la misma disponibilidad que este cargador.
+     \param id Identificador de este accesor.
+     \param emode Modo de actuar en caso de no encontrar el dato buscado.
+  */
+  CrossedLoader(dbms::Database& database, const Id id, const Exception::Mode::_v emode) : Accesor(database, id, emode) {;}
+
+  /**
+     Este método debe ser reescrito para que permita localizar la información del objeto, que posiblemente
+     esté ubicado en la lista de objetos de este cargador cruzado.
+
+     @return \em true si se ha localizado la información la clave primaria del objeto en su lista de pares
+     o \em false en otro caso.
+  */
+  virtual bool seek() const throw() { return false; }
+
+  /**
+   * Este método debe ser reescrito para que se pueda actualizar la lista de pares (clave_alternativa, clave_principal)
+   * que permitirá acelear las posteriores búsquedas.
+   *
+   * \param loader Instancia del cargador principal que habrá compuesto la clave principal con los suministrados por
+   * esta instancia.
+   */
+  virtual void download(Loader& loader) throw() {;}
+
+  friend class StorageArea;
+};
+
+}
+}
+
+#endif
+
+
+