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.rdb'; 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 36 37 expandedEnd: number 38 39 isOnceRead: boolean 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 const contentValues: data_rdb.ValuesBucket = { 84 "minInstance": metaData.expandedBegin, 85 "maxInstance": metaData.expandedEnd 86 } 87 try { 88 rdb.update(contentValues, getPredicates()) 89 } catch (err) { 90 Log.error(TAG, 'updateExpandedRange get some err') 91 } 92 }) 93} 94 95/** 96 * 重置已扩展时间范围 97 */ 98export function resetExpandedRange() { 99 const manager = CalendarMetaData.getInstance() 100 manager.isOnceRead = false 101 manager.expandedBegin = 0 102 manager.expandedEnd = 0 103 updateExpandedRange(0, 0) 104} 105 106/** 107 * 获取已扩展的开始时间 108 */ 109export async function getExpandedBegin(): Promise<number> { 110 const metaData = CalendarMetaData.getInstance() 111 if (metaData.isOnceRead) { 112 return metaData.expandedBegin 113 } 114 await readFromDb() 115 return metaData.expandedBegin 116} 117 118/** 119 * 获取已扩展的结束时间 120 */ 121export async function getExpandedEnd(): Promise<number> { 122 const metaData = CalendarMetaData.getInstance() 123 if (metaData.isOnceRead) { 124 return metaData.expandedEnd 125 } 126 await readFromDb() 127 return metaData.expandedEnd 128} 129 130async function readFromDb() { 131 Log.debug(TAG, "readFromDb begin") 132 const rdb = await CalendarDataHelper.getInstance().getRdbStore() 133 const columns = [CalendarMetaDataColumns.MIN_INSTANCE, CalendarMetaDataColumns.MAX_INSTANCE, CalendarMetaDataColumns.LOCAL_TIME_ZONE] 134 let resultSet = undefined 135 try { 136 resultSet = await rdb.query(getPredicates(), columns) 137 } catch (err) { 138 Log.error(TAG, 'readFromDb get some err') 139 } 140 Log.debug(TAG, `readFromDb resultSet:${resultSet}`) 141 if (resultSet !== null && resultSet != undefined && resultSet.goToFirstRow()) { 142 const metaData = CalendarMetaData.getInstance() 143 metaData.timeZone = resultSet.getString(resultSet.getColumnIndex(CalendarMetaDataColumns.LOCAL_TIME_ZONE)) 144 metaData.expandedBegin = resultSet.getLong(resultSet.getColumnIndex(CalendarMetaDataColumns.MIN_INSTANCE)) 145 metaData.expandedEnd = resultSet.getLong(resultSet.getColumnIndex(CalendarMetaDataColumns.MAX_INSTANCE)) 146 metaData.isOnceRead = true 147 Log.debug(TAG, "readFromDb parse data successful") 148 } else { 149 await initMetaDataValue(rdb) 150 } 151 Log.debug(TAG, "readFromDb end") 152} 153 154async function initMetaDataValue(rdb: data_rdb.RdbStore) { 155 Log.info(TAG, "initMetaDataValue begin") 156 const metaData = CalendarMetaData.getInstance() 157 metaData.timeZone = '' 158 metaData.expandedBegin = 0 159 metaData.expandedEnd = 0 160 const contentValues = { 161 "_id": UNIQUE_ID, 162 "localTimeZone": '', 163 "minInstance": metaData.expandedBegin, 164 "maxInstance": metaData.expandedEnd 165 } 166 try { 167 const rowId = await rdb.insert(CalendarMetaDataColumns.TABLE_NAME, contentValues) 168 if (rowId < 0) { 169 Log.warn(TAG, "initMetaDataValue failed") 170 } else { 171 metaData.isOnceRead = true 172 Log.info(TAG, "initMetaDataValue end") 173 } 174 } catch (err) { 175 Log.error(TAG, 'initMetaDataValue get some err') 176 } 177} 178 179function getPredicates(): data_rdb.RdbPredicates { 180 return new data_rdb.RdbPredicates(CalendarMetaDataColumns.TABLE_NAME).equalTo(CalendarMetaDataColumns.ID, UNIQUE_ID) 181}