Esempio n. 1
0
        /// <summary>
        /// 用于DesignTree加载时
        /// </summary>
        internal static async Task <Dictionary <string, CheckoutInfo> > LoadAllAsync()
        {
            var list = new Dictionary <string, CheckoutInfo>();

#if FUTURE
            var q = new TableScan(Consts.SYS_CHECKOUT_MODEL_ID);
#else
            var q = new SqlQuery(Consts.SYS_CHECKOUT_MODEL_ID);
#endif
            var res = await q.ToListAsync();

            if (res != null)
            {
                for (int i = 0; i < res.Count; i++)
                {
                    var info = new CheckoutInfo((DesignNodeType)res[i].GetByte(Consts.CHECKOUT_NODETYPE_ID),
                                                res[i].GetString(Consts.CHECKOUT_TARGETID_ID),
                                                (uint)res[i].GetInt32(Consts.CHECKOUT_VERSION_ID),
                                                res[i].GetString(Consts.CHECKOUT_DEVELOPERNAME_ID),
                                                res[i].GetGuid(Consts.CHECKOUT_DEVELOPERID_ID));
                    list.Add(info.GetKey(), info);
                }
            }

            return(list);
        }
Esempio n. 2
0
        /// <summary>
        /// 加载挂起项目
        /// </summary>
        /// <param name="onlyModelsAndFolders">true用于DesignTree加载; false用于发布时加载</param>
        internal static async Task <StagedItems> LoadStagedAsync(bool onlyModelsAndFolders)
        {
            //TODO:考虑用于DesignTree加载时连服务模型的代码一并加载
            var developerID = RuntimeContext.Current.CurrentSession.LeafOrgUnitID;

#if FUTURE
            var q = new TableScan(Consts.SYS_STAGED_MODEL_ID);
            if (onlyModelsAndFolders)
            {
                q.Filter(q.GetGuid(Consts.STAGED_DEVELOPERID_ID) == developerID &
                         q.GetByte(Consts.STAGED_TYPE_ID) <= (byte)StagedType.Folder);
            }
            else
            {
                q.Filter(q.GetGuid(Consts.STAGED_DEVELOPERID_ID) == developerID);
            }
#else
            var q = new SqlQuery(Consts.SYS_STAGED_MODEL_ID);
            if (onlyModelsAndFolders)
            {
                q.Where(q.T["DeveloperId"] == developerID & q.T["Type"] <= (byte)StagedType.Folder);
            }
            else
            {
                q.Where(q.T["DeveloperId"] == developerID);
            }
#endif
            var res = await q.ToListAsync();

            return(new StagedItems(res));
        }
Esempio n. 3
0
        internal static async ValueTask <string> LoadViewRuntimeCode(ulong viewModelId)
        {
            var developerID = RuntimeContext.Current.CurrentSession.LeafOrgUnitID;

#if FUTURE
            var q = new TableScan(Consts.SYS_STAGED_MODEL_ID);
            q.Filter(q.GetGuid(Consts.STAGED_DEVELOPERID_ID) == developerID &
                     q.GetString(Consts.STAGED_MODELID_ID) == viewModelId.ToString() &
                     q.GetByte(Consts.STAGED_TYPE_ID) == (byte)StagedType.ViewRuntimeCode);
#else
            var q = new SqlQuery(Consts.SYS_STAGED_MODEL_ID);
            q.Where(q.T["DeveloperId"] == developerID &
                    q.T["ModelId"] == viewModelId.ToString() &
                    q.T["Type"] == (byte)StagedType.ViewRuntimeCode);
#endif
            var res = await q.ToListAsync();

            if (res == null || res.Count == 0)
            {
                return(null);
            }

            var data = res[0].GetBytes(Consts.STAGED_DATA_ID);
            ModelCodeUtil.DecodeViewRuntimeCode(data, out string runtimeCode);
            return(runtimeCode);
        }
Esempio n. 4
0
        private static async Task SaveAsync(StagedType type, string modelId, byte[] data)
        {
            var developerID = RuntimeContext.Current.CurrentSession.LeafOrgUnitID;
            var model       = await RuntimeContext.Current.GetModelAsync <EntityModel>(Consts.SYS_STAGED_MODEL_ID);

            //TODO:使用SelectForUpdate or BatchDelete

#if FUTURE
            var  q         = new TableScan(Consts.SYS_STAGED_MODEL_ID);
            byte typeValue = (byte)type;
            q.Filter(q.GetByte(Consts.STAGED_TYPE_ID) == typeValue &
                     q.GetString(Consts.STAGED_MODELID_ID) == modelId &
                     q.GetGuid(Consts.STAGED_DEVELOPERID_ID) == developerID);

            var txn = await Transaction.BeginAsync();
#else
            var q = new SqlQuery(Consts.SYS_STAGED_MODEL_ID);
            q.Where(q.T["Type"] == (byte)type &
                    q.T["ModelId"] == modelId &
                    q.T["DeveloperId"] == developerID);

            using var conn = await SqlStore.Default.OpenConnectionAsync();

            using var txn = conn.BeginTransaction();
#endif

            var res = await q.ToListAsync();

            if (res != null && res.Count > 0)
            {
                //TODO:*****临时先删除再重新插入
                for (int i = 0; i < res.Count; i++)
                {
#if FUTURE
                    await EntityStore.DeleteEntityAsync(model, res[i].Id, txn);
#else
                    await SqlStore.Default.DeleteAsync(res[i], txn);
#endif
                }
            }

            var obj = new Entity(model);
            obj.SetByte(Consts.STAGED_TYPE_ID, (byte)type);
            obj.SetString(Consts.STAGED_MODELID_ID, modelId);
            obj.SetGuid(Consts.STAGED_DEVELOPERID_ID, developerID);
            obj.SetBytes(Consts.STAGED_DATA_ID, data);
#if FUTURE
            await EntityStore.InsertEntityAsync(obj, txn);

            await txn.CommitAsync();
#else
            await SqlStore.Default.InsertAsync(obj, txn);

            txn.Commit();
#endif
        }
Esempio n. 5
0
        public void beforeFirst(Constant searchkey)
        {//将索引定位在包含指定搜索键的第一条索引记录前
            close();
            this.searchkey = searchkey;
            int       bucket  = searchkey.GetHashCode() % NUM_BUCKETS;//根据searchkey的大小判断当前在哪一个桶
            string    tblname = idxname + bucket;
            TableInfo ri      = new TableInfo(tblname, sch);

            ts = new TableScan(ri, tx);
        }
Esempio n. 6
0
        public async Task <object> Handle(DesignHub hub, InvokeArgs args)
        {
            var modelId   = args.GetString();
            var modelNode = hub.DesignTree.FindModelNode(ModelType.Entity, ulong.Parse(modelId));

            if (modelNode == null)
            {
                throw new Exception($"Cannot find EntityModel: {modelId}");
            }
            var model = (EntityModel)modelNode.Model;

            if (model.StoreOptions == null)
            {
                throw new Exception("DTO can't load data.");
            }
            if (model.PersistentState == PersistentState.Detached)
            {
                //TODO:考虑根据设计时模型生成一条伪记录给前端
                throw new Exception("EntityModel is new, can't load data.");
            }
            if (model.SysStoreOptions != null)
            {
#if FUTURE
                var q   = new TableScan(model.Id);
                var res = await q.Take(20).ToListAsync();

                if (res == null || res.Count == 0)
                {
                    throw new Exception("no record"); //TODO: 同上
                }
                return(res);
#endif
            }
            if (model.SqlStoreOptions != null)
            {
                var q = new SqlQuery(model.Id);
                return(await q.Take(20).ToListAsync());
            }
            if (model.CqlStoreOptions != null)
            {
                var q = new CqlQuery(model.Id)
                {
                    Limit = 20
                };
                return(await q.ToListAsync());
            }
            throw new NotSupportedException();
        }
Esempio n. 7
0
        private static async Task <byte[]> LoadCodeDataAsync(ulong modelId)
        {
            var developerID = RuntimeContext.Current.CurrentSession.LeafOrgUnitID;

#if FUTURE
            var q = new TableScan(Consts.SYS_STAGED_MODEL_ID);
            q.Filter(q.GetGuid(Consts.STAGED_DEVELOPERID_ID) == developerID &
                     q.GetString(Consts.STAGED_MODELID_ID) == modelId.ToString() &
                     q.GetByte(Consts.STAGED_TYPE_ID) == (byte)StagedType.SourceCode);
#else
            var q = new SqlQuery(Consts.SYS_STAGED_MODEL_ID);
            q.Where(q.T["DeveloperId"] == developerID &
                    q.T["ModelId"] == modelId.ToString() &
                    q.T["Type"] == (byte)StagedType.SourceCode);
#endif
            var res = await q.ToListAsync();

            if (res == null || res.Count == 0)
            {
                return(null);
            }

            return(res[0].GetBytes(Consts.STAGED_DATA_ID));
        }
Esempio n. 8
0
 public IEnumerable <WebSite> GetLocalSites()
 {
     return(TableScan.Where(o => !string.IsNullOrEmpty(o.LocalRootPath))
            .SelectAll()
            .OrderBy(it => it.Name));
 }
Esempio n. 9
0
        public async Task <IActionResult> Post([FromBody] LoginRequire require)
        {
            if (string.IsNullOrEmpty(require.User) || string.IsNullOrEmpty(require.Password))
            {
                return(Ok(new { Succeed = false, Error = "User account or password is null" }));
            }

#if FUTURE
            //TODO:以下逻辑合并至ServerMessageDispatcher.ProcessLoginRequire

            //根据账号索引查询
            var q = new IndexGet(appbox.Consts.SYS_EMPLOEE_MODEL_ID, appbox.Consts.EMPLOEE_UI_ACCOUNT_ID);
            q.Where(new KeyPredicate(appbox.Consts.EMPLOEE_ACCOUNT_ID, KeyPredicateType.Equal, require.User));
            var res = await q.ToIndexRowAsync();

            if (res.IsEmpty)
            {
                return(Ok(new { Succeed = false, Error = "User account not exists" }));
            }
            Guid   emploeeID = res.TargetEntityId;
            byte[] passData  = res.ValueTuple.GetBytes(appbox.Consts.EMPLOEE_PASSWORD_ID);
            res.Dispose();
            //验证密码
            if (!RuntimeContext.PasswordHasher.VerifyHashedPassword(passData, require.Password))
            {
                return(Ok(new { Succeed = false, Error = "Password not match" }));
            }

            //TODO:****暂全表扫描获取Emploee对应的OrgUnits,待用Include EntitySet实现
            var q1 = new TableScan(appbox.Consts.SYS_ORGUNIT_MODEL_ID);
            q1.Filter(q1.GetGuid(appbox.Consts.ORGUNIT_BASEID_ID) == emploeeID);
            var ous = await q1.ToListAsync();

            if (ous == null || ous.Count == 0)
            {
                return(Ok(new { Succeed = false, Error = "User must mapped to OrgUnit" }));
            }

            TreeNodePath path = await EntityStore.LoadTreeNodePathAsync(
                appbox.Consts.SYS_ORGUNIT_MODEL_ID, ous[0].Id, appbox.Consts.ORGUNIT_PARENT_ID, appbox.Consts.ORGUNIT_NAME_ID);
#else
            //查找账号并验证密码
            var q = new SqlQuery(appbox.Consts.SYS_EMPLOEE_MODEL_ID);
            q.Where(q.T["Account"] == require.User);
            var emp = await q.ToSingleAsync();

            if (emp == null)
            {
                return(Ok(new { Succeed = false, Error = "User account not exists" }));
            }
            Guid emploeeID = emp.GetGuid(StoreInitiator.PK_Member_Id);

            byte[] passData = emp.GetBytes(appbox.Consts.EMPLOEE_PASSWORD_ID);
            if (passData == null)
            {
                return(Ok(new { Succeed = false, Error = "User password not exists" }));
            }

            if (!RuntimeContext.PasswordHasher.VerifyHashedPassword(passData, require.Password))
            {
                return(Ok(new { Succeed = false, Error = "Password not match" }));
            }
            //查找对应的OrgUnits
            var q1 = new SqlQuery(appbox.Consts.SYS_ORGUNIT_MODEL_ID);
            q1.Where(q1.T["BaseId"] == emploeeID);
            var ous = await q1.ToListAsync();

            if (ous == null || ous.Count == 0)
            {
                return(Ok(new { Succeed = false, Error = "User must mapped to OrgUnit" }));
            }

            var q2 = new SqlQuery(appbox.Consts.SYS_ORGUNIT_MODEL_ID);
            q2.Where(q2.T["Id"] == ous[0].GetGuid(StoreInitiator.PK_Member_Id));
            TreeNodePath path = await q2.ToTreeNodePathAsync(q2.T["Parent"], q2.T["Name"]);
#endif

            object returnUserInfo = new { ous[0].Id, Name = path[0].Text, Account = require.User };

            //注册会话
            var id      = (ulong)StringHelper.GetHashCode(require.User); //TODO:***** 暂简单hash
            var session = new WebSession(id, path, emploeeID, null /*TODO:tag暂null*/);
            HttpContext.Session.SaveWebSession(session);

            //返回登录成功
            Log.Debug($"用户[{session.GetFullName()}]登录.");
            return(Ok(new { Succeed = true, UserInfo = returnUserInfo }));
        }
        public async Task <EntityList <Entities.OrgUnit> > LoadTreeList()
        {
            var q = new TableScan <Entities.OrgUnit>();

            return(await q.ToTreeListAsync(t => t.Childs));
        }