📄 fastdbconnection.cs
字号:
/// <param name="FieldName">Name of the field</param> /// <param name="NewFlags">New index types.</param> public void AlterIndex(string TableName, string FieldName, CLI.FieldFlags NewFlags) { CLI.CliCheck(CLI.cli_alter_index(session, TableName, FieldName, NewFlags)); } /// <summary> /// Create a new SQL command in this connection. <seealso cref="CLI.FastDbCommand"/> /// </summary> /// <param name="sql">SQL text representing a command</param> /// <returns>FastDbCommand object to be used for executing the SQL command</returns> public FastDbCommand CreateCommand(string sql) { lock(typeof(FastDbConnection)) { int n = commands.Add(new FastDbCommand(this, sql)); return (FastDbCommand)commands[n]; } } internal void RemoveCommand(FastDbCommand command) { lock(typeof(FastDbConnection)) { commands.Remove(command); } } /// <summary> /// Attach current thread to the database. Each thread except one opened the database /// should first attach to the database before any access to the database, /// and detach after end of the work with database. /// </summary> public void Attach() { CLI.CliCheck(CLI.cli_attach(session)); } public void Detach() { Detach(CLI.CliDetachMode.cli_commit_on_detach | CLI.CliDetachMode.cli_destroy_context_on_detach); } /// <summary> /// Detach current thread from the database. Each thread except one opened the database /// should perform attach to the database before any access to the database, /// and detach after end of the work with database /// <seealso cref="CLI.CliDetachMode"/> /// </summary> /// <param name="mode">Optional parameter indicating the detach action.</param> public void Detach(CLI.CliDetachMode mode) { CLI.CliCheck(CLI.cli_detach(session, mode)); } /// <summary> /// Extract a DDL of a table /// </summary> /// <param name="TableName">Name of a table</param> /// <returns>A string representing the table's DDL.</returns> public string ExtractTableDDL(string TableName) { FastDbFields flds = DescribeTable(TableName); StringBuilder result = new StringBuilder("create table "+TableName+" (\n"); int nLen = 0; for(int i=0; i<flds.Count; i++) nLen = (nLen > flds[i].Name.Length) ? nLen : flds[i].Name.Length; for(int i=0; i<flds.Count; i++) { result.AppendFormat("\t{0} {1}{2}", flds[i].Name.PadRight(nLen, ' '), CLI.CliTypeToStr(flds[i].Type, true), (flds[i].RefTable == null) ? "" : " to "+flds[i].RefTable); result.Append((i==(flds.Count-1)) ? "" : ",\n"); } result.Append(");\n"); string IDX_STR = "create {0} on {1}.{2};\n"; for(int i=0; i<flds.Count; i++) { if (Enum.IsDefined(flds[i].Flags.GetType(), CLI.FieldFlags.cli_hashed)) result.AppendFormat(IDX_STR, "hash", TableName, flds[i].Name); if (Enum.IsDefined(flds[i].Flags.GetType(), CLI.FieldFlags.cli_indexed)) result.AppendFormat(IDX_STR, "index", TableName, flds[i].Name); } return result.ToString(); } /// <summary> /// Extracts the metadata of the entire FastDB database, and stores it to a file /// </summary> /// <param name="FileName">FileName where the DDL is to be saved.</param> public void SaveDDLtoFile(string FileName) { System.IO.StreamWriter writer = System.IO.File.CreateText(FileName); try { string[] tables = ListTables(); writer.WriteLine("open '{0}';", dbName); foreach (string table in tables) writer.Write(ExtractTableDDL(table)); writer.WriteLine("commit;"); writer.WriteLine("exit;"); } finally { writer.Close(); } } /// <summary> /// This method implements IDisposable. It takes this object off /// the Finalization queue to prevent finalization code for this /// object from executing a second time. /// </summary> public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } /// <summary> /// This method executes by a user's call, or by the runtime. /// </summary> /// <param name="disposing">If disposing equals true, the method has been called directly /// or indirectly by a user's code. Managed and unmanaged resources /// can be disposed. If disposing equals false, the method has been called by the /// runtime from inside the finalizer and you should not reference /// other objects. Only unmanaged resources can be disposed.</param> protected virtual void Dispose(bool disposing) { if(this.session != -1) { // Check to see if Dispose has already been called. if(disposing) {} // Dispose managed resources here. Close(); // Release unmanaged resources. } } protected void CheckConnection(bool IsConnected) { if ((IsConnected) ? session == -1 : session != -1) throw new CliError("The session is " + ((IsConnected) ? "connected" : "not connected")); } private static void SessionErrorHandler(int error, [MarshalAs(UnmanagedType.LPStr)] string msg, int msgarg, IntPtr UserData) { //Debug.Assert(UserData != IntPtr.Zero, "UserData must be assigned FastDbSession value!"); //int handle; Marshal.Copy(UserData, handle, 0, 1); // This procedure must raise an error to unwind the stack throw new CliError(error-100, msg+String.Format(" ({0})", msgarg)); } private unsafe string[] ListTables(string TableName, ref bool tableExists) { IntPtr p = new IntPtr(0); int rc = CLI.CliCheck(CLI.cli_show_tables(session, ref p)); ArrayList tables = new ArrayList(rc); if (rc > 0) { try { CLI.CliTableDescriptor* table = (CLI.CliTableDescriptor*)p.ToPointer(); tableExists = false; for(int i=0; i < rc; i++, table++) { string s = Marshal.PtrToStringAnsi(table->name); if (String.Compare(s, TableName, true) == 0) tableExists = true; tables.Add(s); } } finally { CLI.cli_free_memory(session, p.ToPointer()); } } return (string[])tables.ToArray(typeof(string)); } private void Open(bool isLocal, string Host, int Port) { CheckConnection(false); if (!isLocal) session = CLI.cli_open(String.Format("{0}:{1}", Host, Port), maxConnectRetries, reconnectTimeout); else session = (int)CLI.ErrorCode.cli_bad_address; if (session != (int)CLI.ErrorCode.cli_bad_address) throw new CliError(session, "cli_open failed"); else { if (enableReplication) session = CLI.CliCheck(CLI.cli_create_replication_node( nodeID, nodeNames.Length, nodeNames, dbName, dbPath, (int)openAttributes, initDbSize, extQuantum, initIdxSize, fileSizeLimit), "cli_create_replication_node failed"); else session = CLI.CliCheck(CLI.cli_create(dbName, dbPath, transCommitDelay, (int)openAttributes, initDbSize, extQuantum, initIdxSize, fileSizeLimit), "cli_create failed"); } sessionThreadID = System.Threading.Thread.CurrentThread.GetHashCode(); IntPtr dummy = IntPtr.Zero; CLI.cli_set_error_handler(session, new CLI.CliErrorHandler(SessionErrorHandler), dummy); } private string dbName; private string dbPath; private int session = -1; private int initDbSize = DefaultInitDatabaseSize; private int initIdxSize = DefaultInitIndexSize; private int extQuantum = DefaultExtensionQuantum; private int fileSizeLimit = 0; private uint transCommitDelay = 0; private CLI.CliOpenAttribute openAttributes = CLI.CliOpenAttribute.oaReadWrite; private int sessionThreadID = -1; private int maxConnectRetries = 0; private int reconnectTimeout = DefReconnectTimeoutSec; private bool enableReplication = false; private int nodeID = 0; private string[] nodeNames = new string[] {}; private bool threaded = false; private ArrayList commands = new ArrayList(); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -