<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<title>QxOrm - C++ Object Relational Mapping library</title>
<meta name="generator" content="Amaya, see http://www.w3.org/Amaya/">
<style type="text/css">
.comment { color: #008000; font-style: italic; }
.pre { color: #000099; }
.string { color: #DF0101; }
.char { color: #009900; }
.float { color: #996600; }
.int { color: #999900; }
.bool { color: #000000; font-weight: bold; }
.type { color: #FF6633; }
.flow { color: #FF0000; }
.keyword { color: #990000; }
.operator { color: #663300; font-weight: bold; }
.operator { color: #663300; font-weight: bold; }
</style>
</head>
<body>
<table border="0" style="width: 80%" align="center">
<col><col>
<tbody>
<tr>
<td><a href="./home.html"><img alt="QxOrm"
src="./resource/logo_qxorm.jpg" width="256" align="left" height="61"
border="0"></a></td>
<td><img alt="C++" src="./resource/logo_cpp.jpg" width="50" align="right"
height="50"></td>
</tr>
</tbody>
</table>
<hr style="width: 80%" align="center" size="1" color="#100D5A">
<table border="0" style="width: 80%" align="center">
<col><col><col><col><col><col>
<tbody>
<tr>
<td align="center"><a href="./home.html"><img alt="Home"
src="./resource/link_home.jpg" width="120" height="35"
style="border:1px solid #100D5A; border-color:#100D5A;"></a></td>
<td align="center"><a href="./download.html"><img alt="Download"
src="./resource/link_download.jpg" width="120" height="35"
style="border:1px solid #100D5A; border-color:#100D5A;"></a></td>
<td align="center"><a href="./quick_sample.html"><img alt="Quick sample"
src="./resource/link_quick_sample.jpg" width="120" height="35"
style="border:1px solid #100D5A; border-color:#100D5A;"></a></td>
<td align="center"><a href="./tutorial.html"><img alt="Tutorial"
src="./resource/link_tutorial.jpg" width="120" height="35"
style="border:1px solid #100D5A; border-color:#100D5A;"></a></td>
<td align="center"><a href="./faq.html"><img alt="Faq"
src="./resource/link_faq.jpg" width="120" height="35"
style="border:1px solid #100D5A; border-color:#100D5A;"></a></td>
<td align="center"><a href="./link.html"><img alt="Link"
src="./resource/link_link.jpg" width="120" height="35"
style="border:1px solid #100D5A; border-color:#100D5A;"></a></td>
</tr>
</tbody>
</table>
<hr style="width: 80%" align="center" size="1" color="#100D5A">
<table border="0" style="width: 80%" align="center">
<col><col><col><col><col>
<tbody><tr>
<td align="left" valign="top"><font size="2">QxOrm >> Quick sample</font></td>
<td align="right" valign="top"><font size="2">Current version : QxOrm 1.1.6 (LGPL) - <a href="../doxygen/index.html" target="_blank">QxOrm library online documentation</a></font></td>
<td width="10px"></td>
<td width="40px" height="30px"><a href="../qxorm_fr/quick_sample.html"><img alt="Version fran�aise du site" src="./resource/FR.png" width="40" height="30" border="0"></a></td>
<td width="40px" height="30px"><a href="../qxorm_en/quick_sample.html"><img alt="Web site english version" src="./resource/GB.png" width="40" height="30" border="0"></a></td>
</tr></tbody>
</table>
<table border="1" frame="vsides" rules="cols" style="width: 80%" align="center" cellpadding="6" bgcolor="#F2F2F4">
<col>
<tbody>
<tr>
<td align="justify">
<table border="0" style="width: 100%" align="center">
<col><col>
<tbody>
<tr>
<td><b>In this chapter, we will see a quick sample with the basic functionalities of QxOrm library.</b> <br>
<br>
<i>Note :</i> <b>QxOrm</b> library uses the following syntax for C++ source code :
<ul><li>all classes, functions, properties, etc... are defined under <a href="./resource/qxorm.namespace.qx.jpg"><i>namespace qx</i></a>
</li><li>all macros of QxOrm library start with <i>QX_...</i>
</li><li>all abstracts classes (or interfaces) start with <i>Ix</i> (for example <i>IxFactory</i> is an interface to create an instance of object)
</li><li>other classes start with <i>Qx</i> (for example <i>QxDataMember</i>)
</li><li>containers of objects end with <i>X</i> (for example <i>QxDataMemberX</i> is a list of <i>QxDataMember</i>)
</li><li>functions to interact with databases are under <a href="./resource/qxorm.namespace.qx.dao.jpg"><i>namespace qx::dao</i></a> (for example <i>qx::dao::fetch_by_id()</i>)
</li><li>functions to <i>serialize</i> are under <a href="./resource/qxorm.namespace.qx.serialization.jpg"><i>namespace qx::serialization</i></a> (for example <i>qx::serialization::xml::to_file()</i>)
</li><li>the <i>reflection</i> engine can be used with <b><i>qx::QxClassX</i></b> (for example <i>qx::QxClassX::invoke()</i> to call a class method)
</li><li>all traits classes are under <a href="./resource/qxorm.namespace.qx.trait.jpg"><i>namespace qx::trait</i></a> (for example <i>qx::trait::is_smart_ptr<T></i>)
</li></ul>
</td>
<td width="200" align="center" valign="top"><a href="./resource/qt_ambassador_logo.png" target="_blank"><img alt="qt_ambassador" src="./resource/qt_ambassador_logo_150x150.png" width="150" height="150" border="0"></a><br>
<b><font size="2">QxOrm library has been accepted into the <a href="http://qt.nokia.com/qt-in-use/ambassadors/qtambassador/" target="_blank">Qt Ambassador Program</a></font></b>
</td>
</tr>
</tbody>
</table>
<i>Additional note :</i> you can find a more complex sample (with inheritance, polymorphism,
relationships, collections, shared libraries,
memory leak, etc...) in the folder <i>./test/qxDllSample/</i> of your QxOrm directory.
The <i>./test/qxDllSample/</i> folder contains 2 projects of
dll type and 1 project of exe type : <i>./dll1/</i>,
<i>./dll2/</i> and <i>./exe/</i>.<br>
This solution can be compiled with <b>Visual C++ 2008 or 2010</b> on Windows (open the file
<i>./test/qxDllSample/test.sln</i>).<br>
This solution can be also compiled with <b>GCC 4.4.1</b> on Linux and <b>MinGW</b> on Windows with <i>qmake</i> command.<br>
<br>
Quick sample step by step :
<ul>
<li><a href="#quick_sample_1">1- <i>drug.h</i> file : <i>drug</i> class definition with 3 properties : <i>id</i>, <i>name</i> and <i>description</i></a></li>
<li><a href="#quick_sample_2">2- <i>drug.cpp</i> file : 'setting function' implementation : <i>void qx::register_class()</i></a></li>
<li><a href="#quick_sample_3">3- <i>main.cpp</i> file : basic functionalities of QxOrm library with <i>drug</i> class</a></li>
<li><a href="#quick_sample_4">4- execute program and trace output debug</a></li>
<li><a href="#quick_sample_5">5- <i>./export_drugs.xml</i> file created by the program</a></li>
</ul>
<br>
<font color="#100D5A"><a name="quick_sample_1">*
-----------------------------------------------------------------------------------------------------<br>
* 1- <i>drug.h</i> file : <i>drug</i> class definition with 3 properties : <i>id</i>, <i>name</i> and <i>description</i><br> *
-----------------------------------------------------------------------------------------------------<br>
</a></font><br>
<table border="1" bgcolor="#FFFFFF"><col><tbody><tr><td title="drug.h">
<pre><span class="pre">#ifndef _CLASS_DRUG_H_
#define _CLASS_DRUG_H_
</span><span class="keyword">
class</span> drug<span class="operator">
{</span><span class="keyword">
public</span><span class="operator">:</span><span class="type">
long</span> id<span class="operator">;</span>
QString name<span class="operator">;</span>
QString description<span class="operator">;</span>
drug<span class="operator">() :</span> id<span class="operator">(</span><span class="int">0</span><span class="operator">) { ; }</span><span class="keyword">
virtual</span><span class="operator"> ~</span>drug<span class="operator">() { ; }
};</span>
QX_REGISTER_HPP_MY_TEST_EXE<span class="operator">(</span>drug<span class="operator">,</span> qx<span class="operator">::</span>trait<span class="operator">::</span>no_base_class_defined<span class="operator">,</span><span class="int"> 1</span><span class="operator">)</span><span class="comment">
/* 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' */</span><span class="pre">
#endif <span class="comment">// _CLASS_DRUG_H_</span></span></pre>
</td></tr></tbody></table>
<br><br>
<font color="#100D5A"><a name="quick_sample_2">*
----------------------------------------------------------------------------------------------------<br>
* 2- <i>drug.cpp</i> file : 'setting function' implementation : <i>void qx::register_class()</i><br> *
----------------------------------------------------------------------------------------------------
</a></font><br><br>
<table border="1" bgcolor="#FFFFFF"><col><tbody><tr><td title="drug.cpp">
<pre><span class="pre">#include <span class="string">"precompiled.h"</span> <span class="comment">// Precompiled-header with '#include <QxOrm.h>' and '#include "export.h"'</span>
#include <span class="string">"drug.h"</span> <span class="comment">// Class definition 'drug'</span>
#include <span class="string"><QxMemLeak.h></span> <span class="comment">// Automatic memory leak detection</span>
</span>
QX_REGISTER_CPP_MY_TEST_EXE<span class="operator">(</span>drug<span class="operator">)</span><span class="comment"> // This macro is necessary to register 'drug' class in QxOrm context
</span><span class="keyword">
namespace</span> qx<span class="operator"> {</span><span class="keyword">
template</span><span class="operator"> <></span><span class="type"> void</span> register_class<span class="operator">(</span>QxClass<span class="operator"><</span>drug<span class="operator">> &</span> t<span class="operator">)
{</span>
t<span class="operator">.</span>id<span class="operator">(&</span> drug<span class="operator">::</span>id<span class="operator">,</span><span class="string"> "id"</span><span class="operator">);</span><span class="comment"> // Register 'drug::id' <=> primary key in your database
</span> t<span class="operator">.</span>data<span class="operator">(&</span> drug<span class="operator">::</span>name<span class="operator">,</span><span class="string"> "name"</span><span class="operator">,</span><span class="int"> 1</span><span class="operator">);</span><span class="comment"> // Register 'drug::name' property with key 'name' and version '1'
</span> t<span class="operator">.</span>data<span class="operator">(&</span> drug<span class="operator">::</span>description<span class="operator">,</span><span class="string"> "desc"</span><span class="operator">);</span><span class="comment"> // Register 'drug::description' property with key 'desc'
</span><span class="operator">}}</span></pre>
</td></tr></tbody></table>
<br>
<br>
<font color="#100D5A"><a name="quick_sample_3">*
-----------------------------------------------------------------------------------------------<br>
* 3- <i>main.cpp</i> file : basic functionalities of QxOrm library with <i>drug</i> class<br> *
-----------------------------------------------------------------------------------------------
</a></font><br><br>
<table border="1" bgcolor="#FFFFFF"><col><tbody><tr><td title="main.cpp">
<pre><span class="pre">#include <span class="string">"precompiled.h"</span>
#include <span class="string">"drug.h"</span>
#include <span class="string"><QxMemLeak.h></span>
</span><span class="type">
int</span><span class="keyword"> main</span><span class="operator">(</span><span class="type">int</span> argc<span class="operator">,</span><span class="type"> char</span><span class="operator"> *</span> argv<span class="operator">[])
{</span>
QApplication app<span class="operator">(</span>argc<span class="operator">,</span> argv<span class="operator">);</span><span class="comment"> // Qt application
// Create 3 new drugs
// It is possible to use 'boost' and 'Qt' smart pointer : 'boost::shared_ptr', 'QSharedPointer', etc...
</span><span class="keyword"> typedef</span> boost<span class="operator">::</span>shared_ptr<span class="operator"><</span>drug<span class="operator">></span> drug_ptr<span class="operator">;</span>
drug_ptr d1<span class="operator">;</span> d1<span class="operator">.</span>reset<span class="operator">(</span><span class="keyword">new</span> drug<span class="operator">());</span> d1<span class="operator">-></span>name<span class="operator"> =</span><span class="string"> "name1"</span><span class="operator">;</span> d1<span class="operator">-></span>description<span class="operator"> =</span><span class="string"> "desc1"</span><span class="operator">;</span>
drug_ptr d2<span class="operator">;</span> d2<span class="operator">.</span>reset<span class="operator">(</span><span class="keyword">new</span> drug<span class="operator">());</span> d2<span class="operator">-></span>name<span class="operator"> =</span><span class="string"> "name2"</span><span class="operator">;</span> d2<span class="operator">-></span>description<span class="operator"> =</span><span class="string"> "desc2"</span><span class="operator">;</span>
drug_ptr d3<span class="operator">;</span> d3<span class="operator">.</span>reset<span class="operator">(</span><span class="keyword">new</span> drug<span class="operator">());</span> d3<span class="operator">-></span>name<span class="operator"> =</span><span class="string"> "name3"</span><span class="operator">;</span> d3<span class="operator">-></span>description<span class="operator"> =</span><span class="string"> "desc3"</span><span class="operator">;</span><span class="comment">
// Insert drugs into container
// It is possible to use a lot of containers from 'std', 'boost', 'Qt' and 'qx::QxCollection<Key, Value>'
</span><span class="keyword"> typedef</span> std<span class="operator">::</span>vector<span class="operator"><</span>drug_ptr<span class="operator">></span> type_lst_drug<span class="operator">;</span>
type_lst_drug lst_drug<span class="operator">;</span>
lst_drug<span class="operator">.</span>push_back<span class="operator">(</span>d1<span class="operator">);</span>
lst_drug<span class="operator">.</span>push_back<span class="operator">(</span>d2<span class="operator">);</span>
lst_drug<span class="operator">.</span>push_back<span class="operator">(</span>d3<span class="operator">);</span><span class="comment">
// Init parameters to communicate with a database
</span> qx<span class="operator">::</span>QxSqlDatabase<span class="operator">::</span>getSingleton<span class="operator">()-></span>setDriverName<span class="operator">(</span><span class="string">"QSQLITE"</span><span class="operator">);</span>
qx<span class="operator">::</span>QxSqlDatabase<span class="operator">::</span>getSingleton<span class="operator">()-></span>setDatabaseName<span class="operator">(</span><span class="string">"./test_qxorm.db"</span><span class="operator">);</span>
qx<span class="operator">::</span>QxSqlDatabase<span class="operator">::</span>getSingleton<span class="operator">()-></span>setHostName<span class="operator">(</span><span class="string">"localhost"</span><span class="operator">);</span>
qx<span class="operator">::</span>QxSqlDatabase<span class="operator">::</span>getSingleton<span class="operator">()-></span>setUserName<span class="operator">(</span><span class="string">"root"</span><span class="operator">);</span>
qx<span class="operator">::</span>QxSqlDatabase<span class="operator">::</span>getSingleton<span class="operator">()-></span>setPassword<span class="operator">(</span><span class="string">""</span><span class="operator">);</span><span class="comment">
// Create table 'drug' into database to store drugs
</span> QSqlError daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>create_table<span class="operator"><</span>drug<span class="operator">>();</span><span class="comment">
// Insert drugs from container to database
// 'id' property of 'd1', 'd2' and 'd3' are auto-updated
</span> daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>insert<span class="operator">(</span>lst_drug<span class="operator">);</span><span class="comment">
// Modify and update the second drug into database
</span> d2<span class="operator">-></span>name<span class="operator"> =</span><span class="string"> "name2 modified"</span><span class="operator">;</span>
d2<span class="operator">-></span>description<span class="operator"> =</span><span class="string"> "desc2 modified"</span><span class="operator">;</span>
daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>update<span class="operator">(</span>d2<span class="operator">);</span><span class="comment">
// Delete the first drug from database
</span> daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>delete_by_id<span class="operator">(</span>d1<span class="operator">);</span><span class="comment">
// Count drugs into database
</span><span class="type"> long</span> lDrugCount<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>count<span class="operator"><</span>drug<span class="operator">>();</span><span class="comment">
// Fetch drug with id '3' into a new variable
</span> drug_ptr d_tmp<span class="operator">;</span> d_tmp<span class="operator">.</span>reset<span class="operator">(</span><span class="keyword">new</span> drug<span class="operator">());</span>
d_tmp<span class="operator">-></span>id<span class="operator"> =</span><span class="int"> 3</span><span class="operator">;</span>
daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>fetch_by_id<span class="operator">(</span>d_tmp<span class="operator">);</span><span class="comment">
// Export drugs from container to a file under xml format (serialization)
</span> qx<span class="operator">::</span>serialization<span class="operator">::</span>xml<span class="operator">::</span>to_file<span class="operator">(</span>lst_drug<span class="operator">,</span><span class="string"> "./export_drugs.xml"</span><span class="operator">);</span><span class="comment">
// Import drugs from xml file into a new container
</span> type_lst_drug lst_drug_tmp<span class="operator">;</span>
qx<span class="operator">::</span>serialization<span class="operator">::</span>xml<span class="operator">::</span>from_file<span class="operator">(</span>lst_drug_tmp<span class="operator">,</span><span class="string"> "./export_drugs.xml"</span><span class="operator">);</span><span class="comment">
// Clone a drug
</span> drug_ptr d_clone<span class="operator"> =</span> qx<span class="operator">::</span>clone<span class="operator">(*</span> d1<span class="operator">);</span><span class="comment">
// Create a new drug by class name (factory)
</span> boost<span class="operator">::</span>any d_any<span class="operator"> =</span> qx<span class="operator">::</span>create<span class="operator">(</span><span class="string">"drug"</span><span class="operator">);</span><span class="comment">
// Insert drugs container into 'qx::cache'
</span> qx<span class="operator">::</span>cache<span class="operator">::</span>set<span class="operator">(</span><span class="string">"drugs"</span><span class="operator">,</span> lst_drug<span class="operator">);</span><span class="comment">
// Remove all elements from 'qx::cache'
</span> qx<span class="operator">::</span>cache<span class="operator">::</span>clear<span class="operator">();</span><span class="comment">
// Create a dummy memory leak
</span> drug<span class="operator"> *</span> pDummy<span class="operator"> =</span><span class="keyword"> new</span> drug<span class="operator">();</span><span class="flow">
return</span><span class="int"> 0</span><span class="operator">;
}</span></pre>
</td></tr></tbody></table>
<br>
<p><font color="#100D5A"><a name="quick_sample_4">*
-------------------------------------------------------------------------<br>
* 4- execute program and trace output debug<br> *
-------------------------------------------------------------------------
</a></font><br></p>
<p></p>
<font size="2">[QxOrm] qx::QxSqlDatabase : create new database
connection in thread '3616' with key
'{d315250c-b5c9-46e0-9402-f800368a6673}'<br>
[QxOrm] sql query (78 ms) : CREATE TABLE drug (id INTEGER NOT NULL
PRIMARY KEY AUTOINCREMENT, name TEXT, desc TEXT)<br>
[QxOrm] sql query (63 ms) : INSERT INTO drug (name, desc) VALUES
(:name, :desc)<br>
[QxOrm] sql query (62 ms) : UPDATE drug SET id = :id, name = :name,
desc = :desc WHERE id = :id_bis<br>
[QxOrm] sql query (63 ms) : DELETE FROM drug WHERE id = :id<br>
[QxOrm] sql query (0 ms) : SELECT COUNT(*) FROM drug<br>
[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<br>
[QxOrm] Leaked object at 0xf52ad8 (size 16, src\main.cpp:74)<br>
[QxOrm] **** 1 memory leaks found **** </font><br>
<br>
<p></p>
<font color="#100D5A"><a name="quick_sample_5">*
------------------------------------------------------------------------------<br>
* 5- <i>./export_drugs.xml</i> file created by the program<br> *
------------------------------------------------------------------------------</a>
</font><br>
<br>
<a href="./resource/quick_sample.export_drugs.xml.txt"><img
alt="quick_sample.export_drugs.xml"
src="./resource/quick_sample.export_drugs.xml.jpg" width="642"
height="452" border="0"></a>
</td>
</tr>
</tbody>
</table>
<br><hr style="width: 80%" align="center" size="1" color="#100D5A">
<table border="0" style="width: 80%" align="center">
<col><col>
<tbody>
<tr>
<td align="left" valign="middle"><img alt="QxOrm"
src="./resource/logo_qxorm_small.jpg" width="168" height="40"></td>
<td align="right" valign="middle"><font size="2"></font> </td>
</tr>
</tbody>
</table>
</body>
</html>