lib/swift/adapter.rb in swift-0.8.0 vs lib/swift/adapter.rb in swift-0.8.1
- old
+ new
@@ -81,25 +81,24 @@
# @example Coerce hash to scheme.
# Swif.db.create(User, name: 'Apple Arthurton', age: 32)
# @example Multiple relations.
# apple = User.new(name: 'Apple Arthurton', age: 32)
# benny = User.new(name: 'Benny Arthurton', age: 30)
- # Swift.db.first(User, apple, benny)
+ # Swift.db.create(User, apple, benny)
# @example Coerce multiple relations.
- # Swift.db.first(User, {name: 'Apple Arthurton', age: 32}, {name: 'Benny Arthurton', age: 30})
+ # Swift.db.create(User, {name: 'Apple Arthurton', age: 32}, {name: 'Benny Arthurton', age: 30})
#
# @param [Swift::Scheme] scheme Concrete scheme subclass to load.
# @param [Swift::Scheme, Hash> *relations Scheme or tuple hash. Hashes will be coerced into scheme via Swift::Scheme#new
# @return [Array<Swift::Scheme>]
# @see Swift::Scheme.create
def create scheme, *relations
statement = prepare_create(scheme)
relations.map do |relation|
relation = scheme.new(relation) unless relation.kind_of?(scheme)
- if statement.execute(*relation.tuple.values_at(*scheme.header.insertable)) && scheme.header.serial
- relation.tuple[scheme.header.serial] = statement.insert_id
- end
+ result = statement.execute(*relation.tuple.values_at(*scheme.header.insertable))
+ relation.tuple[scheme.header.serial] = result.insert_id if scheme.header.serial
relation
end
end
# Update one or more.
@@ -127,11 +126,13 @@
# @see Swift::Scheme#update
def update scheme, *relations
statement = prepare_update(scheme)
relations.map do |relation|
relation = scheme.new(relation) unless relation.kind_of?(scheme)
- statement.execute(*relation.tuple.values_at(*scheme.header.updatable, *scheme.header.keys))
+ keys = relation.tuple.values_at(*scheme.header.keys)
+ raise ArgumentError, "relation has incomplete key : #{relation.inspect}" unless keys.select(&:nil?).empty?
+ statement.execute(*relation.tuple.values_at(*scheme.header.updatable), *keys)
relation
end
end
# Destroy one or more.
@@ -158,22 +159,42 @@
# @see Swift::Scheme#destroy
def destroy scheme, *relations
statement = prepare_destroy(scheme)
relations.map do |relation|
relation = scheme.new(relation) unless relation.kind_of?(scheme)
- if result = statement.execute(*relation.tuple.values_at(*scheme.header.keys))
+ keys = relation.tuple.values_at(*scheme.header.keys)
+ raise ArgumentError, "relation has incomplete key : #{relation.inspect}" unless keys.select(&:nil?).empty?
+ if result = statement.execute(*keys)
relation.freeze
end
result
end
end
+
+ # Delete one or more rows
+ #
+ # @example All.
+ # Swift.db.delete(User)
+ # @example All with conditions and binds.
+ # Swift.db.delete(User, ':name = ? and :age > ?', 'Apple Arthurton', 32)
+ #
+ # @param [Swift::Scheme] scheme Concrete scheme subclass
+ # @param [String] conditions Optional SQL 'where' fragment.
+ # @param [Object, ...] *binds Optional bind values that accompany conditions SQL fragment.
+ # @return [Swift::Result]
+ def delete scheme, conditions = '', *binds
+ sql = "delete from #{scheme.store}"
+ sql += " where #{exchange_names(scheme, conditions)}" unless conditions.empty?
+ execute(sql, *binds)
+ end
+
def migrate! scheme
keys = scheme.header.keys
fields = scheme.header.map{|p| field_definition(p)}.join(', ')
fields += ", primary key (#{keys.join(', ')})" unless keys.empty?
- execute("drop table if exists #{scheme.store}")
+ execute("drop table if exists #{scheme.store} cascade")
execute("create table #{scheme.store} (#{fields})")
end
protected
def exchange_names scheme, query