mirror of
https://github.com/ckaczor/sqltoolsservice.git
synced 2026-01-18 17:23:52 -05:00
Adding decoding of multipart identifiers, default schema workaround (#295)
This change adds a couple things _Multipart Identifier Decoding_ The ability to decode a multipart identifier (with or without escaping) has been added to the SqlScriptFormatter utility class. This code is utilized to split a table name provided to the edit/initialize request into schema and table name. _Default Schema Workaround_ The code that retrieves the SMO metadata objects originally used the `[]` operator to access the objects. Due to a bug(?) in SMO, this results in problems when loading tables without a default schema (in our case if you're logged in as SA). Using the metadata object constructors gets around this issue, we are explicitly using them. * Adding decoding of multipart identifiers Adding code fix for default schema issue * Adding some more localizable strings for errors when loading metadata * Adding localization files... again? * Changes as per pull request comments
This commit is contained in:
@@ -11,6 +11,7 @@ using Microsoft.SqlServer.Management.Common;
|
||||
using Microsoft.SqlServer.Management.Smo;
|
||||
using Microsoft.SqlTools.ServiceLayer.Connection.ReliableConnection;
|
||||
using Microsoft.SqlTools.ServiceLayer.Utility;
|
||||
using Microsoft.SqlTools.Utility;
|
||||
|
||||
namespace Microsoft.SqlTools.ServiceLayer.EditData
|
||||
{
|
||||
@@ -23,11 +24,21 @@ namespace Microsoft.SqlTools.ServiceLayer.EditData
|
||||
/// Generates a edit-ready metadata object using SMO
|
||||
/// </summary>
|
||||
/// <param name="connection">Connection to use for getting metadata</param>
|
||||
/// <param name="objectName">Name of the object to return metadata for</param>
|
||||
/// <param name="objectNamedParts">Split and unwrapped name parts</param>
|
||||
/// <param name="objectType">Type of the object to return metadata for</param>
|
||||
/// <returns>Metadata about the object requested</returns>
|
||||
public EditTableMetadata GetObjectMetadata(DbConnection connection, string objectName, string objectType)
|
||||
public EditTableMetadata GetObjectMetadata(DbConnection connection, string[] objectNamedParts, string objectType)
|
||||
{
|
||||
Validate.IsNotNull(nameof(objectNamedParts), objectNamedParts);
|
||||
if (objectNamedParts.Length <= 0)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(objectNamedParts), SR.EditDataMetadataObjectNameRequired);
|
||||
}
|
||||
if (objectNamedParts.Length > 2)
|
||||
{
|
||||
throw new InvalidOperationException(SR.EditDataMetadataTooManyIdentifiers);
|
||||
}
|
||||
|
||||
// Get a connection to the database for SMO purposes
|
||||
SqlConnection sqlConn = connection as SqlConnection;
|
||||
if (sqlConn == null)
|
||||
@@ -46,22 +57,23 @@ namespace Microsoft.SqlTools.ServiceLayer.EditData
|
||||
|
||||
// Connect with SMO and get the metadata for the table
|
||||
Server server = new Server(new ServerConnection(sqlConn));
|
||||
Database db = new Database(server, sqlConn.Database);
|
||||
TableViewTableTypeBase smoResult;
|
||||
switch (objectType.ToLowerInvariant())
|
||||
{
|
||||
case "table":
|
||||
smoResult = server.Databases[sqlConn.Database].Tables[objectName];
|
||||
smoResult = objectNamedParts.Length == 1
|
||||
? new Table(db, objectNamedParts[0]) // No schema provided
|
||||
: new Table(db, objectNamedParts[1], objectNamedParts[0]); // Schema provided
|
||||
break;
|
||||
case "view":
|
||||
smoResult = server.Databases[sqlConn.Database].Views[objectName];
|
||||
smoResult = objectNamedParts.Length == 1
|
||||
? new View(db, objectNamedParts[0]) // No schema provided
|
||||
: new View(db, objectNamedParts[1], objectNamedParts[0]); // Schema provided
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException(nameof(objectType), SR.EditDataUnsupportedObjectType(objectType));
|
||||
}
|
||||
if (smoResult == null)
|
||||
{
|
||||
throw new ArgumentOutOfRangeException(nameof(objectName), SR.EditDataObjectMetadataNotFound);
|
||||
}
|
||||
|
||||
// Generate the edit column metadata
|
||||
List<EditColumnMetadata> editColumns = new List<EditColumnMetadata>();
|
||||
|
||||
Reference in New Issue
Block a user