content: package org.sql2o.data;
  
  import org.sql2o.Sql2oException;
  import org.sql2o.converters.ConverterException;
  import org.sql2o.quirks.Quirks;
  
  import java.math.BigDecimal;
  import java.util.*;
  
  import static org.sql2o.converters.Convert.throwIfNull;
  
  /**
   * Represents a result set row.
   */
  public class Row {
      
      private final Object[] values;
      private final boolean isCaseSensitive;
      private final Quirks quirks;
      private final Map<String, Integer> columnNameToIdxMap;
  
      public Row(Map<String, Integer> columnNameToIdxMap, int columnCnt, boolean isCaseSensitive, Quirks quirks) {
          this.columnNameToIdxMap = columnNameToIdxMap;
          this.isCaseSensitive = isCaseSensitive;
          this.quirks = quirks;
          // lol. array works better
          this.values = new Object[columnCnt];
      }
  
      void addValue(int columnIndex, Object value){
          values[columnIndex]=value;
      }
  
      public Object getObject(int columnIndex){
          return values[columnIndex];
      }
      
      public Object getObject(String columnName){
          Integer index = columnNameToIdxMap.get(
                  isCaseSensitive?columnName
                  :columnName.toLowerCase());
          if(index!=null) return getObject(index);
          throw new Sql2oException(String.format("Column with name '%s' does not exist", columnName));
      }
  
      public <V> V getObject(int columnIndex, Class<V> clazz){
          try{
              return (V) throwIfNull(clazz, quirks.converterOf(clazz)).convert(getObject(columnIndex));
          } catch (ConverterException ex){
              throw new Sql2oException("Error converting value", ex);
          }
      }
  
      public <V> V getObject(String columnName, Class<V> clazz) {
          try{
              return (V) throwIfNull(clazz, quirks.converterOf(clazz)).convert(getObject(columnName));
          } catch (ConverterException ex){
              throw new Sql2oException("Error converting value", ex);
          }
      }
  
      public BigDecimal getBigDecimal(int columnIndex){
          return this.getObject(columnIndex, BigDecimal.class);
      }
      
      public BigDecimal getBigDecimal(String columnName){
          return this.getObject(columnName, BigDecimal.class);
      }
      
      public Boolean getBoolean(int columnIndex){
          return this.getObject(columnIndex, Boolean.class);
      }
      
      public Boolean getBoolean(String columnName){
          return this.getObject(columnName, Boolean.class);
      }
      
      public Double getDouble(int columnIndex){
          return this.getObject(columnIndex, Double.class);
      }
      
      public Double getDouble(String columnName){
          return this.getObject(columnName, Double.class);
      }
      
      public Float getFloat(int columnIndex){
          return this.getObject(columnIndex, Float.class);
      }
      
      public Float getFloat(String columnName){
          return this.getObject(columnName, Float.class);
      }
      
      public Long getLong(int columnIndex){
          return this.getObject(columnIndex, Long.class);
      }
      
      public Long getLong(String columnName){
          return this.getObject(columnName, Long.class);
      }
      
      public Integer getInteger(int columnIndex){
          return this.getObject(columnIndex, Integer.class);
      }
      
      public Integer getInteger(String columnName){
          return this.getObject(columnName, Integer.class);
      }
      
      public Short getShort(int columnIndex){
          return this.getObject(columnIndex, Short.class);
      }
      
      public Short getShort(String columnName){
          return this.getObject(columnName, Short.class);
      }
      
      public Byte getByte(int columnIndex){
          return this.getObject(columnIndex, Byte.class);
      }
      
      public Byte getByte(String columnName){
          return this.getObject(columnName, Byte.class);
      }
      
      public Date getDate(int columnIndex){
          return this.getObject(columnIndex, Date.class);
      }
      
      public Date getDate(String columnName){
          return this.getObject(columnName, Date.class);
      }
  
      public String getString(int columnIndex){
          return this.getObject(columnIndex, String.class);
      }
      
      public String getString(String columnName){
          return this.getObject(columnName, String.class);
      }
  
      /**
       * View row as a simple map.
       */
      public Map<String, Object> asMap() {
          final var map = new HashMap<String, Object>();
          Set<String> keys = columnNameToIdxMap.keySet();
          for (String key : keys) {
              int index = columnNameToIdxMap.get(key);
              map.put(key, values[index]);
          }
          return map;
      }
  }
  