• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/**
2 * @file Describe the file
3 * Copyright (c) 2023 Huawei Device Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *     http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17import data_rdb from '@ohos.data.relationalStore';
18import CalendarDataHelper from '../../utils/CalendarDataHelper';
19import { CalendarMetaDataColumns } from '@ohos/datastructure/src/main/ets/calendarmetadata/CalendarMetaDataColumns'
20import { Log } from '@ohos/common/src/main/ets/utils/Log'
21
22const TAG = 'ExpandRangeManager'
23
24// CalendarMetaData表唯一的数据ID,只允许存在一条记录
25const UNIQUE_ID = 1
26
27/**
28 * CalendarMetaData表对应数据的缓存类
29 *
30 * @since 2022-05-28
31 */
32class CalendarMetaData {
33  timeZone: string = '';
34
35  expandedBegin: number = 0;
36
37  expandedEnd: number = 0;
38
39  isOnceRead: boolean = false;
40
41  private static instance: CalendarMetaData;
42
43  public static getInstance(): CalendarMetaData {
44    if (!CalendarMetaData.instance) {
45      CalendarMetaData.instance = new CalendarMetaData();
46    }
47    return CalendarMetaData.instance;
48  }
49}
50
51/**
52 * 是否在已扩展时间范围内
53 *
54 * @param begin 开始时间
55 * @param end 结束时间
56 */
57export async function isInExpandedRange(begin: number, end: number): Promise<boolean> {
58  const expandedBegin = await getExpandedBegin();
59  const expandedEnd = await getExpandedEnd();
60  return begin >= expandedBegin && end <= expandedEnd;
61}
62
63/**
64 * 更新已扩展范围
65 *
66 * @param begin 开始时间,比原先开始时间小才更新
67 * @param end 结束时间,比原先结束时间大才更新
68 */
69export function updateExpandedRange(begin: number, end: number) {
70  const metaData = CalendarMetaData.getInstance();
71  if (begin >= metaData.expandedBegin && end <= metaData.expandedEnd) {
72    Log.info(TAG, "no need to updateExpandedRange");
73    return;
74  }
75  if (begin < metaData.expandedBegin || metaData.expandedBegin === 0) {
76    metaData.expandedBegin = begin;
77  }
78  if (end > metaData.expandedEnd || metaData.expandedEnd === 0) {
79    metaData.expandedEnd = end;
80  }
81
82  CalendarDataHelper.getInstance().getRdbStore().then((rdb) => {
83    if (!rdb) {
84      Log.error(TAG, 'updateExpandedRange get some err');
85      return;
86    }
87    const contentValues: data_rdb.ValuesBucket = {
88      "minInstance": metaData.expandedBegin,
89      "maxInstance": metaData.expandedEnd
90    }
91    try {
92      rdb.update(contentValues, getPredicates());
93    } catch (err) {
94      Log.error(TAG, 'updateExpandedRange get some err');
95    }
96  })
97}
98
99/**
100 * 重置已扩展时间范围
101 */
102export function resetExpandedRange() {
103  const manager = CalendarMetaData.getInstance();
104  manager.isOnceRead = false;
105  manager.expandedBegin = 0;
106  manager.expandedEnd = 0;
107  updateExpandedRange(0, 0);
108}
109
110/**
111 * 获取已扩展的开始时间
112 */
113export async function getExpandedBegin(): Promise<number> {
114  const metaData = CalendarMetaData.getInstance();
115  if (metaData.isOnceRead) {
116    return metaData.expandedBegin;
117  }
118  await readFromDb();
119  return metaData.expandedBegin;
120}
121
122/**
123 * 获取已扩展的结束时间
124 */
125export async function getExpandedEnd(): Promise<number> {
126  const metaData = CalendarMetaData.getInstance();
127  if (metaData.isOnceRead) {
128    return metaData.expandedEnd;
129  }
130  await readFromDb();
131  return metaData.expandedEnd;
132}
133
134async function readFromDb() {
135  Log.debug(TAG, "readFromDb begin");
136  const rdb = await CalendarDataHelper.getInstance().getRdbStore();
137  if (!rdb) {
138    Log.warn(TAG, "readFromDb: the rdb is null");
139    return;
140  }
141  const columns = [CalendarMetaDataColumns.MIN_INSTANCE, CalendarMetaDataColumns.MAX_INSTANCE, CalendarMetaDataColumns.LOCAL_TIME_ZONE];
142  let resultSet: data_rdb.ResultSet = {} as data_rdb.ResultSet;
143  try {
144    resultSet = await rdb.query(getPredicates(), columns);
145  } catch (err) {
146    Log.error(TAG, 'readFromDb get some err');
147  }
148  try {
149    Log.debug(TAG, `readFromDb resultSet:${resultSet}`);
150    if (resultSet !== null && resultSet != undefined && resultSet.goToFirstRow()) {
151      const metaData = CalendarMetaData.getInstance();
152      metaData.timeZone = resultSet.getString(resultSet.getColumnIndex(CalendarMetaDataColumns.LOCAL_TIME_ZONE));
153      metaData.expandedBegin = resultSet.getLong(resultSet.getColumnIndex(CalendarMetaDataColumns.MIN_INSTANCE));
154      metaData.expandedEnd = resultSet.getLong(resultSet.getColumnIndex(CalendarMetaDataColumns.MAX_INSTANCE));
155      metaData.isOnceRead = true;
156      Log.debug(TAG, "readFromDb parse data successful");
157    } else {
158      await initMetaDataValue(rdb);
159    }
160  } catch (err) {
161    Log.warn(TAG, `readFromDb err ${JSON.stringify(err)}`);
162  }
163  if (resultSet) {
164    resultSet.close();
165  }
166  Log.debug(TAG, "readFromDb end");
167}
168
169async function initMetaDataValue(rdb: data_rdb.RdbStore) {
170  Log.info(TAG, "initMetaDataValue begin");
171  const metaData = CalendarMetaData.getInstance();
172  metaData.timeZone = '';
173  metaData.expandedBegin = 0;
174  metaData.expandedEnd = 0;
175  const contentValues: data_rdb.ValuesBucket = {
176    "_id": UNIQUE_ID,
177    "localTimeZone": '',
178    "minInstance": metaData.expandedBegin,
179    "maxInstance": metaData.expandedEnd
180  }
181  try {
182    const rowId = await rdb.insert(CalendarMetaDataColumns.TABLE_NAME, contentValues);
183    if (rowId < 0) {
184      Log.warn(TAG, "initMetaDataValue failed");
185    } else {
186      metaData.isOnceRead = true;
187      Log.info(TAG, "initMetaDataValue end");
188    }
189  } catch (err) {
190    Log.error(TAG, 'initMetaDataValue get some err');
191  }
192}
193
194function getPredicates(): data_rdb.RdbPredicates {
195  return new data_rdb.RdbPredicates(CalendarMetaDataColumns.TABLE_NAME).equalTo(CalendarMetaDataColumns.ID, UNIQUE_ID);
196}