Example #1
0
        /// <summary>
        /// Perform a deep clone of an annotation table UserObject including the underlying data
        /// </summary>
        /// <param name="uo"></param>
        /// <returns></returns>

        public static UserObject DeepClone(UserObject uo)
        {
            UserObject uo2 = uo.Clone();
            long       oldCode, newCode;

            // Create a copy of the user object including remapping of the codes

            AnnotationDao dao = new AnnotationDao();
            MetaTable     mt  = MetaTable.Deserialize(uo.Content);        // deserialize metatable xml

            int newMethodCode = UserObjectDao.GetNextId();

            uo2.Id   = newMethodCode;           // store in UserObject id as well
            mt.Code  = newMethodCode.ToString();
            mt.Name  = "ANNOTATION_" + mt.Code;
            mt.Label = uo.Name;

            Dictionary <long, long> codeMap = new Dictionary <long, long>();

            foreach (MetaColumn mc in mt.MetaColumns)
            {
                if (!Lex.IsNullOrEmpty(mc.ResultCode))
                {
                    if (!long.TryParse(mc.ResultCode, out oldCode))
                    {
                        continue;
                    }
                    newCode          = dao.GetNextIdLong();
                    codeMap[oldCode] = newCode;
                    mc.Name          = "R_" + newCode;
                    mc.ResultCode    = newCode.ToString();
                }
            }

            // Write import state if checking for updates

            if (mt.ImportParms != null && mt.ImportParms.CheckForFileUpdates)
            {
                UserObject          udisUo = new UserObject(UserObjectType.ImportState, uo2.Owner, mt.Name);
                UserDataImportState udis   = new UserDataImportState();

                udis.UserDatabase        = false;          // indicate annotation table
                udis.UserDataObjectId    = uo2.Id;         // store id of annotation table user object
                udis.ClientFile          = mt.ImportParms.FileName;
                udis.CheckForFileUpdates = mt.ImportParms.CheckForFileUpdates;
                udis.ClientFileModified  = mt.ImportParms.ClientFileModified;
                udis.FileName            = mt.ImportParms.FileName;
                udisUo.Description       = udis.Serialize();           // serialize to description

                UserObjectDao.Write(udisUo);
            }

            // Copy the data

            dao.BeginTransaction();
            dao.BufferInserts(true);
            dao.OpenReader(uo.Id);

            Dictionary <long, long> groupMap = new Dictionary <long, long>();
            int readCount = 0;

            while (true)
            {
                AnnotationVo vo = dao.Read();
                if (vo == null)
                {
                    break;
                }

                if (!codeMap.ContainsKey(vo.rslt_typ_id))
                {
                    continue;
                }
                vo.rslt_typ_id = codeMap[vo.rslt_typ_id];         // map the result code

                vo.rslt_id = dao.GetNextIdLong();                 // new result id

                vo.mthd_vrsn_id = newMethodCode;

                if (!groupMap.ContainsKey(vo.rslt_grp_id))                 // map the group id
                {
                    groupMap[vo.rslt_grp_id] = dao.GetNextIdLong();
                }
                vo.rslt_grp_id = groupMap[vo.rslt_grp_id];

                dao.Insert(vo);
                readCount++;
                if (readCount % 1000 == 0)
                {
                    dao.ExecuteBufferedInserts();
                    dao.Commit();
                }
            }

            dao.ExecuteBufferedInserts();
            dao.Commit();
            dao.Dispose();

            uo2.Count            = groupMap.Count;  // update the count
            uo2.CreationDateTime = uo2.UpdateDateTime = DateTime.Now;
            uo2.Content          = mt.Serialize();
            return(uo2);
        }
Example #2
0
        /// <summary>
        /// Thread to check to see if any imports need to started
        /// </summary>

        public void CheckForImportFileUpdatesThreadMethod(Object CheckAll)
        {
            // Check each ImportState user object for the user to see if any imports need to be started.
            // If any are found then start a new hidden Mobius client & server to upload the file(s)
            // and start an import user data process for each one.

            UserDataImportState udis;

            List <UserObject> imps = new List <UserObject>();
            UserCmpndDbDao    udbs = new UserCmpndDbDao();

            int t0 = TimeOfDay.Milliseconds();

            bool checkAllImportFiles = (bool)CheckAll;

            if (checkAllImportFiles)
            {
                imps = UserObjectDao.ReadMultiple(UserObjectType.ImportState, false);
            }
            else
            {
                imps = UserObjectDao.ReadMultiple(UserObjectType.ImportState, SS.I.UserName, false, false);
            }

            int t1 = TimeOfDay.Milliseconds() - t0;

            if (imps.Count == 0)
            {
                return;
            }
            //			return ""; // debug

            int i1 = 0;

            while (i1 < imps.Count)
            {             // pare list down do those needing updating
                UserObject uo = imps[i1];

                try { udis = UserDataImportState.Deserialize(uo); }
                catch (Exception ex)
                {
                    imps.RemoveAt(i1);
                    continue;
                }

                if (udis.CheckForFileUpdates && ((checkAllImportFiles == true && udis.ClientFile.Substring(0, 1) == "\\" && FileUtil.Exists(udis.ClientFile)) || checkAllImportFiles == false))
                {
                    DateTime clientFileModDt = FileUtil.GetFileLastWriteTime(udis.ClientFile); // get client file mod date

                    if (clientFileModDt == DateTime.MinValue ||                                // skip if client file not found or
                        udis.ImportIsRunning ||                                                // import is already running
                        ((clientFileModDt - udis.ClientFileModified).TotalSeconds < 1 &&       // no change in client file mod date and
                         !udis.ImportHasFailed))                                               // prev load attempt hasn't failed
                    {
                        imps.RemoveAt(i1);
                        continue;
                    }

                    udis.ClientFileModified = clientFileModDt;                     // write the updated file date
                    uo.Description          = udis.Serialize();
                    UserObjectDao.Write(uo);
                }

                else                          // running or failed manual background import
                {
                    if (udis.ImportHasFailed) // delete if failed
                    {
                        bool deleted = UserObjectDao.Delete(udis.Id);
                        udbs.LogMessage("Deleted ImportState object for failed manual background import on " + uo.Name);
                    }

                    imps.RemoveAt(i1);                     // don't consider further here
                    continue;
                }

                i1++;
            }

            //write a debug message and return
            udbs.LogMessage(string.Format("Found {0} annotation files that could be updated by the {1} account", imps.Count, SS.I.UserName));

            int t2 = TimeOfDay.Milliseconds() - t0;

            if (imps.Count == 0)
            {
                return;
            }

            // Upload the file to the server and start a background process to update the annotation table

            foreach (UserObject uo2 in imps)
            {
                try
                {
                    udis = UserDataImportState.Deserialize(uo2);
                    string internalUoName = "Annotation_" + uo2.Id;
                    string exportDir      = ServicesIniFile.Read("BackgroundExportDirectory");
                    string serverFileName =                     // location for file on server
                                            exportDir + @"\" + internalUoName + Path.GetExtension(udis.FileName);
                    ServerFile.CopyToServer(udis.FileName, serverFileName);
                    string command = "ImportUserData " + serverFileName + ", " + internalUoName;
                    CommandLine.StartBackgroundSession("ImportUserData " + serverFileName + ", " + uo2.Name);
                    udbs.LogMessage("Auto-upload for ImportState ObjId = " + ", " + uo2.Id + ", Name = " + uo2.Name + ", Desc = " + uo2.Description);
                }

                catch (Exception ex)
                {
                    try
                    {
                        udbs.LogMessage("Auto-upload exception ImportState ObjId = " + uo2.Id + ", Name = " + uo2.Name +
                                        ", Desc = " + uo2.Description +
                                        "\n" + DebugLog.FormatExceptionMessage(ex));
                    }

                    catch (Exception ex2) { ex2 = ex2; }

                    continue;
                }
            }

            Progress.Hide();

            int t3 = TimeOfDay.Milliseconds() - t0;

            return;
        }