static void AddParameters(NpgsqlCommand cmd, PostgresRow row)
 {
     foreach (var column in row.Columns)
     {
         var type = row.ColumnType(column);
         var obj  = row.GetReference <object> (column);
         if (obj != null && type == NpgsqlTypes.NpgsqlDbType.Unknown && obj.GetType() == typeof(string[]))
         {
             type = NpgsqlTypes.NpgsqlDbType.Array | NpgsqlTypes.NpgsqlDbType.Varchar;
         }
         var param = cmd.Parameters.Add(column, type);
         if (obj == null)
         {
             param.Value = DBNull.Value;
         }
         else if (type == NpgsqlTypes.NpgsqlDbType.Jsonb)
         {
             param.Value = JsonConvert.SerializeObject(obj);
         }
         else
         {
             param.Value = obj;
         }
     }
 }
        static IEnumerable <PostgresRow> Select(NpgsqlConnection conn, string queryString, IEnumerable <string> columnsEnumerable, PostgresRow whereValues)
        {
            var columns = columnsEnumerable.ToArray();

            using (var cmd = CreateCommand(conn)) {
                cmd.CommandText = queryString;
                if (whereValues != null)
                {
                    AddParameters(cmd, whereValues);
                }

                var rows = new List <PostgresRow> ();
                using (var reader = cmd.ExecuteReader()) {
                    while (reader.Read())
                    {
                        var row = new PostgresRow();
                        for (var i = 0; i < columns.Length; ++i)
                        {
                            var value = reader.GetValue(i);
                            if (value.GetType() == typeof(DateTime))
                            {
                                value = (object)TimeZoneInfo.ConvertTimeToUtc((DateTime)value);
                            }
                            row.Set(columns [i], NpgsqlTypes.NpgsqlDbType.Unknown, value);
                        }
                        rows.Add(row);
                    }
                }
                return(rows);
            }
        }
 public void TakeValuesFrom(PostgresRow row, string prefix)
 {
     foreach (var key in row.values.Keys)
     {
         if (key.StartsWith(prefix))
         {
             var value = row.values [key];
             values.Add(key.Substring(prefix.Length), value);
         }
     }
 }
        public static void Update(NpgsqlConnection conn, string table, PostgresRow row, string keyColumn)
        {
            var columns       = row.Columns;
            var commandString = string.Format("update {0} set {1} where {2} = :{2}",
                                              table,
                                              string.Join(",", columns.Select(c => c + "=:" + c)),
                                              keyColumn);

            using (var cmd = CreateCommand(conn)) {
                cmd.CommandText = commandString;
                AddParameters(cmd, row);
                var numRows = cmd.ExecuteNonQuery();
                if (numRows != 1)
                {
                    throw new Exception("Error: Could not update row in " + table);
                }
            }
        }
        public static T Insert <T> (NpgsqlConnection conn, string table, PostgresRow row, string keyColumn)
        {
            var columns       = row.Columns;
            var commandString = string.Format("insert into {0} ({1}) values ({2}) returning {3}",
                                              table,
                                              string.Join(",", columns),
                                              string.Join(",", columns.Select(c => ":" + c)),
                                              keyColumn);

            using (var cmd = CreateCommand(conn)) {
                cmd.CommandText = commandString;
                AddParameters(cmd, row);

                using (var reader = cmd.ExecuteReader()) {
                    if (!reader.Read())
                    {
                        throw new Exception("Error: Failure inserting into " + table);
                    }

                    return(reader.GetFieldValue <T> (0));
                }
            }
        }
        public static IEnumerable <PostgresRow> Select(NpgsqlConnection conn, IDictionary <string, string> tableNames, IEnumerable <string> columnsEnumerable, string whereClause, PostgresRow whereValues)
        {
            var tables      = string.Join(",", tableNames.Select(kvp => kvp.Value == null ? kvp.Key : kvp.Key + " " + kvp.Value));
            var columns     = columnsEnumerable.ToArray();
            var whereString = whereClause == null ? "" : string.Format("where {0}", whereClause);
            var queryString = string.Format("select {0} from {1} {2}", string.Join(",", columns), tables, whereString);

            return(Select(conn, queryString, columns, whereValues));
        }
        public static int Delete(NpgsqlConnection conn, string table, string whereClause, PostgresRow row)
        {
            var columns       = row.Columns;
            var commandString = string.Format("delete from {0} where {1}", table, whereClause);

            using (var cmd = CreateCommand(conn)) {
                cmd.CommandText = commandString;
                AddParameters(cmd, row);
                return(cmd.ExecuteNonQuery());
            }
        }
 public static IEnumerable <PostgresRow> Select(NpgsqlConnection conn, string table, IEnumerable <string> columnsEnumerable, string whereClause = null, PostgresRow whereValues = null)
 {
     return(Select(conn, new Dictionary <string, string> {
         [table] = null
     }, columnsEnumerable, whereClause, whereValues));
 }