using CYQ.Data.Table; using System; using System.Collections.Generic; using System.Data; using System.Data.Common; using System.IO; using System.Text; namespace CYQ.Data { internal sealed class NoSqlConnection : DbConnection { public NoSqlConnection(string conn) { _Conn = conn; } protected override DbCommand CreateDbCommand() { return null; } protected override DbTransaction BeginDbTransaction(IsolationLevel isolationLevel) { return null; } public override void ChangeDatabase(string databaseName) { // } public override void Close() { //重新写回数据。 } private string _Conn; public override string ConnectionString { get { return _Conn; } set { _Conn = value; } } private string filePath; public override string DataSource { get { if (string.IsNullOrEmpty(filePath)) { filePath = GetFilePath(_Conn); } return filePath; } } private string folderName; public override string Database { get { if (string.IsNullOrEmpty(folderName)) { folderName = DataSource.Replace("/", "\\").TrimEnd('\\'); folderName = folderName.Substring(folderName.LastIndexOf('\\') + 1); } return folderName; } } public override void Open() { if (!Directory.Exists(DataSource)) { Error.Throw("Error for this directory:" + DataSource); } } public override string ServerVersion { get { return "CYQ.Data.NoSql"; } } public override ConnectionState State { get { return ConnectionState.Closed; } } public override DataTable GetSchema(string collectionName, string[] restrictionValues) { DataTable dt = new DataTable(collectionName); dt.Columns.Add("TABLE_NAME"); switch (collectionName.ToLower()) { case "tables": string[] tsList = Directory.GetFiles(DataSource, "*.ts", SearchOption.TopDirectoryOnly); if (tsList != null && tsList.Length > 0) { string dalType = ".txt"; if (restrictionValues != null && restrictionValues.Length > 0) { if (restrictionValues[0] != null && Convert.ToString(restrictionValues[0]).ToLower() == "xml") { dalType = ".xml"; } } DataRow row = null; string tName = string.Empty; foreach (string tsName in tsList) { tName = Path.GetFileNameWithoutExtension(tsName);//获得表名。 string[] tableList = Directory.GetFiles(DataSource, tName + ".*", SearchOption.TopDirectoryOnly); foreach (string tableName in tableList) { if (tableName.EndsWith(dalType)) { continue; } row = dt.NewRow(); row[0] = tableName.EndsWith(".ts") ? Path.GetFileNameWithoutExtension(tableName) : Path.GetFileName(tableName); dt.Rows.Add(row); } } } break; case "columns": dt.Columns.Add("COLUMN_NAME"); dt.Columns.Add("COLUMN_LCID", typeof(int)); dt.Columns.Add("DATA_TYPE", typeof(int)); dt.Columns.Add("TABLE_MaxSize", typeof(int)); dt.Columns.Add("COLUMN_ISREADONLY", typeof(bool)); dt.Columns.Add("TABLE_ISCANNULL", typeof(bool)); dt.Columns.Add("COLUMN_DEFAULT"); tsList = Directory.GetFiles(DataSource, "*.ts"); if (tsList != null && tsList.Length > 0) { DataRow row = null; string tName = string.Empty; foreach (string tsName in tsList) { MDataColumn mdc = MDataColumn.CreateFrom(tsName); if (mdc.Count > 0) { tName = Path.GetFileNameWithoutExtension(tsName); MCellStruct cs = null; for (int i = 0; i < mdc.Count; i++) { cs = mdc[i]; row = dt.NewRow(); row[0] = tName; row[1] = cs.ColumnName; row[2] = i; row[3] = (int)cs.SqlType; row[4] = cs.MaxSize; row[5] = cs.IsAutoIncrement; row[6] = cs.IsCanNull; row[7] = Convert.ToString(cs.DefaultValue); dt.Rows.Add(row); } } } } break; } return dt; } internal static string GetFilePath(string conn) { if (conn.IndexOf("{0}") > -1) { conn = string.Format(conn, AppConfig.WebRootPath);//链接相关的用WebRootPath,支持ASPNETCore } int start = conn.IndexOf('=') + 1;//1=2;3 -- 1 int end = conn.IndexOf(";");//3 string filePath = conn.Substring(start, end > 0 ? end - start : conn.Length - start); if (!Directory.Exists(filePath)) { Directory.CreateDirectory(filePath);// } if (!filePath.EndsWith("\\")) { filePath = filePath.TrimEnd('/') + "\\"; } return filePath; } } }