LCOV - code coverage report
Current view: top level - libgnucash/backend/sql - gnc-sql-object-backend.hpp (source / functions) Coverage Total Hit
Test: gnucash.info Lines: 100.0 % 13 13
Test Date: 2026-11-02 18:19:43 Functions: 100.0 % 7 7
Legend: Lines:     hit not hit

            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          300 :     GncSqlObjectBackend (int version, const std::string& type,
      52          300 :                          const std::string& table, const EntryVec& vec) :
      53          300 :         m_table_name{table}, m_version{version}, m_type_name{type},
      54          600 :         m_col_table(vec) {}
      55          300 :     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           48 :     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          300 :     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            1 :     write_objects_t() = default;
     127           66 :     write_objects_t (GncSqlBackend* sql_be, bool o, GncSqlObjectBackend* e) :
     128           66 :         be{sql_be}, is_ok{o}, obe{e} {}
     129           19 :     void commit (QofInstance* inst) {
     130           19 :         if (is_ok) is_ok = obe->commit (be, inst);
     131           19 :     }
     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 2.0-1