CloudSettingsRecord CloudSettingsRecord::factoryFromCloudSettings(const CloudSettings& cloudSettings, ProjectDatabase& database)
{
  if (cloudSettings.optionalCast<VagrantSettings>()) {
    return VagrantSettingsRecord(cloudSettings.cast<VagrantSettings>(), database);
  }
  if (cloudSettings.optionalCast<AWSSettings>()) {
    return AWSSettingsRecord(cloudSettings.cast<AWSSettings>(), database);
  }

  OS_ASSERT(false);
  return CloudSettingsRecord(boost::shared_ptr<detail::CloudSettingsRecord_Impl>());
}
std::vector<AWSSettingsRecord> AWSSettingsRecord::getAWSSettingsRecords(ProjectDatabase& database) {
  std::vector<AWSSettingsRecord> result;

  QSqlQuery query(*(database.qSqlDatabase()));
  query.prepare(toQString("SELECT * FROM " + CloudSettingsRecord::databaseTableName() + " WHERE cloudSettingsRecordType=:cloudSettingsRecordType"));
  query.bindValue(":cloudSettingsRecordType", CloudSettingsRecordType::AWSSettingsRecord);
  assertExec(query);
  while (query.next()) {
    result.push_back(AWSSettingsRecord(query, database));
  }

  return result;
}
boost::optional<AWSSettingsRecord> AWSSettingsRecord::factoryFromQuery(const QSqlQuery& query, ProjectDatabase& database)
{
  OptionalAWSSettingsRecord result;

  try {
    result = AWSSettingsRecord(query,database);
  }
  catch (const std::exception& e) {
    LOG(Error,"Unable to construct AWSSettingsRecord from query, because '" << e.what() << "'.");
  }

  return result;
}
boost::optional<AWSSettingsRecord> AWSSettingsRecord::getAWSSettingsRecord(int id, ProjectDatabase& database) {
  boost::optional<AWSSettingsRecord> result;

  QSqlQuery query(*(database.qSqlDatabase()));
  query.prepare(toQString("SELECT * FROM " + CloudSettingsRecord::databaseTableName() + " WHERE cloudSettingsRecordType=:cloudSettingsRecordType AND id=:id"));
  query.bindValue(":cloudSettingsRecordType", CloudSettingsRecordType::AWSSettingsRecord);
  query.bindValue(":id",id);
  assertExec(query);
  if (query.first()) {
    result = AWSSettingsRecord(query, database);
  }

  return result;
}
boost::optional<CloudSettingsRecord> CloudSettingsRecord::factoryFromQuery(const QSqlQuery& query, ProjectDatabase& database)
{
  OptionalCloudSettingsRecord result;

  int cloudSettingsRecordType = query.value(CloudSettingsRecordColumns::cloudSettingsRecordType).toInt();

  switch (cloudSettingsRecordType) {
    case CloudSettingsRecordType::VagrantSettingsRecord : 
      result = VagrantSettingsRecord(query, database).cast<CloudSettingsRecord>();
     break;
    case CloudSettingsRecordType::AWSSettingsRecord :
      result = AWSSettingsRecord(query, database).cast<AWSSettingsRecord>();
     break;
    default :
      LOG(Error,"Unknown CloudSettingsRecordType " << cloudSettingsRecordType);
      return boost::none;
  }

  return result;
}