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