dm-metamapper 0.0.5 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
-
|