DboTest3.C 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. /*
  2. * Copyright (C) 2009 Emweb bvba, Kessel-Lo, Belgium.
  3. *
  4. * See the LICENSE file for terms of use.
  5. */
  6. #include <boost/test/unit_test.hpp>
  7. #include <Wt/Dbo/Dbo>
  8. #include <Wt/WDate>
  9. #include <Wt/WDateTime>
  10. #include <Wt/WTime>
  11. #include <Wt/Dbo/WtSqlTraits>
  12. #include <Wt/Dbo/ptr_tuple>
  13. #include "DboFixture.h"
  14. #include <string>
  15. namespace dbo = Wt::Dbo;
  16. class CustomerAddress;
  17. class Customer
  18. {
  19. public:
  20. Wt::Dbo::collection< Wt::Dbo::ptr<CustomerAddress> > addresses;
  21. Wt::Dbo::ptr<CustomerAddress> default_address;
  22. template<class Action>
  23. void persist(Action &action)
  24. {
  25. Wt::Dbo::hasMany(action, addresses, Wt::Dbo::ManyToOne);
  26. Wt::Dbo::belongsTo(action, default_address, "default_customer_address");
  27. }
  28. };
  29. class CustomerAddress
  30. {
  31. public:
  32. Wt::Dbo::ptr<Customer> customer;
  33. //Wt::Dbo::collection< Wt::Dbo::ptr<Customer> > customers;
  34. Wt::Dbo::weak_ptr<Customer> default_customer;
  35. template<class Action>
  36. void persist(Action &action)
  37. {
  38. Wt::Dbo::belongsTo(action, customer);
  39. //Wt::Dbo::hasMany(action, customers, Wt::Dbo::ManyToOne, "default_customer_address");
  40. Wt::Dbo::hasOne(action, default_customer, "default_customer_address");
  41. }
  42. };
  43. class FuncTest : public Wt::Dbo::Dbo<FuncTest>
  44. {
  45. public:
  46. int intC;
  47. double doubleC;
  48. template<class Action>
  49. void persist(Action &a)
  50. {
  51. Wt::Dbo::field(a, intC, "intC");
  52. Wt::Dbo::field(a, doubleC, "doubleC");
  53. }
  54. static const char *TableName()
  55. {
  56. return "func";
  57. }
  58. };
  59. struct Dbo3Fixture : DboFixtureBase
  60. {
  61. Dbo3Fixture() :
  62. DboFixtureBase()
  63. {
  64. session_->mapClass<Customer>("c");
  65. session_->mapClass<CustomerAddress>("ca");
  66. session_->mapClass<FuncTest>(FuncTest::TableName());
  67. try {
  68. session_->dropTables(); //todo:remove
  69. } catch (...) {
  70. }
  71. std::cout << "-------------------------- end of drop ----------------------*********" << std::endl;
  72. session_->createTables();
  73. }
  74. };
  75. BOOST_AUTO_TEST_CASE( dbo3_test2 )
  76. {
  77. Dbo3Fixture f;
  78. dbo::Session& session = *f.session_;
  79. {
  80. dbo::Transaction transaction(session);
  81. FuncTest *f1 = new FuncTest;
  82. f1->intC = 1;
  83. f1->doubleC = 1.1;
  84. session.add(f1);
  85. FuncTest *f2 = new FuncTest;
  86. f2->intC = 2;
  87. f2->doubleC = 2.2;
  88. session.add(f2);
  89. FuncTest *f3 = new FuncTest;
  90. f3->intC = 3;
  91. f3->doubleC = 3.3;
  92. session.add(f3);
  93. transaction.commit();
  94. }
  95. typedef boost::tuple<int, double> tupel;
  96. dbo::Transaction transaction(session);
  97. tupel tupe;
  98. #ifdef SQLITE3
  99. /*
  100. * Odd enough Sqlite3 thinks this is legal SQL, but postgres
  101. * complains (rightfully) that you can't combine aggregate and
  102. * non-aggregate fields.
  103. */
  104. tupe = session.query<tupel>(std::string(
  105. "SELECT SUM(\"intC\") as sc, \"doubleC\" FROM \"") +
  106. FuncTest::TableName() + "\"").limit(1);
  107. BOOST_REQUIRE(tupe.get<0>() == 6);
  108. #endif
  109. tupe = session.query<tupel>(std::string(
  110. "SELECT SUM(\"intC\") as sc, SUM(\"doubleC\") as dc FROM \"") +
  111. FuncTest::TableName() + "\"").limit(1);
  112. BOOST_REQUIRE(tupe.get<0>() == 6);
  113. // NOTE: can fail w/valgrind due to precision of emulated floating point
  114. BOOST_REQUIRE(std::abs(tupe.get<1>() - 6.6) < 0.001);
  115. double d = session.query<double>(std::string(
  116. "SELECT SUM(\"doubleC\" * \"intC\") as sc FROM \"") +
  117. FuncTest::TableName() + "\"").limit(1);
  118. BOOST_REQUIRE(std::abs(d - 15.4) < 0.001);//d == 15.4
  119. d = session.query<double>(std::string(
  120. "SELECT MAX(\"doubleC\" * \"intC\") as m FROM \"") +
  121. FuncTest::TableName() + "\"").limit(1);
  122. BOOST_REQUIRE(std::abs(d - 9.9) < 0.001);
  123. double i = session.query<double>(std::string(
  124. "SELECT AVG(\"intC\") as a FROM \"") +
  125. FuncTest::TableName() + "\"").limit(1);
  126. BOOST_REQUIRE(i == 2.0);
  127. i = session.query<int>(std::string(
  128. "SELECT COUNT(\"intC\") as c FROM \"") +
  129. FuncTest::TableName() + "\"").limit(1);
  130. BOOST_REQUIRE(i == 3);
  131. transaction.commit();
  132. }