dm-ldap-adapter 0.3.5 → 0.4.0.alpha2
Sign up to get free protection for your applications and to get access to all the features.
- data/.project +11 -0
- data/.yardoc +0 -0
- data/Manifest.txt +5 -2
- data/README-example.markdown +0 -1
- data/README.txt +15 -15
- data/Rakefile +4 -3
- data/env.sh +2 -0
- data/example/identity_map.rb +10 -10
- data/example/posix.rb +9 -9
- data/ldap-commands.txt +3 -0
- data/lib/adapters/ldap_adapter.rb +155 -118
- data/lib/adapters/noop_transaction.rb +16 -0
- data/lib/dummy_ldap_resource.rb +6 -6
- data/lib/ldap/array.rb +96 -12
- data/lib/ldap/conditions_2_filter.rb +95 -0
- data/lib/ldap/digest.rb +3 -3
- data/lib/ldap/net_ldap_facade.rb +28 -110
- data/lib/ldap/ruby_ldap_facade.rb +31 -116
- data/lib/ldap/version.rb +1 -1
- data/lib/ldap_resource.rb +113 -26
- data/spec/assiociations_ldap_adapter_spec.rb +129 -130
- data/spec/authentication_ldap_adapter_spec.rb +1 -6
- data/spec/ldap_adapter_spec.rb +164 -177
- data/spec/multi_repository_spec.rb +41 -5
- data/spec/multi_value_attributes_spec.rb +64 -31
- data/spec/sorting_spec.rb +16 -15
- data/spec/spec_helper.rb +34 -20
- metadata +67 -27
- data/lib/adapters/memory_adapter.rb +0 -79
- data/lib/adapters/simple_adapter.rb +0 -198
data/spec/sorting_spec.rb
CHANGED
@@ -2,28 +2,19 @@ $LOAD_PATH << File.dirname(__FILE__)
|
|
2
2
|
require 'spec_helper'
|
3
3
|
|
4
4
|
describe DataMapper.repository(:ldap).adapter do
|
5
|
-
|
5
|
+
|
6
6
|
describe 'belongs_to association' do
|
7
|
-
|
7
|
+
|
8
8
|
before do
|
9
9
|
DataMapper.repository(:ldap) do
|
10
10
|
User.all.destroy!
|
11
|
-
@user1 = User.create(:login => "black", :name => 'Black', :mail => "blackmail@
|
12
|
-
@user2 = User.create(:login => "brown", :name => 'brown', :mail => "brownmail@
|
11
|
+
@user1 = User.create(:login => "black", :name => 'Black', :mail => ["blackmail@example.com"], :age => 100)
|
12
|
+
@user2 = User.create(:login => "brown", :name => 'brown', :mail => ["brownmail@example.com"], :age => 25)
|
13
13
|
@user3 = User.create(:login => "blue", :name => 'Yellow')
|
14
14
|
@user4 = User.create(:login => "baluh", :name => 'Hmm')
|
15
15
|
end
|
16
16
|
end
|
17
|
-
|
18
|
-
after do
|
19
|
-
DataMapper.repository(:ldap) do
|
20
|
-
@user1.destroy
|
21
|
-
@user2.destroy
|
22
|
-
@user3.destroy
|
23
|
-
@user4.destroy
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
17
|
+
|
27
18
|
it 'should sort descending without order option' do
|
28
19
|
DataMapper.repository(:ldap) do
|
29
20
|
expected = User.all().sort do |u1, u2|
|
@@ -40,6 +31,12 @@ describe DataMapper.repository(:ldap).adapter do
|
|
40
31
|
end
|
41
32
|
User.all(:order => [:login]).should == expected
|
42
33
|
end
|
34
|
+
DataMapper.repository(:ldap) do
|
35
|
+
expected = User.all().sort do |u1, u2|
|
36
|
+
-1 * (u1.login <=> u2.login)
|
37
|
+
end
|
38
|
+
User.all(:order => [:login]).reverse.should == expected
|
39
|
+
end
|
43
40
|
end
|
44
41
|
it 'should sort case insensitive with order option' do
|
45
42
|
DataMapper.repository(:ldap) do
|
@@ -52,9 +49,13 @@ describe DataMapper.repository(:ldap).adapter do
|
|
52
49
|
|
53
50
|
it 'should sort with nil values' do
|
54
51
|
DataMapper.repository(:ldap) do
|
55
|
-
users = User.all(:order => [:
|
52
|
+
users = User.all(:order => [:name]).select { |u| !u.mail.nil? }
|
56
53
|
users.should == [@user1, @user2]
|
57
54
|
end
|
55
|
+
DataMapper.repository(:ldap) do
|
56
|
+
users = User.all(:order => [:name]).reverse.select { |u| !u.mail.nil? }
|
57
|
+
users.should == [@user2, @user1]
|
58
|
+
end
|
58
59
|
end
|
59
60
|
end
|
60
61
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -3,16 +3,17 @@ require 'rubygems'
|
|
3
3
|
require 'slf4r/ruby_logger'
|
4
4
|
Slf4r::LoggerFacade4RubyLogger.level = :info
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
require 'do_sqlite3'
|
6
|
+
require 'dm-sqlite-adapter'
|
7
|
+
require 'dm-migrations'
|
8
|
+
require 'dm-transactions'
|
10
9
|
require 'pathname'
|
11
10
|
$LOAD_PATH << Pathname(__FILE__).dirname.parent.expand_path + 'lib'
|
12
11
|
|
12
|
+
print "datamapper version:"
|
13
|
+
puts DataMapper::VERSION
|
14
|
+
|
13
15
|
require 'ldap_resource'
|
14
16
|
require 'adapters/ldap_adapter'
|
15
|
-
require 'adapters/memory_adapter'
|
16
17
|
|
17
18
|
DataMapper.setup(:default, 'sqlite3::memory:')
|
18
19
|
DataMapper.setup(:ldap, {
|
@@ -20,17 +21,30 @@ DataMapper.setup(:ldap, {
|
|
20
21
|
:host => 'localhost',
|
21
22
|
:port => '389',
|
22
23
|
:base => "dc=example,dc=com",
|
23
|
-
|
24
|
+
:facade => (ENV['FACADE'] || :net_ldap).to_sym,
|
24
25
|
:bind_name => "cn=admin,dc=example,dc=com",
|
25
|
-
:password => "
|
26
|
+
:password => "secret"
|
26
27
|
})
|
27
|
-
DataMapper.setup(:memory, {:adapter => 'memory'})
|
28
28
|
|
29
|
+
module DataMapper
|
30
|
+
module Resource
|
31
|
+
class State
|
32
|
+
|
33
|
+
# a persisted/deleted resource
|
34
|
+
class Deleted < Persisted
|
35
|
+
def set(subject, value)
|
36
|
+
warn 'Deleted resource cannot be modified ' + subject.inspect + ' ' + value.to_s + " " + @resource.inspect
|
37
|
+
super
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
29
43
|
class User
|
30
44
|
include DataMapper::Resource
|
31
45
|
property :id, Serial, :field => "uidnumber"
|
32
46
|
property :login, String, :field => "uid", :unique_index => true
|
33
|
-
property :hashed_password, String, :field => "userpassword", :
|
47
|
+
property :hashed_password, String, :field => "userpassword", :writer => :private
|
34
48
|
property :name, String, :field => "cn"
|
35
49
|
property :mail, String
|
36
50
|
property :age, Integer, :field => "postalcode"
|
@@ -62,7 +76,7 @@ class User
|
|
62
76
|
end
|
63
77
|
groups
|
64
78
|
end
|
65
|
-
|
79
|
+
|
66
80
|
dn_prefix { |user| "uid=#{user.login}"}
|
67
81
|
|
68
82
|
treebase "ou=people"
|
@@ -84,11 +98,11 @@ class Role
|
|
84
98
|
include DataMapper::Resource
|
85
99
|
property :id, Serial, :field => "gidnumber"
|
86
100
|
property :name, String, :field => "cn"
|
87
|
-
|
101
|
+
|
88
102
|
dn_prefix { |role| "cn=#{role.name}" }
|
89
|
-
|
103
|
+
|
90
104
|
treebase "ou=groups"
|
91
|
-
|
105
|
+
|
92
106
|
ldap_properties {{:objectclass => "posixGroup"}}
|
93
107
|
|
94
108
|
belongs_to :user
|
@@ -98,23 +112,23 @@ class Group
|
|
98
112
|
include DataMapper::Resource
|
99
113
|
property :id, Serial, :field => "gidnumber"
|
100
114
|
property :name, String, :field => "cn"
|
101
|
-
|
115
|
+
|
102
116
|
dn_prefix { |group| "cn=#{group.name}" }
|
103
|
-
|
117
|
+
|
104
118
|
treebase "ou=groups"
|
105
|
-
|
119
|
+
|
106
120
|
ldap_properties {{:objectclass => "posixGroup"}}
|
107
121
|
end
|
108
122
|
|
109
123
|
class GroupUser
|
110
124
|
include DataMapper::Resource
|
111
|
-
|
125
|
+
|
112
126
|
dn_prefix { |group_user| "cn=#{group_user.group.name}" }
|
113
|
-
|
127
|
+
|
114
128
|
treebase "ou=groups"
|
115
|
-
|
129
|
+
|
116
130
|
multivalue_field :memberuid
|
117
|
-
|
131
|
+
|
118
132
|
ldap_properties do |group_user|
|
119
133
|
{:cn=>"#{group_user.group.name}", :objectclass => "posixGroup"}
|
120
134
|
end
|
metadata
CHANGED
@@ -1,7 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dm-ldap-adapter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
hash: 436503056
|
5
|
+
prerelease: true
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 4
|
9
|
+
- 0
|
10
|
+
- alpha2
|
11
|
+
version: 0.4.0.alpha2
|
5
12
|
platform: ruby
|
6
13
|
authors:
|
7
14
|
- mkristian
|
@@ -9,49 +16,71 @@ autorequire:
|
|
9
16
|
bindir: bin
|
10
17
|
cert_chain: []
|
11
18
|
|
12
|
-
date:
|
19
|
+
date: 2010-10-19 00:00:00 +05:30
|
13
20
|
default_executable:
|
14
21
|
dependencies:
|
15
22
|
- !ruby/object:Gem::Dependency
|
16
23
|
name: ruby-net-ldap
|
17
|
-
|
18
|
-
|
19
|
-
|
24
|
+
prerelease: false
|
25
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
20
27
|
requirements:
|
21
28
|
- - "="
|
22
29
|
- !ruby/object:Gem::Version
|
30
|
+
hash: 23
|
31
|
+
segments:
|
32
|
+
- 0
|
33
|
+
- 0
|
34
|
+
- 4
|
23
35
|
version: 0.0.4
|
24
|
-
|
36
|
+
type: :runtime
|
37
|
+
version_requirements: *id001
|
25
38
|
- !ruby/object:Gem::Dependency
|
26
39
|
name: slf4r
|
27
|
-
|
28
|
-
|
29
|
-
|
40
|
+
prerelease: false
|
41
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
30
43
|
requirements:
|
31
44
|
- - ">="
|
32
45
|
- !ruby/object:Gem::Version
|
46
|
+
hash: 3
|
47
|
+
segments:
|
48
|
+
- 0
|
33
49
|
version: "0"
|
34
|
-
|
50
|
+
type: :runtime
|
51
|
+
version_requirements: *id002
|
35
52
|
- !ruby/object:Gem::Dependency
|
36
53
|
name: dm-core
|
37
|
-
|
38
|
-
|
39
|
-
|
54
|
+
prerelease: false
|
55
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
56
|
+
none: false
|
40
57
|
requirements:
|
41
|
-
- -
|
58
|
+
- - ~>
|
42
59
|
- !ruby/object:Gem::Version
|
43
|
-
|
44
|
-
|
60
|
+
hash: 23
|
61
|
+
segments:
|
62
|
+
- 1
|
63
|
+
- 0
|
64
|
+
- 0
|
65
|
+
version: 1.0.0
|
66
|
+
type: :runtime
|
67
|
+
version_requirements: *id003
|
45
68
|
- !ruby/object:Gem::Dependency
|
46
69
|
name: hoe
|
47
|
-
|
48
|
-
|
49
|
-
|
70
|
+
prerelease: false
|
71
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
50
73
|
requirements:
|
51
74
|
- - ">="
|
52
75
|
- !ruby/object:Gem::Version
|
76
|
+
hash: 5
|
77
|
+
segments:
|
78
|
+
- 2
|
79
|
+
- 3
|
80
|
+
- 3
|
53
81
|
version: 2.3.3
|
54
|
-
|
82
|
+
type: :development
|
83
|
+
version_requirements: *id004
|
55
84
|
description: ldap adapter for datamapper which uses either net-ldap or ruby-ldap
|
56
85
|
email:
|
57
86
|
- m.kristian@web.de
|
@@ -65,20 +94,23 @@ extra_rdoc_files:
|
|
65
94
|
- README.txt
|
66
95
|
- ldap-commands.txt
|
67
96
|
files:
|
97
|
+
- .project
|
98
|
+
- .yardoc
|
68
99
|
- History.txt
|
69
100
|
- MIT-LICENSE
|
70
101
|
- Manifest.txt
|
71
102
|
- README-example.markdown
|
72
103
|
- README.txt
|
73
104
|
- Rakefile
|
105
|
+
- env.sh
|
74
106
|
- example/identity_map.rb
|
75
107
|
- example/posix.rb
|
76
108
|
- ldap-commands.txt
|
77
109
|
- lib/adapters/ldap_adapter.rb
|
78
|
-
- lib/adapters/
|
79
|
-
- lib/adapters/simple_adapter.rb
|
110
|
+
- lib/adapters/noop_transaction.rb
|
80
111
|
- lib/dummy_ldap_resource.rb
|
81
112
|
- lib/ldap/array.rb
|
113
|
+
- lib/ldap/conditions_2_filter.rb
|
82
114
|
- lib/ldap/digest.rb
|
83
115
|
- lib/ldap/net_ldap_facade.rb
|
84
116
|
- lib/ldap/ruby_ldap_facade.rb
|
@@ -104,21 +136,29 @@ rdoc_options:
|
|
104
136
|
require_paths:
|
105
137
|
- lib
|
106
138
|
required_ruby_version: !ruby/object:Gem::Requirement
|
139
|
+
none: false
|
107
140
|
requirements:
|
108
141
|
- - ">="
|
109
142
|
- !ruby/object:Gem::Version
|
143
|
+
hash: 3
|
144
|
+
segments:
|
145
|
+
- 0
|
110
146
|
version: "0"
|
111
|
-
version:
|
112
147
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
148
|
+
none: false
|
113
149
|
requirements:
|
114
|
-
- - "
|
150
|
+
- - ">"
|
115
151
|
- !ruby/object:Gem::Version
|
116
|
-
|
117
|
-
|
152
|
+
hash: 25
|
153
|
+
segments:
|
154
|
+
- 1
|
155
|
+
- 3
|
156
|
+
- 1
|
157
|
+
version: 1.3.1
|
118
158
|
requirements: []
|
119
159
|
|
120
160
|
rubyforge_project: dm-ldap-adapter
|
121
|
-
rubygems_version: 1.3.
|
161
|
+
rubygems_version: 1.3.7
|
122
162
|
signing_key:
|
123
163
|
specification_version: 3
|
124
164
|
summary: ""
|
@@ -1,79 +0,0 @@
|
|
1
|
-
require "dm-core"
|
2
|
-
require 'adapters/simple_adapter'
|
3
|
-
|
4
|
-
# this and the SimpleAdapter is basically the
|
5
|
-
# dm-core/adapter/in_memory_adapter.rb most credits go dm-core.
|
6
|
-
# there are few bug fixes and enhancements.
|
7
|
-
module DataMapper
|
8
|
-
module Adapters
|
9
|
-
class MemoryAdapter < SimpleAdapter
|
10
|
-
|
11
|
-
public
|
12
|
-
|
13
|
-
# @see SimpleAdapter
|
14
|
-
def initialize(name, uri_or_options)
|
15
|
-
super
|
16
|
-
|
17
|
-
@records = Hash.new { |hash,model| hash[model] = Array.new }
|
18
|
-
@ids = Hash.new { |hash,model| hash[model] = 0 }
|
19
|
-
end
|
20
|
-
|
21
|
-
# @see SimpleAdapter
|
22
|
-
def create_resource(resource)
|
23
|
-
uniques = resource.model.properties.select do |prop|
|
24
|
-
prop if prop.unique_index
|
25
|
-
end
|
26
|
-
uniques.each do |prop|
|
27
|
-
raise PersistentError.new "#{prop.name} = #{prop.get(resource)} already exists" unless resource.model.first( prop.name => prop.get(resource) ).nil?
|
28
|
-
end
|
29
|
-
@records[resource.model] << resource
|
30
|
-
resource.id = (@ids[resource.model] += 1) if resource.key.size == 1
|
31
|
-
# and resource.key[0].serial?
|
32
|
-
resource
|
33
|
-
end
|
34
|
-
|
35
|
-
# @see SimpleAdapter
|
36
|
-
def update_resource(resource, attributes)
|
37
|
-
attributes.each do |property, value|
|
38
|
-
property.set!(resource, value)
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
# @see SimpleAdapter
|
43
|
-
def delete_resource(resource)
|
44
|
-
records = @records[resource.model]
|
45
|
-
records.delete(resource)
|
46
|
-
end
|
47
|
-
|
48
|
-
# @see SimpleAdapter
|
49
|
-
def read_resource(query)
|
50
|
-
read(query, false)
|
51
|
-
end
|
52
|
-
|
53
|
-
# @see SimpleAdapter
|
54
|
-
def read_resources(query)
|
55
|
-
read(query, true)
|
56
|
-
end
|
57
|
-
|
58
|
-
private
|
59
|
-
|
60
|
-
# helper to read either one or many resources matching the given query
|
61
|
-
def read(query, many)
|
62
|
-
model = query.model
|
63
|
-
conditions = query.conditions
|
64
|
-
|
65
|
-
match_with = many ? :select : :detect
|
66
|
-
|
67
|
-
result = @records[model].send(match_with) do |resource|
|
68
|
-
filter_resource(resource, conditions)
|
69
|
-
end
|
70
|
-
|
71
|
-
# TODO Sort
|
72
|
-
|
73
|
-
# TODO Limit
|
74
|
-
|
75
|
-
return result
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
@@ -1,198 +0,0 @@
|
|
1
|
-
require "dm-core"
|
2
|
-
require 'slf4r'
|
3
|
-
|
4
|
-
module DataMapper
|
5
|
-
module Adapters
|
6
|
-
class NoopTransaction
|
7
|
-
|
8
|
-
def close ; end
|
9
|
-
def begin ; end
|
10
|
-
def prepare ; end
|
11
|
-
def commit ; end
|
12
|
-
def rollback ; end
|
13
|
-
def rollback_prepared ; end
|
14
|
-
|
15
|
-
end
|
16
|
-
class SimpleAdapter < AbstractAdapter
|
17
|
-
|
18
|
-
include Slf4r::Logger
|
19
|
-
|
20
|
-
# @see AbstractAdapter
|
21
|
-
def transaction_primitive
|
22
|
-
NoopTransaction.new
|
23
|
-
end
|
24
|
-
|
25
|
-
def initialize(name, uri_or_options)
|
26
|
-
super(name, uri_or_options)
|
27
|
-
end
|
28
|
-
|
29
|
-
protected
|
30
|
-
|
31
|
-
# checks whether a given resource fullfils the conditions
|
32
|
-
# @param [DataMapper::Resource] resource
|
33
|
-
# @param [Array<Condition>] conditions
|
34
|
-
# @return [Boolean]
|
35
|
-
# true if the resource are within the conditions otherwise false
|
36
|
-
def filter_resource(resource, conditions)
|
37
|
-
#puts "condi"
|
38
|
-
#p conditions
|
39
|
-
# no conditation => no filter
|
40
|
-
if conditions.size == 0
|
41
|
-
true
|
42
|
-
else
|
43
|
-
conditions.all? do |tuple|
|
44
|
-
operator, property, bind_value = *tuple
|
45
|
-
|
46
|
-
value = property.get!(resource)
|
47
|
-
case operator
|
48
|
-
when :eql, :in then equality_comparison(bind_value, value)
|
49
|
-
when :not then !equality_comparison(bind_value, value)
|
50
|
-
when :like then Regexp.new(bind_value.gsub(/%/, ".*")) =~ value
|
51
|
-
when :gt then !value.nil? && value > bind_value
|
52
|
-
when :gte then !value.nil? && value >= bind_value
|
53
|
-
when :lt then !value.nil? && value < bind_value
|
54
|
-
when :lte then !value.nil? && value <= bind_value
|
55
|
-
else raise "Invalid query operator: #{operator.inspect}"
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
# helper method to dispatch the equality test for different
|
62
|
-
# classes
|
63
|
-
def equality_comparison(bind_value, value)
|
64
|
-
case bind_value
|
65
|
-
when Array, Range then bind_value.include?(value)
|
66
|
-
when NilClass then value.nil?
|
67
|
-
else bind_value == value
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
public
|
72
|
-
|
73
|
-
# @see AbstractAdapter
|
74
|
-
# @param [Array<DataMapper::Resources>] resources
|
75
|
-
# aaaa
|
76
|
-
# @return [Fixnum]
|
77
|
-
# number of the newly created resources
|
78
|
-
def create(resources)
|
79
|
-
resources.select do |resource|
|
80
|
-
|
81
|
-
create_resource(resource)
|
82
|
-
|
83
|
-
end.size # just return the number of create resources
|
84
|
-
end
|
85
|
-
|
86
|
-
# @see AbstractAdapter
|
87
|
-
# @param [Hash] attributes
|
88
|
-
# collection of attribute, i.e. the name/value pairs which
|
89
|
-
# needs to be updated
|
90
|
-
# @param [Query]
|
91
|
-
# on all resources which are selected by that query the
|
92
|
-
# update will be applied
|
93
|
-
# @return [Fixnum]
|
94
|
-
# number of the updated resources
|
95
|
-
def update(attributes, query)
|
96
|
-
read_many(query).select do |resource|
|
97
|
-
|
98
|
-
update_resource(resource, attributes)
|
99
|
-
|
100
|
-
end.size
|
101
|
-
end
|
102
|
-
|
103
|
-
# @see AbstractAdapter
|
104
|
-
# @param [DataMapper::Query] query
|
105
|
-
# which selects the resource
|
106
|
-
# @return [DataMapper::Resource]
|
107
|
-
# the found Resource or nil
|
108
|
-
def read_one(query)
|
109
|
-
result = read_resource(query)
|
110
|
-
if result.is_a? Resource
|
111
|
-
result
|
112
|
-
elsif result # assume result to be Array with the values
|
113
|
-
#puts "------------------"
|
114
|
-
#p result
|
115
|
-
query.model.load(result, query)
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
# @see AbstractAdapter
|
120
|
-
# @param [DataMapper::Query] query
|
121
|
-
# which selects the resources
|
122
|
-
# @return [DataMapper::Collection]
|
123
|
-
# collection of Resources
|
124
|
-
def read_many(query)
|
125
|
-
Collection.new(query) do |set|
|
126
|
-
result = read_resources(query)
|
127
|
-
#puts "read_many"
|
128
|
-
#p result
|
129
|
-
if result.size > 0 and result.first.is_a? Resource
|
130
|
-
set.replace(result)
|
131
|
-
else
|
132
|
-
result.each do |values|
|
133
|
-
set.load(values)
|
134
|
-
end
|
135
|
-
end
|
136
|
-
end
|
137
|
-
end
|
138
|
-
|
139
|
-
# @see AbstractAdapter
|
140
|
-
# @param [Query] query
|
141
|
-
# which selects the resources to be deleted
|
142
|
-
# @return [Fixnum]
|
143
|
-
# number of the deleted resources
|
144
|
-
def delete(query)
|
145
|
-
read_many(query).each do |resource|
|
146
|
-
|
147
|
-
delete_resource(resource)
|
148
|
-
|
149
|
-
end.size
|
150
|
-
end
|
151
|
-
|
152
|
-
private
|
153
|
-
|
154
|
-
# @param [DataMapper::Resource] resource
|
155
|
-
# which will be created
|
156
|
-
# @return [DataMapper::Resource]
|
157
|
-
# either the resource itself if the creation was successful or nil
|
158
|
-
def create_resource(resource)
|
159
|
-
raise NotImplementedError.new
|
160
|
-
end
|
161
|
-
|
162
|
-
# @param [DataMapper::Query] query
|
163
|
-
# which selects the resource
|
164
|
-
# @return [DataMapper::Resource,Array<String>]
|
165
|
-
# the resource or a set of values ordered in the same manner as query.fields attributes
|
166
|
-
def read_resource(query)
|
167
|
-
raise NotImplementedError.new
|
168
|
-
end
|
169
|
-
|
170
|
-
# @param [DataMapper::Query] query
|
171
|
-
# which selects the resources
|
172
|
-
# @return [Array<DataMapper::Resource>,Array<String>]
|
173
|
-
# resources or ordered values
|
174
|
-
# @see #read_resource
|
175
|
-
def read_resources(query)
|
176
|
-
raise NotImplementedError.new
|
177
|
-
end
|
178
|
-
|
179
|
-
# @param [DataMapper::Resource] resource
|
180
|
-
# which will be updated with the given attributes.
|
181
|
-
# @param [Hash] attributes
|
182
|
-
# the keys are the property names and the values are the new values of that property.
|
183
|
-
# @return [DataMapper::Resource]
|
184
|
-
# resource on success otherwise nil
|
185
|
-
def update_resource(resource, attributes)
|
186
|
-
raise NotImplementedError.new
|
187
|
-
end
|
188
|
-
|
189
|
-
# @param [DataMapper::Resource] resource
|
190
|
-
# which will be deleted
|
191
|
-
# @return [DataMapper::Resource]
|
192
|
-
# either the resource if the deletion was successful or nil
|
193
|
-
def delete_resource(resource)
|
194
|
-
raise NotImplementedError.new
|
195
|
-
end
|
196
|
-
end
|
197
|
-
end
|
198
|
-
end
|