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 CHANGED
@@ -1 +1 @@
1
- 0.0.5
1
+ 0.0.7
@@ -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.5"
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-06-22}
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() << " dogs meet criterion" << endl;
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(cout)
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
- _os << "Could not connect to DB";
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& os)
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
- _os << "Could not connect to DB";
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 std::vector<std::string>& tables,
40
- const std::vector<string>& columns,
41
- const std::string& where,
42
- const std::string& additional,
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
- _os << q << endl;
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
- cerr << "Query failed: " << q << endl << er.what();
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 std::vector<std::string>& tables,
83
- const std::string& where)
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
- _os << q << endl;
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
- cerr << "Query failed: " << q << endl << er.what();
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
- _os << q << endl;
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
- _os << q << endl;
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& os);
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& _os;
51
+ std::ostream* _os;
48
52
  };
49
53
 
50
54
  } //namespace DMMM
@@ -52,6 +52,7 @@ public:
52
52
 
53
53
 
54
54
  inline size_t& serialization() { return _id; }
55
+ inline const size_t& serialization() const { return _id; }
55
56
 
56
57
  private:
57
58
  size_t _id;
@@ -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
- - 5
9
- version: 0.0.5
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-06-22 00:00:00 +03:00
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
-