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}