private static PrimitiveVal GetDefaultValue(TypeRef r) { if (r == "Boolean") { return(PrimitiveVal.CreateBooleanValue(false)); } else if (r == "String") { return(PrimitiveVal.CreateStringValue("")); } else if (r == "Int") { return(PrimitiveVal.CreateIntValue(0)); } else if (r == "Real") { return(PrimitiveVal.CreateRealValue(0)); } else if (r == "Binary") { return(PrimitiveVal.CreateBinaryValue(new List <Byte> { })); } else if (r == "Int64") { return(PrimitiveVal.CreateInt64Value(0)); } else { throw new InvalidOperationException(); } }
public static TableVal ExportTable(Dictionary <String, EntityDef> EntityMetas, Dictionary <String, String> EnumUnderlyingTypes, IDbConnection c, IDbTransaction b, String EntityName, DatabaseType Type) { Func <String, String> Escape; if (Type == DatabaseType.SqlServer) { Escape = s => "[" + s + "]"; } else if (Type == DatabaseType.PostgreSQL) { Escape = s => "\"" + s.ToLowerInvariant() + "\""; } else if (Type == DatabaseType.MySQL) { Escape = s => "`" + s + "`"; } else { throw new InvalidOperationException(); } var Meta = EntityMetas[EntityName]; var CollectionName = Meta.CollectionName; var Values = new List <RowVal>(); var Columns = Meta.Fields.Where(f => f.Attribute.OnColumn).ToList(); var ColumnStr = String.Join(", ", Columns.Select(col => Escape(col.Name))); var cmd = c.CreateCommand(); cmd.Transaction = b; cmd.CommandText = String.Format("SELECT {1} FROM {0}", Escape(CollectionName), ColumnStr); cmd.CommandType = CommandType.Text; using (var dr = cmd.ExecuteReader()) { var RowIndex = 0; while (dr.Read()) { var vColumns = new List <ColumnVal>(); foreach (var f in Columns) { ColumnVal cv; String TypeName; Boolean IsOptional; if (f.Type.OnTypeRef) { TypeName = f.Type.TypeRef.Value; IsOptional = false; } else if (f.Type.OnOptional) { TypeName = f.Type.Optional.Value; IsOptional = true; } else { throw new InvalidOperationException(String.Format("InvalidType: {0}.{1}", CollectionName, f.Name)); } if (EnumUnderlyingTypes.ContainsKey(TypeName)) { TypeName = EnumUnderlyingTypes[TypeName]; } try { if (TypeName.Equals("Boolean", StringComparison.OrdinalIgnoreCase)) { var o = dr.GetOrdinal(f.Name); if (IsOptional) { var v = dr.GetValue(o); if (v == DBNull.Value) { cv = ColumnVal.CreateOptional(Optional <PrimitiveVal> .Empty); } else { cv = ColumnVal.CreateOptional(PrimitiveVal.CreateBooleanValue(dr.GetBoolean(o))); } } else { cv = ColumnVal.CreatePrimitive(PrimitiveVal.CreateBooleanValue(dr.GetBoolean(o))); } } else if (TypeName.Equals("String", StringComparison.OrdinalIgnoreCase)) { var o = dr.GetOrdinal(f.Name); var v = dr.GetValue(o); if (IsOptional) { if (v == DBNull.Value) { cv = ColumnVal.CreateOptional(Optional <PrimitiveVal> .Empty); } else { cv = ColumnVal.CreateOptional(PrimitiveVal.CreateStringValue(dr.GetString(o))); } } else { if (v == DBNull.Value) { throw new InvalidOperationException(); } else { cv = ColumnVal.CreatePrimitive(PrimitiveVal.CreateStringValue(dr.GetString(o))); } } } else if (TypeName.Equals("Int", StringComparison.OrdinalIgnoreCase)) { var o = dr.GetOrdinal(f.Name); if (IsOptional) { var v = dr.GetValue(o); if (v == DBNull.Value) { cv = ColumnVal.CreateOptional(Optional <PrimitiveVal> .Empty); } else { cv = ColumnVal.CreateOptional(PrimitiveVal.CreateIntValue(dr.GetInt32(o))); } } else { cv = ColumnVal.CreatePrimitive(PrimitiveVal.CreateIntValue(dr.GetInt32(o))); } } else if (TypeName.Equals("Int64", StringComparison.OrdinalIgnoreCase)) { var o = dr.GetOrdinal(f.Name); if (IsOptional) { var v = dr.GetValue(o); if (v == DBNull.Value) { cv = ColumnVal.CreateOptional(Optional <PrimitiveVal> .Empty); } else { cv = ColumnVal.CreateOptional(PrimitiveVal.CreateInt64Value(dr.GetInt64(o))); } } else { cv = ColumnVal.CreatePrimitive(PrimitiveVal.CreateInt64Value(dr.GetInt64(o))); } } else if (TypeName.Equals("Real", StringComparison.OrdinalIgnoreCase)) { var o = dr.GetOrdinal(f.Name); if (IsOptional) { var v = dr.GetValue(o); if (v == DBNull.Value) { cv = ColumnVal.CreateOptional(Optional <PrimitiveVal> .Empty); } else { cv = ColumnVal.CreateOptional(PrimitiveVal.CreateRealValue(dr.GetFloat(o))); } } else { cv = ColumnVal.CreatePrimitive(PrimitiveVal.CreateRealValue(dr.GetFloat(o))); } } else if (TypeName.Equals("Binary", StringComparison.OrdinalIgnoreCase)) { var o = dr.GetOrdinal(f.Name); var v = dr.GetValue(o); if (IsOptional) { if (v == DBNull.Value) { cv = ColumnVal.CreateOptional(Optional <PrimitiveVal> .Empty); } else { cv = ColumnVal.CreateOptional(PrimitiveVal.CreateBinaryValue(new List <Byte>((Byte[])(v)))); } } else { if (v == DBNull.Value) { throw new InvalidOperationException(); } else { cv = ColumnVal.CreatePrimitive(PrimitiveVal.CreateBinaryValue(new List <Byte>((Byte[])(v)))); } } } else { throw new InvalidOperationException(String.Format("InvalidType: {0}.{1}", CollectionName, f.Name)); } } catch (Exception e) { throw new InvalidOperationException(String.Format("InvalidValue: {0}[{2}].{1}", CollectionName, f.Name, RowIndex), e); } vColumns.Add(cv); } Values.Add(new RowVal { Columns = vColumns }); RowIndex += 1; } } return(new TableVal { Rows = Values }); }