# File lib/flexirecord.rb, line 1074
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