1074: def save
1075: synchronize do
1076: used_columns = self.used_columns
1077: primary_key = nil
1078: if @saved
1079: if self.class.primary_columns.empty?
1080: raise "Can not re-save a record of a table without a primary key."
1081: end
1082: primary_key = self.class.db_query1(
1083: 'UPDATE ' << self.class.table <<
1084: ' SET ' << (used_columns.collect { |column| '"' << column << '" = $' }.join(', ')) <<
1085: ' WHERE ' << (self.class.primary_columns.collect { |column| '"' << column << '" = $' }.join(' AND ')) <<
1086: ' RETURNING ' << (self.class.primary_columns.collect { |column| '"' << column << '"' }.join(', ')),
1087: *(
1088: used_columns.collect { |column| read(column) } +
1089: self.class.primary_columns.collect { |column| @old_primary_key[column] }
1090: )
1091: )
1092: else
1093: if used_columns.empty?
1094: primary_key = self.class.db_query1('INSERT INTO ' << self.class.table << ' DEFAULT VALUES' <<
1095: (self.class.primary_columns.empty? ? '' : (
1096: ' RETURNING ' << (self.class.primary_columns.collect { |column| '"' << column << '"' }.join(', '))
1097: )))
1098: else
1099: primary_key = self.class.db_query1(
1100: 'INSERT INTO ' << self.class.table <<
1101: ' (' << (used_columns.collect { |column| '"' << column << '"' }.join(', ')) << ')' <<
1102: ' VALUES (' << (used_columns.collect { |column| '$' }.join(', ')) << ')' <<
1103: (self.class.primary_columns.empty? ? '' : (
1104: ' RETURNING ' << (self.class.primary_columns.collect { |column| '"' << column << '"' }.join(', '))
1105: )),
1106: *(
1107: used_columns.collect { |column| read(column) }
1108: )
1109: )
1110: end
1111: @saved = true
1112: end
1113: unless primary_key.nil?
1114: self.class.primary_columns.each do |column|
1115: self.set(column, primary_key.read(column))
1116: end
1117: end
1118: copy_primary_key
1119: return self
1120: end
1121: end