private static void ProcessDeleteEntries(string args) { Regex deleteRegex = new Regex(@"^(?<table>(?:(?:\[(?:\S| )+\])|\S|\.)+)(?: (?<defaultDeleteAction>" + string.Join("|", SUPPORTED_DELETE_ACTIONS) + @"))?(?: (?:-d (?<d>(?: ?(?<foreignKey>(?:(?:\[(?:\S| )+\])|\S|\.)+)\=(?<deleteAction>" + string.Join("|", SUPPORTED_DELETE_ACTIONS) + @"))+)))?(?: (?:-c (?<c>.+)))?$"); Match deleteMatch = deleteRegex.Match(args); DatabaseObject deleteTable; if (!deleteMatch.Success) { Console.WriteLine($"Error: Invalid syntax for command {DELETE_ENTRIES_COMMAND}, syntax information can be showed by typing: help {DELETE_ENTRIES_COMMAND}"); return; } else if (!_tableByName.TryGetValue(deleteMatch.Groups["table"].Value.Replace("[", "").Replace("]", "").ToLower(), out deleteTable)) { Console.WriteLine($"Error: Table {deleteMatch.Groups["table"].Value} not found"); return; } string conditions = ""; ForeignKey.DeleteActions?defaultDeleteAction = null; if (deleteMatch.Groups["c"].Success) { conditions = deleteMatch.Groups["c"].Value; } if (deleteMatch.Groups["defaultDeleteAction"].Success) { if (DELETE_ACTION_CONVERTOR.ContainsKey(deleteMatch.Groups["defaultDeleteAction"].Value.ToUpper())) { defaultDeleteAction = DELETE_ACTION_CONVERTOR[deleteMatch.Groups["defaultDeleteAction"].Value.ToUpper()]; } else { Console.WriteLine($"Error: Unsupported default delete action, {SUPPORTED_DELETE_ACTION_VALUES_TEXT}"); return; } } IDictionary <string, ForeignKey.DeleteActions> overrideDeleteActions = new Dictionary <string, ForeignKey.DeleteActions>(); if (deleteMatch.Groups["foreignKey"].Success) { for (int i = 0; i < deleteMatch.Groups["foreignKey"].Captures.Count; i++) { ForeignKey.DeleteActions deleteAction; if (DELETE_ACTION_CONVERTOR.TryGetValue(deleteMatch.Groups["deleteAction"].Captures[i].Value.ToUpper(), out deleteAction)) { overrideDeleteActions.Add(deleteMatch.Groups["foreignKey"].Captures[i].Value.ToLower(), deleteAction); } else { Console.WriteLine($"Error: Unsupported default delete action {deleteMatch.Groups["defaultDeleteAction"].Value} at foreign key {deleteMatch.Groups["foreignKey"].Captures[i].Value}, {SUPPORTED_DELETE_ACTION_VALUES_TEXT}"); return; } } } ISet <DependencyEdge> edges = _dependencies.GetDescendantEdges(deleteTable); IDictionary <ForeignKey, ForeignKey.DeleteActions> foreignKeyDeleteActions = new Dictionary <ForeignKey, ForeignKey.DeleteActions>(edges.Count); foreach (DependencyEdge edge in edges) { ForeignKey.DeleteActions?overrideDeleteAction; if (overrideDeleteActions.ContainsKey(edge.ForeignKey.Name.ToLower())) { overrideDeleteAction = overrideDeleteActions[edge.ForeignKey.Name.ToLower()]; } else { overrideDeleteAction = defaultDeleteAction; } if (overrideDeleteAction == null) { foreignKeyDeleteActions.Add(edge.ForeignKey, edge.ForeignKey.DeleteAction); } else if (overrideDeleteAction.Value == ForeignKey.DeleteActions.SetDefault && edge.ForeignKey.HasDefaultValue) { foreignKeyDeleteActions.Add(edge.ForeignKey, ForeignKey.DeleteActions.SetDefault); } else if (overrideDeleteAction.Value == ForeignKey.DeleteActions.SetNull && edge.ForeignKey.CanBeNull) { foreignKeyDeleteActions.Add(edge.ForeignKey, ForeignKey.DeleteActions.SetNull); } else { foreignKeyDeleteActions.Add(edge.ForeignKey, overrideDeleteAction.Value); } } try { Console.WriteLine("Delete procedure is running"); string deleteQuery = _optimizer.DeleteEntriesFromTable(deleteTable, conditions, foreignKeyDeleteActions); Console.WriteLine(deleteQuery); Database.Instance.ExecuteNonResultQuery(deleteQuery); Console.WriteLine("Delete procedure was completed"); } catch (DatabaseException exc) { Debug.WriteLine(exc); Console.WriteLine($"Error: cannot get data - {exc.InnerException.Message}"); return; } catch (DeleteDependencyException exc) { Debug.WriteLine(exc); Console.WriteLine($"Error: cannot get data - {exc.Message}"); return; } catch (SqlException exc) { Debug.WriteLine(exc); Console.WriteLine("Error: delete query failed"); return; } }