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 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
-