using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Data.SqlClient;
using System.IO;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Text;
namespace System.Data.Linq.SqlClient {
using System.Data.Linq.Mapping;
using System.Data.Linq.Provider;
using System.Diagnostics.CodeAnalysis;
///
/// Class for building up SQL DDL commands.
///
internal static class SqlBuilder {
internal static string GetCreateDatabaseCommand(string catalog, string dataFilename, string logFilename) {
StringBuilder sb = new StringBuilder();
sb.AppendFormat("CREATE DATABASE {0}", SqlIdentifier.QuoteIdentifier(catalog));
if (dataFilename != null) {
sb.AppendFormat(" ON PRIMARY (NAME='{0}', FILENAME='{1}')", Path.GetFileName(dataFilename), dataFilename);
sb.AppendFormat(" LOG ON (NAME='{0}', FILENAME='{1}')", Path.GetFileName(logFilename), logFilename);
}
return sb.ToString();
}
internal static string GetDropDatabaseCommand(string catalog) {
StringBuilder sb = new StringBuilder();
sb.AppendFormat("DROP DATABASE {0}", SqlIdentifier.QuoteIdentifier(catalog));
return sb.ToString();
}
internal static string GetCreateSchemaForTableCommand(MetaTable table) {
StringBuilder sb = new StringBuilder();
List parts = new List(SqlIdentifier.GetCompoundIdentifierParts(table.TableName));
// table names look like this in Yukon (according to MSDN):
// [ database_name . [ schema_name ] . | schema_name . ] table_name
// ... which means that either way, the schema name is the second to last part.
if ((parts.Count) < 2) {
return null;
}
string schema = parts[parts.Count - 2];
if (String.Compare(schema, "DBO", StringComparison.OrdinalIgnoreCase) != 0 &&
String.Compare(schema, "[DBO]", StringComparison.OrdinalIgnoreCase) != 0) {
sb.AppendFormat("CREATE SCHEMA {0}", SqlIdentifier.QuoteIdentifier(schema));
}
return sb.ToString();
}
internal static string GetCreateTableCommand(MetaTable table) {
StringBuilder sb = new StringBuilder();
StringBuilder decl = new StringBuilder();
BuildFieldDeclarations(table, decl);
sb.AppendFormat("CREATE TABLE {0}", SqlIdentifier.QuoteCompoundIdentifier(table.TableName));
sb.Append("(");
sb.Append(decl.ToString());
decl = new StringBuilder();
BuildPrimaryKey(table, decl);
if (decl.Length > 0) {
string name = String.Format(Globalization.CultureInfo.InvariantCulture, "PK_{0}", table.TableName);
sb.Append(", ");
sb.AppendLine();
sb.AppendFormat(" CONSTRAINT {0} PRIMARY KEY ({1})", SqlIdentifier.QuoteIdentifier(name), decl.ToString());
}
sb.AppendLine();
sb.Append(" )");
return sb.ToString();
}
internal static void BuildFieldDeclarations(MetaTable table, StringBuilder sb) {
int n = 0;
Dictionary