dm-metamapper 0.0.5 → 0.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/VERSION +1 -1
- data/dm-metamapper.gemspec +3 -3
- data/example/example.cpp +5 -2
- data/example/example.rb +1 -4
- data/lib/dm-metamapper.rb +1 -1
- data/lib/dm-metamapper/model.rb +36 -0
- data/lib/templates/cpp/class.hpp.erb +6 -0
- data/lib/templates/cpp/dmmm_dbface.cpp.erb +62 -17
- data/lib/templates/cpp/dmmm_dbface.h.erb +7 -3
- data/lib/templates/cpp/dmmm_id.hpp.erb +1 -0
- data/lib/templates/cpp/instance.hpp.erb +6 -0
- metadata +4 -4
- data/lib/dm-metamapper/extension.rb +0 -32
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.7
|
data/dm-metamapper.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{dm-metamapper}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.7"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Jonah Honeyman", "Omer Tamuz"]
|
12
|
-
s.date = %q{2010-
|
12
|
+
s.date = %q{2010-07-08}
|
13
13
|
s.description = %q{C++ API for databases created with DM. Hard typing, compile time checked queries.}
|
14
14
|
s.email = %q{jonah@honeyman.org}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -29,10 +29,10 @@ Gem::Specification.new do |s|
|
|
29
29
|
"example/example.rb",
|
30
30
|
"lib/dm-metamapper.rb",
|
31
31
|
"lib/dm-metamapper/config.rb",
|
32
|
-
"lib/dm-metamapper/extension.rb",
|
33
32
|
"lib/dm-metamapper/generator.rb",
|
34
33
|
"lib/dm-metamapper/generators/cpp.rb",
|
35
34
|
"lib/dm-metamapper/metamapper.rb",
|
35
|
+
"lib/dm-metamapper/model.rb",
|
36
36
|
"lib/dm-metamapper/property.rb",
|
37
37
|
"lib/dm-metamapper/template.rb",
|
38
38
|
"lib/templates/cpp/class.hpp.erb",
|
data/example/example.cpp
CHANGED
@@ -13,7 +13,7 @@ int main(int argc, char* argv[])
|
|
13
13
|
string user("root");
|
14
14
|
string database("dmmm");
|
15
15
|
string password("");
|
16
|
-
DBFace dbFace(database, host, user, password);
|
16
|
+
DBFace dbFace(database, host, user, password, &cout);
|
17
17
|
|
18
18
|
T_Dog d;
|
19
19
|
T_User u;
|
@@ -65,7 +65,10 @@ int main(int argc, char* argv[])
|
|
65
65
|
T_Dog dconst(T_User(u._name() == "omer"));
|
66
66
|
dogs.clear();
|
67
67
|
dconst.select(d._stinks() == true, dogs);
|
68
|
-
cout << dogs.size()
|
68
|
+
cout << dogs.size()
|
69
|
+
<< " dogs meet criterion" << endl;
|
70
|
+
cout << dconst.count(d._stinks() == true)
|
71
|
+
<< " dogs meet criterion" << endl;
|
69
72
|
dconst.erase();
|
70
73
|
|
71
74
|
d.erase(d._user_id() == u2._id());
|
data/example/example.rb
CHANGED
@@ -3,7 +3,7 @@ require "rubygems"
|
|
3
3
|
require "bundler"
|
4
4
|
Bundler.setup(:default, :test)
|
5
5
|
require "dm-core"
|
6
|
-
require "lib/dm-metamapper.rb"
|
6
|
+
require File.expand_path("../../lib/dm-metamapper.rb", __FILE__)
|
7
7
|
require "dm-metamapper/generators/cpp"
|
8
8
|
|
9
9
|
#DataMapper.setup(:default, "sqlite3::memory:")
|
@@ -11,7 +11,6 @@ DataMapper.setup(:default, "mysql://root@localhost/dmmm")
|
|
11
11
|
|
12
12
|
class User
|
13
13
|
include DataMapper::Resource
|
14
|
-
extend DataMapper::MetaMapper::Extension
|
15
14
|
|
16
15
|
has n, :dogs
|
17
16
|
|
@@ -23,7 +22,6 @@ end
|
|
23
22
|
|
24
23
|
class Dog
|
25
24
|
include DataMapper::Resource
|
26
|
-
extend DataMapper::MetaMapper::Extension
|
27
25
|
|
28
26
|
belongs_to :user
|
29
27
|
has n, :little_fleas
|
@@ -36,7 +34,6 @@ end
|
|
36
34
|
|
37
35
|
class LittleFlea
|
38
36
|
include DataMapper::Resource
|
39
|
-
extend DataMapper::MetaMapper::Extension
|
40
37
|
|
41
38
|
belongs_to :dog
|
42
39
|
|
data/lib/dm-metamapper.rb
CHANGED
@@ -2,9 +2,9 @@ $:.push File.dirname(__FILE__)
|
|
2
2
|
|
3
3
|
require 'dm-core'
|
4
4
|
require 'dm-metamapper/property'
|
5
|
+
require 'dm-metamapper/model'
|
5
6
|
require 'dm-metamapper/config'
|
6
7
|
require 'dm-metamapper/metamapper'
|
7
|
-
require 'dm-metamapper/extension'
|
8
8
|
require 'dm-metamapper/template'
|
9
9
|
require 'dm-metamapper/generator'
|
10
10
|
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module DataMapper
|
2
|
+
module Model
|
3
|
+
class << self
|
4
|
+
alias_method :_extended, :extended
|
5
|
+
|
6
|
+
def extended(model)
|
7
|
+
_extended(model)
|
8
|
+
DataMapper::MetaMapper.register(model)
|
9
|
+
model.instance_variable_set(:@_skipped_generation_formats, [])
|
10
|
+
class <<model; attr_reader :_skipped_generation_formats end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def doesnt_generate(*layouts)
|
15
|
+
@_skipped_generation_formats = Array(layouts)
|
16
|
+
end
|
17
|
+
alias_method :dont_generate, :doesnt_generate
|
18
|
+
alias_method :skip_generation, :doesnt_generate
|
19
|
+
|
20
|
+
def generates?(format)
|
21
|
+
!@_skipped_generation_formats.include?(format)
|
22
|
+
end
|
23
|
+
|
24
|
+
def generate(format)
|
25
|
+
DataMapper::MetaMapper.generate(format, self)
|
26
|
+
end
|
27
|
+
|
28
|
+
def generated_properties
|
29
|
+
@_generated_properties ||= properties.select {|prop|
|
30
|
+
!prop.options[:skip_generation]
|
31
|
+
}
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
@@ -79,6 +79,12 @@ public:
|
|
79
79
|
}
|
80
80
|
}
|
81
81
|
|
82
|
+
size_t count(const Condition& c)
|
83
|
+
{
|
84
|
+
Condition c1 = _constraint.nil() ? c : _constraint && c;
|
85
|
+
return DBFace::instance()->count(_tables, c1._cond);
|
86
|
+
}
|
87
|
+
|
82
88
|
void erase(const Condition& c)
|
83
89
|
{
|
84
90
|
Condition c1 = _constraint.nil() ? c : _constraint && c;
|
@@ -8,13 +8,14 @@ DBFace* DBFace::_this = NULL;
|
|
8
8
|
|
9
9
|
DBFace::DBFace(const string& database, const string& host,
|
10
10
|
const string& user, const string& password)
|
11
|
-
: _os(
|
11
|
+
: _os(NULL)
|
12
12
|
{
|
13
13
|
_this = this;
|
14
14
|
if (!_connection.connect(database.c_str(), host.c_str(),
|
15
15
|
user.c_str(), password.c_str()))
|
16
16
|
{
|
17
|
-
|
17
|
+
if (_os)
|
18
|
+
(*_os) << "Could not connect to DB";
|
18
19
|
cerr << "Could not connect to DB";
|
19
20
|
exit(-1);
|
20
21
|
}
|
@@ -22,24 +23,38 @@ DBFace::DBFace(const string& database, const string& host,
|
|
22
23
|
|
23
24
|
DBFace::DBFace(const string& database, const string& host,
|
24
25
|
const string& user, const string& password,
|
25
|
-
ostream
|
26
|
+
ostream* os)
|
26
27
|
: _os(os)
|
27
28
|
{
|
28
29
|
_this = this;
|
29
30
|
if (!_connection.connect(database.c_str(), host.c_str(),
|
30
31
|
user.c_str(), password.c_str()))
|
31
32
|
{
|
32
|
-
|
33
|
+
if (_os)
|
34
|
+
(*_os) << "Could not connect to DB";
|
33
35
|
cerr << "Could not connect to DB";
|
34
36
|
exit(-1);
|
35
37
|
}
|
36
38
|
}
|
37
39
|
|
40
|
+
void
|
41
|
+
DBFace::log(const string& message)
|
42
|
+
{
|
43
|
+
if (_os)
|
44
|
+
(*_os) << "DMMM: " << message << endl;
|
45
|
+
}
|
46
|
+
|
47
|
+
void
|
48
|
+
DBFace::logError(const string& message)
|
49
|
+
{
|
50
|
+
log(string("ERROR: ") + message);
|
51
|
+
}
|
52
|
+
|
38
53
|
bool
|
39
|
-
DBFace::select(const
|
40
|
-
const
|
41
|
-
const
|
42
|
-
const
|
54
|
+
DBFace::select(const vector<string>& tables,
|
55
|
+
const vector<string>& columns,
|
56
|
+
const string& where,
|
57
|
+
const string& additional,
|
43
58
|
QueryRes& rRes)
|
44
59
|
{
|
45
60
|
boost::mutex::scoped_lock lock(_mutex);
|
@@ -59,13 +74,13 @@ DBFace::select(const std::vector<std::string>& tables,
|
|
59
74
|
q << " WHERE " << where;
|
60
75
|
if (additional.size())
|
61
76
|
q << " " << additional;
|
62
|
-
|
77
|
+
log(q.str());
|
63
78
|
StoreQueryResult mysqlRes;
|
64
79
|
try{
|
65
80
|
mysqlRes = q.store();
|
66
81
|
}
|
67
82
|
catch (const mysqlpp::Exception& er) {
|
68
|
-
|
83
|
+
logError(er.what());
|
69
84
|
return false;
|
70
85
|
}
|
71
86
|
|
@@ -77,10 +92,39 @@ DBFace::select(const std::vector<std::string>& tables,
|
|
77
92
|
return true;
|
78
93
|
}
|
79
94
|
|
95
|
+
size_t
|
96
|
+
DBFace::count(const vector<string>& tables,
|
97
|
+
const string& where)
|
98
|
+
{
|
99
|
+
boost::mutex::scoped_lock lock(_mutex);
|
100
|
+
|
101
|
+
Query q = _connection.query();
|
102
|
+
|
103
|
+
q << "SELECT count(*) as count FROM " << tables[0];
|
104
|
+
for (size_t i = 1; i < tables.size(); ++i)
|
105
|
+
q << ", " + tables[i];
|
106
|
+
if (where.size())
|
107
|
+
q << " WHERE " << where;
|
108
|
+
log(q.str());
|
109
|
+
StoreQueryResult mysqlRes;
|
110
|
+
try{
|
111
|
+
mysqlRes = q.store();
|
112
|
+
}
|
113
|
+
catch (const mysqlpp::Exception& er) {
|
114
|
+
logError(er.what());
|
115
|
+
return false;
|
116
|
+
}
|
117
|
+
|
118
|
+
if (mysqlRes.num_rows() == 1)
|
119
|
+
return UTILS::fromString<size_t>(UTILS::toString(mysqlRes[0]["count"]));
|
120
|
+
else
|
121
|
+
return 0;
|
122
|
+
}
|
123
|
+
|
80
124
|
|
81
125
|
bool
|
82
|
-
DBFace::erase(const
|
83
|
-
const
|
126
|
+
DBFace::erase(const vector<string>& tables,
|
127
|
+
const string& where)
|
84
128
|
{
|
85
129
|
Query q = _connection.query();
|
86
130
|
q << "DELETE FROM " << tables[0];
|
@@ -90,7 +134,7 @@ DBFace::erase(const std::vector<std::string>& tables,
|
|
90
134
|
q << " INNER JOIN " + tables[i];
|
91
135
|
if (where.size())
|
92
136
|
q << " WHERE " << where;
|
93
|
-
|
137
|
+
log(q.str());
|
94
138
|
return executeQuery(q);
|
95
139
|
|
96
140
|
}
|
@@ -104,7 +148,7 @@ DBFace::executeQuery(Query& q)
|
|
104
148
|
q.execute();
|
105
149
|
}
|
106
150
|
catch (const mysqlpp::Exception& er) {
|
107
|
-
|
151
|
+
logError(er.what());
|
108
152
|
return false;
|
109
153
|
}
|
110
154
|
return true;
|
@@ -115,9 +159,9 @@ DBFace::getLastInsertId(Query& rQuery, size_t& rId)
|
|
115
159
|
{
|
116
160
|
try{
|
117
161
|
rId = rQuery.insert_id();
|
118
|
-
_os << "got last insert ID: " << rId << endl;
|
119
162
|
}
|
120
163
|
catch (const mysqlpp::Exception& er) {
|
164
|
+
logError(er.what());
|
121
165
|
return false;
|
122
166
|
}
|
123
167
|
return true;
|
@@ -149,7 +193,7 @@ DBFace::insert(const string& table,
|
|
149
193
|
q << quote << it->second;
|
150
194
|
}
|
151
195
|
q << ")";
|
152
|
-
|
196
|
+
log(q.str());
|
153
197
|
bool ok = executeQuery(q);
|
154
198
|
ok = ok && getLastInsertId(q, rInsertId);
|
155
199
|
return ok;
|
@@ -172,13 +216,14 @@ DBFace::update(const string& table,
|
|
172
216
|
}
|
173
217
|
if (where.size())
|
174
218
|
q << " WHERE " << where;
|
175
|
-
|
219
|
+
log(q.str());
|
176
220
|
return executeQuery(q);
|
177
221
|
}
|
178
222
|
|
179
223
|
string
|
180
224
|
DBFace::now()
|
181
225
|
{
|
226
|
+
boost::mutex::scoped_lock lock(_mutex);
|
182
227
|
Query q = _connection.query();
|
183
228
|
|
184
229
|
q << "SELECT NOW()";
|
@@ -18,7 +18,7 @@ public:
|
|
18
18
|
const std::string& user, const std::string& password);
|
19
19
|
DBFace(const std::string& database, const std::string& host,
|
20
20
|
const std::string& user, const std::string& password,
|
21
|
-
std::ostream
|
21
|
+
std::ostream* os);
|
22
22
|
|
23
23
|
bool insert(const std::string& table,
|
24
24
|
const std::map<std::string, std::string>& field2Val,
|
@@ -33,10 +33,14 @@ public:
|
|
33
33
|
QueryRes& rRes);
|
34
34
|
bool erase(const std::vector<std::string>& table,
|
35
35
|
const std::string& where);
|
36
|
-
|
36
|
+
size_t count(const std::vector<std::string>& tables,
|
37
|
+
const std::string& where);
|
38
|
+
|
37
39
|
std::string now();
|
38
40
|
|
39
41
|
private:
|
42
|
+
void log(const std::string& message);
|
43
|
+
void logError(const std::string& message);
|
40
44
|
bool getLastInsertId(mysqlpp::Query& rQuery, size_t& rId);
|
41
45
|
bool executeQuery(mysqlpp::Query& rQuery);
|
42
46
|
|
@@ -44,7 +48,7 @@ private:
|
|
44
48
|
mysqlpp::Connection _connection;
|
45
49
|
mutable boost::mutex _mutex;
|
46
50
|
static DBFace* _this;
|
47
|
-
std::ostream
|
51
|
+
std::ostream* _os;
|
48
52
|
};
|
49
53
|
|
50
54
|
} //namespace DMMM
|
@@ -32,6 +32,12 @@ public:
|
|
32
32
|
{}
|
33
33
|
<% end %>
|
34
34
|
|
35
|
+
<% if model.serial %>
|
36
|
+
O_<%= class_name %>(const I_<%= class_name %>& id)
|
37
|
+
: _f_<%= model.serial.name %>(id)
|
38
|
+
{}
|
39
|
+
<% end %>
|
40
|
+
|
35
41
|
<% model.generated_properties.each do |property| %>
|
36
42
|
const <%= property.cpp_name %>::Base& _<%= property.name %>() const {
|
37
43
|
return _f_<%= property.name %>._base;
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 7
|
9
|
+
version: 0.0.7
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Jonah Honeyman
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-
|
18
|
+
date: 2010-07-08 00:00:00 +03:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|
@@ -41,10 +41,10 @@ files:
|
|
41
41
|
- example/example.rb
|
42
42
|
- lib/dm-metamapper.rb
|
43
43
|
- lib/dm-metamapper/config.rb
|
44
|
-
- lib/dm-metamapper/extension.rb
|
45
44
|
- lib/dm-metamapper/generator.rb
|
46
45
|
- lib/dm-metamapper/generators/cpp.rb
|
47
46
|
- lib/dm-metamapper/metamapper.rb
|
47
|
+
- lib/dm-metamapper/model.rb
|
48
48
|
- lib/dm-metamapper/property.rb
|
49
49
|
- lib/dm-metamapper/template.rb
|
50
50
|
- lib/templates/cpp/class.hpp.erb
|
@@ -1,32 +0,0 @@
|
|
1
|
-
module DataMapper
|
2
|
-
module MetaMapper
|
3
|
-
module Extension
|
4
|
-
def doesnt_generate(*layouts)
|
5
|
-
@_skipped_generation_formats = Array(layouts)
|
6
|
-
end
|
7
|
-
alias_method :dont_generate, :doesnt_generate
|
8
|
-
alias_method :skip_generation, :doesnt_generate
|
9
|
-
|
10
|
-
def generates?(format)
|
11
|
-
!@_skipped_generation_formats.include?(format)
|
12
|
-
end
|
13
|
-
|
14
|
-
def generate(format)
|
15
|
-
DataMapper::MetaMapper.generate(format, self)
|
16
|
-
end
|
17
|
-
|
18
|
-
def generated_properties
|
19
|
-
@_generated_properties ||= properties.select {|prop|
|
20
|
-
!prop.options[:skip_generation]
|
21
|
-
}
|
22
|
-
end
|
23
|
-
|
24
|
-
def self.extended(base)
|
25
|
-
DataMapper::MetaMapper.register(base)
|
26
|
-
base.instance_variable_set(:@_skipped_generation_formats, [])
|
27
|
-
class <<base; attr_reader :_skipped_generation_formats end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|