LCOV - code coverage report
Current view: top level - libgnucash/backend/sql - gnc-sql-object-backend.hpp (source / functions) Hit Total Coverage
Test: gnucash.info Lines: 12 13 92.3 %
Date: 2024-10-31 11:06:40 Functions: 6 8 75.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 0 0 -

           Branch data     Line data    Source code
       1                 :            : /***********************************************************************\
       2                 :            :  * gnc-sql-object-backend.hpp: Encapsulate per-class table schema.     *
       3                 :            :  *                                                                     *
       4                 :            :  * Copyright 2016 John Ralls <jralls@ceridwen.us>                      *
       5                 :            :  *                                                                     *
       6                 :            :  * This program is free software; you can redistribute it and/or       *
       7                 :            :  * modify it under the terms of the GNU General Public License as      *
       8                 :            :  * published by the Free Software Foundation; either version 2 of      *
       9                 :            :  * the License, or (at your option) any later version.                 *
      10                 :            :  *                                                                     *
      11                 :            :  * This program is distributed in the hope that it will be useful,     *
      12                 :            :  * but WITHOUT ANY WARRANTY; without even the implied warranty of      *
      13                 :            :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the       *
      14                 :            :  * GNU General Public License for more details.                        *
      15                 :            :  *                                                                     *
      16                 :            :  * You should have received a copy of the GNU General Public License   *
      17                 :            :  * along with this program; if not, contact:                           *
      18                 :            :  *                                                                     *
      19                 :            :  * Free Software Foundation           Voice:  +1-617-542-5942          *
      20                 :            :  * 51 Franklin Street, Fifth Floor    Fax:    +1-617-542-2652          *
      21                 :            :  * Boston, MA  02110-1301,  USA       gnu@gnu.org                      *
      22                 :            : \***********************************************************************/
      23                 :            : 
      24                 :            : #ifndef __GNC_SQL_OBJECT_BACKEND_HPP__
      25                 :            : #define __GNC_SQL_OBJECT_BACKEND_HPP__
      26                 :            : 
      27                 :            : #include <qof.h>
      28                 :            : 
      29                 :            : #include <memory>
      30                 :            : #include <string>
      31                 :            : #include <vector>
      32                 :            : 
      33                 :            : class GncSqlBackend;
      34                 :            : class GncSqlColumnTableEntry;
      35                 :            : using GncSqlColumnTableEntryPtr = std::shared_ptr<GncSqlColumnTableEntry>;
      36                 :            : using EntryVec = std::vector<GncSqlColumnTableEntryPtr>;
      37                 :            : 
      38                 :            : #define GNC_SQL_BACKEND "gnc:sql:1"
      39                 :            : 
      40                 :            : /**
      41                 :            :  * Encapsulates per-class table schema with functions to load, create a table,
      42                 :            :  * commit a changed front-end object (note that database transaction semantics
      43                 :            :  * are not yet implemented; edit/commit applies to the front-end object!) and
      44                 :            :  * write all front-end objects of the type to the database. Additional functions
      45                 :            :  * for creating and running queries existed but were unused and untested. They've
      46                 :            :  * been temporarily removed until the front end is ready to use them.
      47                 :            :  */
      48                 :            : class GncSqlObjectBackend
      49                 :            : {
      50                 :            : public:
      51                 :        200 :     GncSqlObjectBackend (int version, const std::string& type,
      52                 :        200 :                          const std::string& table, const EntryVec& vec) :
      53                 :        200 :         m_table_name{table}, m_version{version}, m_type_name{type},
      54                 :        400 :         m_col_table(vec) {}
      55                 :        200 :     virtual ~GncSqlObjectBackend() = default;
      56                 :            :     /**
      57                 :            :      * Load all objects of m_type in the database into memory.
      58                 :            :      * @param sql_be The GncSqlBackend containing the database connection.
      59                 :            :      */
      60                 :            :     virtual void load_all (GncSqlBackend* sql_be) = 0;
      61                 :            :     /**
      62                 :            :      * Conditionally create or update a database table from m_col_table. The
      63                 :            :      * condition is the version returned by querying the database's version
      64                 :            :      * table: If it's 0 then the table wasn't found and will be created; All
      65                 :            :      * tables areat least version 1. If the database's version is less than the
      66                 :            :      * compiled version then the table schema is upgraded but the data isn't,
      67                 :            :      * that's the engine's responsibility when the object is loaded. If the
      68                 :            :      * version is greater than the compiled version then nothing is touched.
      69                 :            :      * @param sql_be The GncSqlBackend containing the database connection.
      70                 :            :      */
      71                 :            :     virtual void create_tables (GncSqlBackend* sql_be);
      72                 :            :     /**
      73                 :            :      * UPDATE/INSERT a single instance of m_type_name into the database.
      74                 :            :      * @param sql_be The GncSqlBackend containing the database.
      75                 :            :      * @param inst The QofInstance to be written out.
      76                 :            :      */
      77                 :            :     virtual bool commit (GncSqlBackend* sql_be, QofInstance* inst);
      78                 :            :     /**
      79                 :            :      * Write all objects of m_type_name to the database.
      80                 :            :      * @param sql_be The GncSqlBackend containing the database.
      81                 :            :      * @return true if the objects were successfully written, false otherwise.
      82                 :            :      */
      83                 :         40 :     virtual bool write (GncSqlBackend* sql_be) { return true; }
      84                 :            :     /**
      85                 :            :      * Return the m_type_name for the class. This value is created at
      86                 :            :      * compilation time and is called QofIdType or QofIdTypeConst in other parts
      87                 :            :      * of GnuCash. Most values are defined in src/engine/gnc-engine.h.
      88                 :            :      * @return m_type_name.
      89                 :            :      */
      90                 :        200 :     const char* type () const noexcept { return m_type_name.c_str(); }
      91                 :            :     /**
      92                 :            :      * Compare a version with the compiled version (m_version).
      93                 :            :      * @return true if they match.
      94                 :            :      */
      95                 :            :     const bool is_version (int version) const noexcept {
      96                 :            :         return version == m_version;
      97                 :            :     }
      98                 :            :     /**
      99                 :            :      * Check the presence of an object in the backend's database.
     100                 :            :      *
     101                 :            :      * @param sql_be Backend owning the database
     102                 :            :      * @param inst QofInstance to be checked.
     103                 :            :      */
     104                 :            :     bool instance_in_db(const GncSqlBackend* sql_be,
     105                 :            :                         QofInstance* inst) const noexcept;
     106                 :            : protected:
     107                 :            :     const std::string m_table_name;
     108                 :            :     const int m_version;
     109                 :            :     const std::string m_type_name; /// The front-end QofIdType
     110                 :            :     const EntryVec& m_col_table;   /// The ORM table definition.
     111                 :            : };
     112                 :            : 
     113                 :            : using GncSqlObjectBackendPtr = std::shared_ptr<GncSqlObjectBackend>;
     114                 :            : 
     115                 :            : using OBEEntry = std::tuple<std::string, GncSqlObjectBackendPtr>;
     116                 :            : using OBEVec = std::vector<OBEEntry>;
     117                 :            : 
     118                 :            : /**
     119                 :            :  * Data-passing struct for callbacks to qof_object_foreach() used in
     120                 :            :  * GncSqlObjectBackend::write(). Once QofCollection is rewritten to use C++
     121                 :            :  * containers we'll use std::foreach() and lambdas instead of callbacks and this
     122                 :            :  * can go away.
     123                 :            :  */
     124                 :            : struct write_objects_t
     125                 :            : {
     126                 :          0 :     write_objects_t() = default;
     127                 :         55 :     write_objects_t (GncSqlBackend* sql_be, bool o, GncSqlObjectBackend* e) :
     128                 :         55 :         be{sql_be}, is_ok{o}, obe{e} {}
     129                 :         17 :     void commit (QofInstance* inst) {
     130                 :         17 :         if (is_ok) is_ok = obe->commit (be, inst);
     131                 :         17 :     }
     132                 :            :     GncSqlBackend* be = nullptr;
     133                 :            :     bool is_ok = false;
     134                 :            :     GncSqlObjectBackend* obe = nullptr;
     135                 :            : };
     136                 :            : 
     137                 :            : 
     138                 :            : #endif //__GNC_SQL_OBJECT_BACKEND_HPP__

Generated by: LCOV version 1.14