コード例 #1
0
        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));
            }
        }
コード例 #2
0
        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));
            }
        }
コード例 #3
0
        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));
            }
        }
コード例 #4
0
        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));
            }
        }
コード例 #5
0
        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));
            }
        }
コード例 #6
0
        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);
            }
        }
コード例 #7
0
        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);
            }
        }
コード例 #8
0
        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));
            }
        }
コード例 #9
0
        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));
            }
        }
コード例 #10
0
        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));
            }
        }
コード例 #11
0
        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;
            }
        }
コード例 #12
0
        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));
            }
        }
コード例 #13
0
        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();
            }
        }
コード例 #14
0
        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);
            }
        }