public ApiResponse AddUpdateConnection([FromRoute] string endpoint, [FromQuery] string projectName, [FromQuery] string dbSourceName, [FromBody] Newtonsoft.Json.Linq.JObject json ) { try { bool isMetadata = (bool)json["isMetadata"].ToObject(typeof(bool)); string dataSource = json["dataSource"].ToString(); string catalog = json["catalog"].ToString(); string username = json["username"].ToString(); string password = json["password"].ToString(); int? port = json["port"].ToObject(typeof(int?)) as int?; bool integratedSecurity = json["authType"].ToString() == "100"; if (integratedSecurity) { username = password = null; } if (!port.HasValue) { port = 1433; } if (!ControllerHelper.GetProjectAndApp(projectName, dbSourceName, out var proj, out var dbSource, out var resp)) { return(resp); } if (!dbSource.GetEndpoint(endpoint, out var ep, out var resp2)) { return(ApiResponse.ExclamationModal(resp2.userErrorVal)); } CommonReturnValueWithApplication ret = null; if (isMetadata) { ret = ep.UpdateMetadataConnection(dataSource, catalog, username, password, port.Value); } else { ret = ep.UpdateExecConnection(dataSource, catalog, username, password, port.Value); } if (!ret.IsSuccess) { return(ApiResponse.ExclamationModal(ret.userErrorVal)); } WorkSpawner.RestartWorker(ep); SettingsInstance.SaveSettingsToFile(); return(ApiResponse.Success()); } catch (Exception ex) { return(ApiResponse.Exception(ex)); } }
public ApiResponse StartWorker([FromRoute] string id) { try { var worker = WorkSpawner.GetWorkerById(id); if (worker != null) { if (!WorkSpawner.RestartWorker(worker)) { return(ApiResponse.ExclamationModal("Timeout reached while waiting for running worker to restart.")); } return(ApiResponse.Success()); } else { return(ApiResponse.ExclamationModal($"Failed to find specified worker: {id}")); } } catch (Exception e) { return(ApiResponse.Exception(e)); } }
public ApiResponse CreateRule([FromQuery] string project, [FromQuery(Name = "app")] string appName, [FromQuery] string file, [FromBody] Newtonsoft.Json.Linq.JObject json) { try { if (!ControllerHelper.GetProjectAndApp(project, appName, out var proj, out var app, out var resp)) { return(resp); } var type = (RuleType)int.Parse(json["Type"].ToString()); string value = json["Value"].ToString(); if (file == null) { // DB-level var ret = app.AddRule(type, value); if (ret.IsSuccess) { SettingsInstance.SaveSettingsToFile(); WorkSpawner.SetRulesDirty(app); return(ApiResponse.Success()); } else { return(ApiResponse.ExclamationModal(ret.userErrorVal)); } } else { var jsFile = app.GetJsFile(file); if (jsFile == null) { return(ApiResponse.ExclamationModal("The specified output file was not found.")); } var ret = jsFile.AddRule(type, value); if (ret.IsSuccess) { SettingsInstance.SaveSettingsToFile(); WorkSpawner.SetRulesDirty(app, jsFile); return(ApiResponse.Success()); } else { return(ApiResponse.ExclamationModal(ret.userErrorVal)); } } } catch (Exception ex) { return(ApiResponse.Exception(ex)); } }
public ApiResponse DeleteEndpoint([FromRoute] string name, [FromQuery] string project, [FromQuery] string dbSourceName) { try { if (!ControllerHelper.GetProjectAndApp(project, dbSourceName, out var proj, out var app, out var resp)) { return(resp); } if (!app.GetEndpoint(name, out var endpoint, out var resp2)) { return(ApiResponse.ExclamationModal($"The endpoint '{name}' not found.")); } var ret = app.DeleteEndpoint(name); if (ret.IsSuccess) { WorkSpawner.RemoveEndpoint(endpoint); SettingsInstance.SaveSettingsToFile(); return(ApiResponse.Success()); } else { return(ApiResponse.ExclamationModal(ret.userErrorVal)); } } catch (Exception e) { return(ApiResponse.Exception(e)); } }
public ApiResponse Post([FromRoute] string name, [FromQuery] string project, [FromQuery] string dbSourceName) { try { if (!ControllerHelper.GetProjectAndApp(project, dbSourceName, out var proj, out var app, out var resp)) { return(resp); } var ret = app.AddEndpoint(name); if (ret.IsSuccess) { app.GetEndpoint(name, out var endpoint, out var _); WorkSpawner.CreateNewWorker(endpoint); SettingsInstance.SaveSettingsToFile(); return(ApiResponse.Success()); } else { return(ApiResponse.ExclamationModal(ret.userErrorVal)); } } catch (Exception e) { return(ApiResponse.Exception(e)); } }
public bool ClearCache() { try { var cachePath = "./cache"; if (!Directory.Exists(cachePath)) { return(true); } var cacheFilePath = Path.Combine(cachePath, this.CacheFilename); if (!File.Exists(cacheFilePath)) { return(true); } this.CachedRoutineList.Clear(); File.Delete(cacheFilePath); WorkSpawner.ResetMaxRowDate(this); this.LastUpdateDate = DateTime.Now; return(true); } catch (Exception ex) { SessionLog.Exception(ex); return(false); } }
static void OnDrop(object s, DragEventArgs e) { DependencyObject sender = (DependencyObject)s; DirectoryInfoEx currentDir = locateCurrentDirectory(sender, e); if (currentDir == null) { return; } if (e.Data.GetDataPresent(DataFormats.FileDrop)) { (sender as FrameworkElement).Cursor = Cursors.Wait; bool refreshFolder = false; try { string[] addList = e.Data.GetDataPresent(DataObjectEx.DataFormats_EntryString) ? (string[])e.Data.GetData(DataObjectEx.DataFormats_EntryString) : (string[])e.Data.GetData(DataFormats.FileDrop); //0.2: Fixed DropDropHelper strange drag behavior. (folder dropped to itself, caused by OnDragOver skipped) if (CanDrop(currentDir.FullName, addList[0])) { string queryText = String.Format("Add {0} items to {1}?", addList.Length, currentDir.FullName); if (!GetConfirmDrop(sender) || MessageBox.Show(queryText, "Add", MessageBoxButton.YesNo) == MessageBoxResult.Yes) { foreach (string item in addList) { //FileSystemInfoEx parsedItem = FileSystemInfoEx.FromString(item); //IOTools.Copy(parsedItem.FullName, PathEx.Combine(currentDir.FullName, parsedItem.Name)); //if (parsedItem is DirectoryInfoEx) refreshFolder = true; FileSystemInfoEx[] addListExA = stringToEx(addList); int id = WorkSpawner.SpawnCopyWork(addListExA, currentDir, true); System.IO.Tools.WorkFinishedEventHandler handler = null; handler = (System.IO.Tools.WorkFinishedEventHandler) delegate(object send, System.IO.Tools.WorkFinishedEventArgs args) { refresh(sender, e, refreshFolder); WorkSpawner.Works[id].WorkFinished -= handler; }; WorkSpawner.Works[id].WorkFinished += handler; WorkSpawner.Start(id); } } } } finally { (sender as FrameworkElement).Cursor = Cursors.Arrow; SetIsDragOver(null); } refresh(sender, e, refreshFolder); } }
public ApiResponse UpdateRule([FromQuery] string project, [FromQuery(Name = "app")] string appName, [FromQuery] string file, [FromRoute] string ruleId, [FromBody] Newtonsoft.Json.Linq.JObject json) { try { if (!ControllerHelper.GetProjectAndApp(project, appName, out var proj, out var app, out var resp)) { return(resp); } var type = (RuleType)int.Parse(json["Type"].ToString()); string value = json["Value"].ToString(); CommonReturnValue ret; JsFile jsFile = null; if (file == null) { // DB-level ret = app.UpdateRule(ruleId, value); } else { jsFile = app.GetJsFile(file); // TODO: Move check and error message down to App api? if (jsFile == null) { return(ApiResponse.ExclamationModal("The specified output file was not found.")); } ret = jsFile.UpdateRule(ruleId, value); } if (ret.IsSuccess) { SettingsInstance.SaveSettingsToFile(); if (jsFile == null) { WorkSpawner.SetRulesDirty(app); } else { WorkSpawner.SetRulesDirty(app, jsFile); } return(ApiResponse.Success()); } else { return(ApiResponse.ExclamationModal(ret.userErrorVal)); } } catch (Exception ex) { return(ApiResponse.Exception(ex)); } }
public ApiResponse DeleteRule([FromQuery] string project, [FromQuery(Name = "app")] string appName, [FromQuery] string file, [FromRoute] string ruleId) { try { if (!ControllerHelper.GetProjectAndApp(project, appName, out var proj, out var app, out var resp)) { return(resp); } if (file == null) { // DB level var ret = app.DeleteRule(ruleId); if (ret.IsSuccess) { WorkSpawner.SetRulesDirty(app); SettingsInstance.SaveSettingsToFile(); return(ApiResponse.Success()); } else { return(ApiResponse.ExclamationModal(ret.userErrorVal)); } } else { var jsFile = app.GetJsFile(file); if (jsFile == null) { return(ApiResponse.ExclamationModal("The specified output file was not found.")); } var ret = jsFile.DeleteRule(ruleId); if (ret.IsSuccess) { WorkSpawner.SetRulesDirty(app, jsFile); SettingsInstance.SaveSettingsToFile(); return(ApiResponse.Success()); } else { return(ApiResponse.ExclamationModal(ret.userErrorVal)); } } } catch (Exception ex) { return(ApiResponse.Exception(ex)); } }
public ApiResponse GetWorkerLog([FromRoute] string id) { var worker = WorkSpawner.GetWorker(id); if (worker != null) { return(ApiResponse.Payload(new { Endpoint = worker.Endpoint.Pedigree, Log = worker.LogEntries })); } else { return(ApiResponse.Payload(null)); } }
public void ShareMetadaFrom(Endpoint srcEndpoint) { if (srcEndpoint == null) { this.PullMetadataFromEndpointId = null; this.CachedRoutineList = new List <CachedRoutine>(); WorkSpawner.RestartWorker(this); } else { PullMetadataFromEndpointId = srcEndpoint.Id; this.CachedRoutineList = srcEndpoint.CachedRoutineList; } }
public ApiResponse StopWorker([FromRoute] string id) { try { var worker = WorkSpawner.GetWorkerById(id); if (worker != null) { worker.Stop(); return(ApiResponse.Success()); } else { return(ApiResponse.ExclamationModal($"Failed to find specified worker: {id}")); } } catch (Exception e) { return(ApiResponse.Exception(e)); } }
public async Task <IActionResult> WatchSubscription([FromQuery] string project, [FromQuery] string app, [FromQuery] string endpoint, [FromQuery] string file) { try { if (jsdal_server_core.Program.IsShuttingDown) { // await Task.Delay(1800); return(Ok(new { Worker = new { Running = false, Status = "jsDAL Server shutting down" }, HasJsChanges = false, HasSMChanges = false })); } Hubs.MainStats.IncreaseSubWatchers(); if (SettingsInstance.Instance.ProjectList == null) { return(NotFound()); } if (!ControllerHelper.GetProjectAndAppAndEndpoint(project, app, endpoint, out var proj, out var application, out var ep, out var resp)) { return(NotFound()); } var jsFile = application.GetJsFile(file); if (jsFile == null) { return(NotFound()); } dynamic workerState = null; Worker worker = null; // worker-state { worker = WorkSpawner.GetWorkerByEndpoint(ep); if (worker != null) { workerState = new { Running = worker.IsRunning, Status = worker.Status }; if (!worker.IsRunning) { return(Ok(new { Worker = workerState, HasJsChanges = false, HasSMChanges = false })); } } else { return(Ok(new { Worker = new { Running = false, Status = "No worker thread" }, HasJsChanges = false, HasSMChanges = false })); } } string json; string currentJsEtag = null; string currentServerMethodEtag = null; using (var sr = new System.IO.StreamReader(this.Request.Body)) { json = sr.ReadToEnd(); var watch = JsonConvert.DeserializeObject <dynamic>(json); if (watch["JsEtag"] != null) { currentJsEtag = watch["JsEtag"].Value; } if (watch["SMEtag"] != null) { currentServerMethodEtag = watch["SMEtag"].Value; } } bool hasJsChanges = false; bool hasSMChanges = false; int watchForSeconds = 12; int tickCountEnd = Environment.TickCount + (watchForSeconds * 1000); while (!jsdal_server_core.Program.IsShuttingDown && !hasJsChanges && !hasSMChanges && Environment.TickCount <= tickCountEnd) { if (!worker.IsRunning) { workerState = new { Running = worker.IsRunning, Status = worker.Status }; break; } hasJsChanges = jsFile.ETag != currentJsEtag; //hasSMChanges = jsFile.ETag != jsEtag; await Task.Delay(200); } return(Ok(new { Worker = workerState, HasJsChanges = hasJsChanges, HasSMChanges = hasSMChanges })); } catch (Exception ex) { SessionLog.Exception(ex); return(BadRequest(ex.Message)); } finally { Hubs.MainStats.DecreaseSubWatchers(); } }
public BackgroundWorker InstallOrm() { var missing = CheckForMissingOrmPreRequisitesOnDatabase(); if (string.IsNullOrEmpty(missing)) { return(null); } var sqlScriptPath = Path.GetFullPath("./resources/install-orm.sql"); var installSqlScript = File.ReadAllText(sqlScriptPath, System.Text.Encoding.UTF8); //https://stackoverflow.com/a/18597052 var statements = Regex.Split(installSqlScript, @"^[\s]*GO[\s]*\d*[\s]*(?:--.*)?$", RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace | RegexOptions.IgnoreCase); var statementsToExec = statements.Where(x => !string.IsNullOrWhiteSpace(x)).Select(x => x.Trim(' ', '\r', '\n')); using (var con = new SqlConnection()) { con.ConnectionString = this.MetadataConnection.ConnectionStringDecrypted; con.Open(); var trans = con.BeginTransaction(); try { foreach (var st in statementsToExec) { var cmd = new SqlCommand(); cmd.Connection = con; cmd.Transaction = trans; cmd.CommandType = System.Data.CommandType.Text; cmd.CommandText = st; cmd.CommandTimeout = 80; cmd.ExecuteNonQuery(); } trans.Commit(); } catch (Exception ex) { if (trans != null) { trans.Rollback(); } SessionLog.Exception(ex); } con.Close(); BackgroundWorker backgroundWorker = null; backgroundWorker = BackgroundTask.Queue($"{GetBgTaskKey()}.ORM_INIT", $"{Application.Project.Name}/{Application.Name}/{this.Name} ORM initilisation", () => { // try // { using (var conInit = new SqlConnection()) { con.FireInfoMessageEventOnUserErrors = true; conInit.ConnectionString = this.MetadataConnection.ConnectionStringDecrypted; conInit.Open(); var cmdInit = new SqlCommand(); cmdInit.Connection = conInit; cmdInit.CommandText = "ormv2.Init"; cmdInit.CommandTimeout = 600; conInit.InfoMessage += (sender, e) => { if (!backgroundWorker.IsDone && double.TryParse(e.Message, out var p)) { backgroundWorker.Progress = p; Hubs.BackgroundTaskMonitor.Instance.NotifyOfChange(backgroundWorker); } }; cmdInit.ExecuteScalar(); WorkSpawner.HandleOrmInstalled(this); SettingsInstance.SaveSettingsToFile(); return(true); } // } // catch (Exception ex) // { // return ex; // //return ex; // } }); return(backgroundWorker); } }