aboutsummaryrefslogtreecommitdiff
path: root/common/inverse/test.hxx
blob: df93e5dae98309d4d6452b7517979b4206996c07 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// file      : common/inverse/test.hxx
// author    : Boris Kolpackov <boris@codesynthesis.com>
// copyright : Copyright (c) 2009-2010 Code Synthesis Tools CC
// license   : GNU GPL v2; see accompanying LICENSE file

#ifndef TEST_HXX
#define TEST_HXX

#include <set>
#include <vector>
#include <string>
#include <memory>
#include "tr1-memory.hxx"

#include <odb/core.hxx>

struct obj1;
struct obj2;
struct obj3;

typedef obj1* obj1_ptr;
typedef obj2* obj2_ptr;
typedef obj3* obj3_ptr;

typedef std::set<obj3_ptr> obj3_ptr_set;

#pragma db object
struct obj1
{
  obj1 (): o2 (0) {}
  ~obj1 ();

  #pragma db id
  std::string id;

  obj2_ptr o2;

  #pragma db id_column("obj1_id") value_column("obj3_id")
  obj3_ptr_set o3;
};

#pragma db object
struct obj2
{
  #pragma db id auto
  int id;

  std::string str;

  // one-to-one
  //
  #pragma db inverse(o2)
  obj1_ptr o1;
};

#pragma db object
struct obj3
{
  #pragma db id auto
  int id;

  std::string str;

  // one-to-many
  //
  #pragma db inverse (o3)
  obj1_ptr o1;
};

inline obj1::
~obj1 ()
{
  delete o2;
  for (obj3_ptr_set::iterator i (o3.begin ()); i != o3.end (); ++i)
    delete *i;
}

// TR1 version
//
#ifdef HAVE_TR1_MEMORY
struct tr1_obj1;
struct tr1_obj2;
struct tr1_obj3;

typedef std::tr1::shared_ptr<tr1_obj1> tr1_obj1_ptr;
typedef std::tr1::shared_ptr<tr1_obj2> tr1_obj2_ptr;
typedef std::tr1::shared_ptr<tr1_obj3> tr1_obj3_ptr;

typedef std::tr1::weak_ptr<tr1_obj1> tr1_obj1_wptr;

typedef std::vector<tr1_obj3_ptr> tr1_obj3_ptr_vec;

#pragma db object pointer(tr1_obj1_ptr)
struct tr1_obj1
{
  #pragma db id
  std::string id;

  tr1_obj2_ptr o2;

  #pragma db id_column("tr1_obj1_id") value_column("tr1_obj3_id")
  tr1_obj3_ptr_vec o3;
};

#pragma db object pointer(tr1_obj2_ptr)
struct tr1_obj2
{
  #pragma db id auto
  int id;

  std::string str;

  #pragma db inverse(o2)
  tr1_obj1_wptr o1;
};

#pragma db object pointer(tr1_obj3_ptr)
struct tr1_obj3
{
  #pragma db id auto
  int id;

  std::string str;

  // one-to-many
  //
  #pragma db inverse (o3)
  tr1_obj1_wptr o1;
};
#endif

#endif // TEST_HXX