QxOrm >> Quick sample | Current version : QxOrm 1.1.9 (LGPL) - QxOrm library online documentation |  |  |

In this chapter, we will see a quick sample with the basic functionalities of QxOrm library. Note : QxOrm library uses the following syntax for C++ source code : all classes, functions, properties, etc... are defined under namespace qx all macros of QxOrm library start with QX_... all abstracts classes (or interfaces) start with Ix (for example IxFactory is an interface to create an instance of object) other classes start with Qx (for example QxDataMember) containers of objects end with X (for example QxDataMemberX is a list of QxDataMember) functions to interact with databases are under namespace qx::dao (for example qx::dao::fetch_by_id()) functions to serialize are under namespace qx::serialization (for example qx::serialization::xml::to_file()) the reflection engine can be used with qx::QxClassX (for example qx::QxClassX::invoke() to call a class method) all traits classes are under namespace qx::trait (for example qx::trait::is_smart_ptr<T>) | QxOrm library has been accepted into the Qt Ambassador Program
Additional note : you can find a more complex sample (with inheritance, polymorphism, relationships, collections, shared libraries, memory leak, etc...) in the folder ./test/qxDllSample/ of your QxOrm directory. The ./test/qxDllSample/ folder contains 2 projects of dll type and 1 project of exe type : ./dll1/, ./dll2/ and ./exe/. This solution can be compiled with Visual C++ 2008 or 2010 on Windows (open the file ./test/qxDllSample/test.sln). This solution can be also compiled with GCC 4.4.1 on Linux and MinGW on Windows with qmake command. Quick sample step by step : 1- drug.h file : drug class definition with 3 properties : id, name and description 2- drug.cpp file : 'setting function' implementation : void qx::register_class() 3- main.cpp file : basic functionalities of QxOrm library with drug class 4- execute program and trace output debug 5- ./export_drugs.xml file created by the program * ----------------------------------------------------------------------------------------------------- * 1- drug.h file : drug class definition with 3 properties : id, name and description * -----------------------------------------------------------------------------------------------------
    #ifndef _CLASS_DRUG_H_
    #define _CLASS_DRUG_H_

    class drug
    {
    public:
       long id;
       QString name;
       QString description;

       drug() : id(0) { ; }
       virtual ~drug() { ; }
    };

    QX_REGISTER_HPP_MY_TEST_EXE(drug, qx::trait::no_base_class_defined, 1)

    /* This macro is necessary to register 'drug' class in QxOrm context */
    /* param 1 : the current class to register => 'drug' */
    /* param 2 : the base class, if no base class, use the qx trait => 'qx::trait::no_base_class_defined' */
    /* param 3 : the class version used by serialization to provide 'ascendant compatibility' */

    #endif // _CLASS_DRUG_H_
* ---------------------------------------------------------------------------------------------------- * 2- drug.cpp file : 'setting function' implementation : void qx::register_class() * ----------------------------------------------------------------------------------------------------
    #include "precompiled.h"   // Precompiled-header with '#include <QxOrm.h>' and '#include "export.h"'
    #include "drug.h"          // Class definition 'drug'
    #include <QxMemLeak.h>     // Automatic memory leak detection

    QX_REGISTER_CPP_MY_TEST_EXE(drug)   // This macro is necessary to register 'drug' class in QxOrm context

    namespace qx {
    template <> void register_class(QxClass<drug> & t)
    {
      t.id(& drug::id, "id");               // Register 'drug::id' <=> primary key in your database
      t.data(& drug::name, "name", 1);      // Register 'drug::name' property with key 'name' and version '1'
      t.data(& drug::description, "desc");  // Register 'drug::description' property with key 'desc'
    }}
* ----------------------------------------------------------------------------------------------- * 3- main.cpp file : basic functionalities of QxOrm library with drug class * -----------------------------------------------------------------------------------------------
    #include "precompiled.h"
    #include "drug.h"
    #include <QxMemLeak.h>

    int main(int argc, char * argv[])
    {
       QApplication app(argc, argv); // Qt application

       // Create 3 new drugs
       // It is possible to use 'boost' and 'Qt' smart pointer : 'boost::shared_ptr', 'QSharedPointer', etc...
       typedef boost::shared_ptr<drug> drug_ptr;
       drug_ptr d1; d1.reset(new drug()); d1->name = "name1"; d1->description = "desc1";
       drug_ptr d2; d2.reset(new drug()); d2->name = "name2"; d2->description = "desc2";
       drug_ptr d3; d3.reset(new drug()); d3->name = "name3"; d3->description = "desc3";

       // Insert drugs into container
       // It is possible to use a lot of containers from 'std', 'boost', 'Qt' and 'qx::QxCollection<Key, Value>'
       typedef std::vector<drug_ptr> type_lst_drug;
       type_lst_drug lst_drug;
       lst_drug.push_back(d1);
       lst_drug.push_back(d2);
       lst_drug.push_back(d3);

       // Init parameters to communicate with a database
       qx::QxSqlDatabase::getSingleton()->setDriverName("QSQLITE");
       qx::QxSqlDatabase::getSingleton()->setDatabaseName("./test_qxorm.db");
       qx::QxSqlDatabase::getSingleton()->setHostName("localhost");
       qx::QxSqlDatabase::getSingleton()->setUserName("root");
       qx::QxSqlDatabase::getSingleton()->setPassword("");

       // Create table 'drug' into database to store drugs
       QSqlError daoError = qx::dao::create_table<drug>();

       // Insert drugs from container to database
       // 'id' property of 'd1', 'd2' and 'd3' are auto-updated
       daoError = qx::dao::insert(lst_drug);

       // Modify and update the second drug into database
       d2->name = "name2 modified";
       d2->description = "desc2 modified";
       daoError = qx::dao::update(d2);

       // Delete the first drug from database
       daoError = qx::dao::delete_by_id(d1);

       // Count drugs into database
       long lDrugCount = qx::dao::count<drug>();

       // Fetch drug with id '3' into a new variable
       drug_ptr d_tmp; d_tmp.reset(new drug());
       d_tmp->id = 3;
       daoError = qx::dao::fetch_by_id(d_tmp);

       // Export drugs from container to a file under xml format (serialization)
       qx::serialization::xml::to_file(lst_drug, "./export_drugs.xml");

       // Import drugs from xml file into a new container
       type_lst_drug lst_drug_tmp;
       qx::serialization::xml::from_file(lst_drug_tmp, "./export_drugs.xml");

       // Clone a drug
       drug_ptr d_clone = qx::clone(* d1);

       // Create a new drug by class name (factory)
       boost::any d_any = qx::create("drug");

       // Insert drugs container into 'qx::cache'
       qx::cache::set("drugs", lst_drug);

       // Remove all elements from 'qx::cache'
       qx::cache::clear();

       // Create a dummy memory leak
       drug * pDummy = new drug();

       return 0;
    }
* ------------------------------------------------------------------------- * 4- execute program and trace output debug * ------------------------------------------------------------------------- [QxOrm] qx::QxSqlDatabase : create new database connection in thread '3616' with key '{d315250c-b5c9-46e0-9402-f800368a6673}' [QxOrm] sql query (78 ms) : CREATE TABLE drug (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name TEXT, desc TEXT) [QxOrm] sql query (63 ms) : INSERT INTO drug (name, desc) VALUES (:name, :desc) [QxOrm] sql query (62 ms) : UPDATE drug SET id = :id, name = :name, desc = :desc WHERE id = :id_bis [QxOrm] sql query (63 ms) : DELETE FROM drug WHERE id = :id [QxOrm] sql query (0 ms) : SELECT COUNT(*) FROM drug [QxOrm] sql query (0 ms) : SELECT drug.id AS drug_id_0, drug.name AS drug_name_0, drug.desc AS drug_desc_0 FROM drug WHERE drug_id_0 = :id [QxOrm] Leaked object at 0xf52ad8 (size 16, src\main.cpp:74) [QxOrm] **** 1 memory leaks found **** * ------------------------------------------------------------------------------ * 5- ./export_drugs.xml file created by the program * ------------------------------------------------------------------------------