Ejemplo n.º 1
0
        // --------------------------------------------------------------------
        // キャッシュ DB からディスク DB へコピー
        // --------------------------------------------------------------------
        private static void CacheToDiskCore(TargetFolderInfo targetFolderInfo)
        {
            try
            {
                using CacheContext cacheContext = new(YlCommon.DriveLetter(targetFolderInfo.TargetPath));
                cacheContext.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;

                // QueryTrackingBehavior.NoTracking(または AsNoTracking())時、結果の内容を変更して使いたい時は IQueryable<T> で受けてはならない(インスタンスの内容が変更できない)
                // List<T> 等に変換すれば結果のインスタンス内容を変更できる(変更しても SaveChanges() の対象にはならないと思う)
                List <TFound> cacheRecords = cacheContext.Founds.Where(x => x.ParentFolder == targetFolderInfo.TargetPath).ToList();

                if (!cacheRecords.Any())
                {
                    // キャッシュが見つからない場合、ドライブレター以外の部分で合致するか再度検索
                    // 誤検知しないようコロンも含めて検索するので、YlCommon.WithoutDriveLetter() は使用しない
                    String withoutDriveLetterOne = targetFolderInfo.TargetPath[1..];
Ejemplo n.º 2
0
        // --------------------------------------------------------------------
        // キャッシュ更新(追加)
        // records の ParentFolder はすべて同じ前提
        // --------------------------------------------------------------------
        public void UpdateCache(List <TFound> records)
        {
            String parentFolder = records.First().ParentFolder;

            // 追加しようとしているキャッシュと同じ親フォルダーの旧キャッシュ削除
            IQueryable <TFound> removes = Founds.Where(x => x.ParentFolder == parentFolder);

            Founds.RemoveRange(removes);

            // 追加しようとしているキャッシュとドライブレターが異なるキャッシュ削除
            removes = Founds.Where(x => !x.ParentFolder.Contains(YlCommon.DriveLetter(parentFolder)));
            Founds.RemoveRange(removes);
            SaveChanges();

            // 新キャッシュ追加
            foreach (TFound record in records)
            {
                // Uid を初期化して自動的に Uid を振ってもらうようにする
                record.Uid = 0;
            }
            Founds.AddRange(records);

            // キャッシュ管理テーブル更新
            TCacheHeader?cacheHeader = CacheHeaders.FirstOrDefault(x => x.ParentFolder == parentFolder);
            Boolean      needAdd     = false;

            if (cacheHeader == null)
            {
                cacheHeader = new()
                {
                    ParentFolder = parentFolder,
                };
                needAdd = true;
            }
            cacheHeader.UpdateTime = YlCommon.UtcNowMjd();
            if (needAdd)
            {
                CacheHeaders.Add(cacheHeader);
            }

            SaveChanges();
        }
Ejemplo n.º 3
0
        // ====================================================================
        // public 関数
        // ====================================================================

        // --------------------------------------------------------------------
        // ゆかり検索対象フォルダー追加
        // 指定された親フォルダーのみを追加し、サブフォルダーは追加しない
        // <例外> Exception
        // --------------------------------------------------------------------
        public async Task AddTargetFolderAsync(String parentFolder)
        {
            await Task.Run(() =>
            {
#if DEBUGz
                Thread.Sleep(2000);
#endif
                // フォルダーチェック
                if (String.IsNullOrEmpty(parentFolder))
                {
                    throw new Exception("追加するフォルダーの名前が空です。");
                }
                if (!Directory.Exists(parentFolder))
                {
                    throw new Exception("指定されたフォルダーが存在しません:" + parentFolder);
                }

                // 親の重複チェック
                Boolean parentAdded = IndexOfTargetFolderInfoWithLock(parentFolder) >= 0;
                if (parentAdded)
                {
                    throw new Exception(parentFolder + " は既に追加されています。");
                }

                // 親の追加
                TargetFolderInfo targetFolderInfo = new(parentFolder);
                lock (_targetFolderInfos)
                {
                    _targetFolderInfos.Add(targetFolderInfo);
                }

                // 通知
                YlModel.Instance.EnvModel.IsMainWindowDataGridCountChanged = true;
                YlModel.Instance.EnvModel.Sifolin.MainEvent.Set();
                SetLomolinTargetDrives();

                // スリープ状態のデバイスだとここで時間がかかる
                AdjustAutoTargetInfoIfNeeded(YlCommon.DriveLetter(parentFolder));
            });
        }
Ejemplo n.º 4
0
        // --------------------------------------------------------------------
        // サブフォルダーも含めて FolderTaskDetail を Remove にする
        // parentFolder は IsParent である必要がある
        // --------------------------------------------------------------------
        public Boolean SetFolderTaskDetailOfFolderToRemove(String parentFolder)
        {
            lock (_targetFolderInfos)
            {
                Int32 parentIndex = IndexOfTargetFolderInfoWithoutLock(parentFolder);
                if (parentIndex < 0)
                {
                    return(false);
                }
                Debug.Assert(_targetFolderInfos[parentIndex].IsParent, "SetFolderTaskDetailToRemove() not parent");
                for (Int32 i = parentIndex; i < parentIndex + _targetFolderInfos[parentIndex].NumTotalFolders; i++)
                {
                    _targetFolderInfos[i].SetFolderTaskKind(FolderTaskKind.Remove);
                    _targetFolderInfos[i].SetFolderTaskDetail(FolderTaskDetail.Remove);
                    _targetFolderInfos[i].FolderTaskStatus = FolderTaskStatus.Queued;
                }
            }

            // 通知
            YlModel.Instance.EnvModel.IsMainWindowDataGridItemUpdated = true;
            YlModel.Instance.EnvModel.Sifolin.MainEvent.Set();
            AdjustAutoTargetInfoIfNeeded(YlCommon.DriveLetter(parentFolder));
            return(true);
        }