You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Connected.Framework/Connected.Data/Schema/Sql/SpHelp.cs

144 lines
3.6 KiB

using System.Data;
2 years ago
using Connected.Entities.Storage;
using Connected.Interop;
namespace Connected.Data.Schema.Sql;
internal class SpHelp : SynchronizationQuery<ObjectDescriptor>
{
private readonly ObjectDescriptor _descriptor;
public SpHelp()
{
_descriptor = new();
}
private ObjectDescriptor Result => _descriptor;
protected override async Task<ObjectDescriptor> OnExecute()
{
var operation = new StorageOperation { CommandText = "sp_help", CommandType = CommandType.Text };
operation.AddParameter(new StorageParameter
{
Name = "@objname",
Type = DbType.String,
Value = Escape(Context.Schema.SchemaName(), Context.Schema.Name)
}
);
var rdr = await Context.OpenReader(operation);
try
{
ReadMetadata(rdr);
ReadColumns(rdr);
ReadIdentity(rdr);
ReadRowGuid(rdr);
ReadFileGroup(rdr);
ReadIndexes(rdr);
ReadConstraints(rdr);
}
finally
{
rdr.Close();
}
return Result;
}
private void ReadMetadata(IDataReader rdr)
{
if (rdr.Read())
{
Result.MetaData.Name = rdr.GetValue("Name", string.Empty);
Result.MetaData.Owner = rdr.GetValue("Owner", string.Empty);
Result.MetaData.Type = rdr.GetValue("Object_type", string.Empty);
}
}
private void ReadColumns(IDataReader rdr)
{
rdr.NextResult();
while (rdr.Read())
{
Result.Columns.Add(new ObjectColumn
{
Collation = rdr.GetValue("Collation", string.Empty),
Computed = !string.Equals(rdr.GetValue("Computed", string.Empty), "no", StringComparison.OrdinalIgnoreCase),
FixedLenInSource = rdr.GetValue("FixedLenNullInSource", string.Empty),
Length = rdr.GetValue("Length", 0),
Name = rdr.GetValue("Column_name", string.Empty),
Nullable = !string.Equals(rdr.GetValue("Nullable", string.Empty), "no", StringComparison.OrdinalIgnoreCase),
Precision = TypeConversion.Convert<int>(rdr.GetValue("Prec", string.Empty).Trim()),
Scale = TypeConversion.Convert<int>(rdr.GetValue("Scale", string.Empty).Trim()),
TrimTrailingBlanks = rdr.GetValue("TrimTrailingBlanks", string.Empty),
Type = rdr.GetValue("Type", string.Empty)
});
}
}
private void ReadIdentity(IDataReader rdr)
{
rdr.NextResult();
if (rdr.Read())
{
Result.Identity.Identity = rdr.GetValue("Identity", string.Empty);
Result.Identity.Increment = rdr.GetValue("Increment", 0);
Result.Identity.NotForReplication = rdr.GetValue("Not For Replication", 0) != 0;
}
}
private void ReadRowGuid(IDataReader rdr)
{
rdr.NextResult();
if (rdr.Read())
Result.RowGuid.RowGuidCol = rdr.GetValue("RowGuidCol", string.Empty);
}
private void ReadFileGroup(IDataReader rdr)
{
rdr.NextResult();
if (rdr.Read())
Result.FileGroup.FileGroup = rdr.GetValue("Data_located_on_filegroup", string.Empty);
}
private void ReadIndexes(IDataReader rdr)
{
rdr.NextResult();
while (rdr.Read())
{
Result.Indexes.Add(new ObjectIndex
{
Description = rdr.GetValue("index_description", string.Empty),
Keys = rdr.GetValue("index_keys", string.Empty),
Name = rdr.GetValue("index_name", string.Empty)
});
}
}
private void ReadConstraints(IDataReader rdr)
{
rdr.NextResult();
while (rdr.Read())
{
Result.Constraints.Add(new ObjectConstraint
{
DeleteAction = rdr.GetValue("delete_action", string.Empty),
Keys = rdr.GetValue("constraint_keys", string.Empty),
Name = rdr.GetValue("constraint_name", string.Empty),
StatusEnabled = rdr.GetValue("status_enabled", string.Empty),
StatusForReplication = rdr.GetValue("status_for_replication", string.Empty),
Type = rdr.GetValue("constraint_type", string.Empty),
UpdateAction = rdr.GetValue("update_action", string.Empty)
});
}
}
2 years ago
}