6#include "LunarCalendarModel.h"
7#include "CalendarLunar.h"
8#include "RabbitCommonDir.h"
10#include <QStandardPaths>
11#include <QTextCharFormat>
14#include <QApplication>
21#include <QLoggingCategory>
23static Q_LOGGING_CATEGORY(Logger,
"Rabbit.LunarCalendar.Model")
24static Q_LOGGING_CATEGORY(LogDB, "Rabbit.LunarCalendar.Model.Database")
27 : QAbstractTableModel(parent),
28 m_Date(QDate::currentDate()),
29 m_MinimumDate(-2000, 1, 1),
30 m_MaximumDate(3000, 12, 31),
31 m_ShownYear(m_Date.year()),
32 m_ShownMonth(m_Date.month()),
34 m_bEnableHolidays(true),
35 m_bEnableSolarTerm(true),
36 m_bEnableToolTip(true)
47 m_Locale = QLocale::system();
48 m_FirstDay = Qt::Monday;
51 QString szSqlPath = QStandardPaths::writableLocation(QStandardPaths::TempLocation)
52 + QDir::separator() +
"Rabbit"
53 + QDir::separator() +
"LunarCalendar";
55 if(!d.exists(szSqlPath))
57 QString szChineseHolidaysSql = szSqlPath + QDir::separator() +
"chinese_holidays.sql";
58 m_ChineseHolidaysSql.setFileName(szChineseHolidaysSql);
60 urls << QUrl(
"https://sourceforge.net/p/lunarcalendar/code/ci/master/tree/Src/Resource/database/chinese_holidays.sql?format=raw")
61 << QUrl(
"https://gitee.com/kl222/LunarCalendar/raw/master/Src/Resource/database/chinese_holidays.sql")
62 << QUrl(
"https://github.com/KangLin/LunarCalendar/raw/master/Src/Resource/database/chinese_holidays.sql")
63 << QUrl(
"https://gitlab.com/kl222/LunarCalendar/-/raw/master/Src/Resource/database/chinese_holidays.sql");
64 DownloadChineseHolidaysSqlFile(urls);
66 m_HolidaysSql.setFileName(szSqlPath + QDir::separator() +
"holidays.sql");
68 urls << QUrl(
"https://sourceforge.net/p/lunarcalendar/code/ci/master/tree/Src/Resource/database/holidays.sql?format=raw")
69 << QUrl(
"https://gitee.com/kl222/LunarCalendar/raw/master/Src/Resource/database/holidays.sql")
70 << QUrl(
"https://github.com/KangLin/LunarCalendar/raw/master/Src/Resource/database/holidays.sql")
71 << QUrl(
"https://gitlab.com/kl222/LunarCalendar/-/raw/master/Src/Resource/database/holidays.sql");
72 DownloadHolidaysSqlFile(urls);
79CLunarCalendarModel::~CLunarCalendarModel()
81 if(m_Database.isOpen())
85QVariant CLunarCalendarModel::headerData(
int section, Qt::Orientation orientation,
int role)
const
88 case Qt::TextAlignmentRole:
89 return static_cast<int>(Qt::AlignCenter);
90 case Qt::ForegroundRole:
91 if(Qt::Horizontal == orientation)
93 int day = section + m_FirstDay;
96 if(Qt::Saturday == day || Qt::Sunday == day)
100 case Qt::BackgroundRole:
102 QPalette palette = QApplication::style()->standardPalette();
103#if QT_VERSION >= QT_VERSION_CHECK(5, 13, 0)
104 return palette.window();
106 return palette.background();
109 case Qt::DisplayRole:
110 switch (orientation) {
113 int day = section + m_FirstDay;
116 return m_Locale.dayName(day, QLocale::NarrowFormat);
119 QDate date = dateForCell(section, columnForDayOfWeek(Qt::Monday));
121 return date.weekNumber();
133bool CLunarCalendarModel::setHeaderData(
int section, Qt::Orientation orientation,
const QVariant &value,
int role)
135 if (value != headerData(section, orientation, role)) {
136 return QAbstractTableModel::setHeaderData(section, orientation, value, role);
137 emit headerDataChanged(orientation, section, section);
143int CLunarCalendarModel::rowCount(
const QModelIndex &parent)
const
145 if (parent.isValid())
150int CLunarCalendarModel::columnCount(
const QModelIndex &parent)
const
152 if (parent.isValid())
154 return m_ColumnCount;
165 if (!index.isValid())
168 int row = index.row();
169 int column = index.column();
170 QDate d = dateForCell(row, column);
175 case Qt::TextAlignmentRole:
176 return static_cast<int>(Qt::AlignCenter);
177 case Qt::DisplayRole:
179 case ROLE::SolarRole:
181 case ROLE::SolarColorRole:
183 if(d.month() != m_ShownMonth
185 return _COLOR_ROLE::ColorDisable;
187 if(d.dayOfWeek() == Qt::Saturday
188 || Qt::Sunday == d.dayOfWeek()
190 || !GetDay(row, column).SolarHoliday.isEmpty())
191 return _COLOR_ROLE::ColorHighlight;
193 return _COLOR_ROLE::ColorNormal;
195 case ROLE::SolarFontRole:
196 if(GetDay(row, column).SolarHoliday.isEmpty())
197 return _FONT_ROLE::FontNormal;
199 return _FONT_ROLE::FontBold;
200 case ROLE::TodayRole:
201 return d == QDate::currentDate();
202 case ROLE::LunarColorRole:
204 if(d.month() != m_ShownMonth
206 return _COLOR_ROLE::ColorDisable;
208 if(GetDay(row, column).LunarHoliday.isEmpty())
209 return _COLOR_ROLE::ColorNormal;
211 return _COLOR_ROLE::ColorHighlight;
213 case ROLE::LunarFontRole:
215 if(GetDay(row, column).LunarHoliday.isEmpty())
216 return _FONT_ROLE::FontNormal;
218 return _FONT_ROLE::FontBold;
220 case ROLE::LunarRole:
223 _DAY day = GetDay(row, column);
224 if(!day.SolarHoliday.isEmpty()) {
225 foreach(
auto h, day.SolarHoliday) {
226 if(!h.isEmpty() &&
"" != h)
230 if(!day.LunarHoliday.isEmpty()) {
231 foreach (
auto h, day.LunarHoliday) {
232 if(!h.isEmpty() &&
"" != h)
236 if(!day.Tasks.isEmpty()) {
237 foreach (
auto h, day.Tasks) {
238 if(!h.isEmpty() &&
"" != h)
242 return day.szLunarDay;
244 case Qt::ToolTipRole:
250 if(!m_bEnableToolTip)
255 _DAY day = GetDay(row, column);
256 szTip = d.toString(m_Locale.dateFormat(QLocale::LongFormat));
257 szTip +=
"\n" + day.szLunar;
259 if(!day.SolarHoliday.isEmpty()) {
260 foreach(
auto h, day.SolarHoliday) {
261 if(h.isEmpty() ||
"" == h)
263 if(nCounts > nTotals)
265 if(nCounts == nTotals)
275 if(!day.LunarHoliday.isEmpty()) {
276 foreach (
auto h, day.LunarHoliday) {
277 if(h.isEmpty() ||
"" == h)
279 if(nCounts > nTotals)
281 if(nCounts == nTotals)
291 if(!day.Tasks.isEmpty()) {
292 foreach (
auto h, day.Tasks) {
293 if(h.isEmpty() ||
"" == h)
295 if(nCounts > nTotals)
297 if(nCounts == nTotals)
314 _DAY day = GetDay(row, column);
315 return day.TaskCounts + day.Tasks.size();
317 case ROLE::TasksColorRole:
318 if(d.month() != m_ShownMonth
320 return _COLOR_ROLE::ColorDisable;
321 return _COLOR_ROLE::ColorHighlight;
322 case ROLE::BackgroupImage:
323 return GetDay(row, column).szImageBackgroup;
324 case ROLE::WorkDayRole:
326 switch(GetDay(row, column).WorkDay)
328 case __WORK_DAY::WORK:
330 case __WORK_DAY::REST:
337 case ROLE::WorkDayColorRole:
338 if(d.month() != m_ShownMonth
340 return _COLOR_ROLE::ColorDisable;
341 if(__WORK_DAY::WORK == GetDay(row, column).WorkDay)
342 return _COLOR_ROLE::ColorHighlight;
348 return _COLOR_ROLE::ColorNormal;
349 case ROLE::CalendarTypeRole:
350 return static_cast<int>(GetCalendarType());
358bool CLunarCalendarModel::setData(
const QModelIndex &index,
const QVariant &value,
int role)
361 if (
data(index, role) == value)
363 qDebug(Logger) << role << value <<
"value is same.";
368 case ROLE::CalendarTypeRole:
372 return QAbstractTableModel::setData(index, value, role);
377Qt::ItemFlags CLunarCalendarModel::flags(
const QModelIndex &index)
const
379 if (!index.isValid())
380 return Qt::NoItemFlags;
381 QDate date = dateForCell(index.row(), index.column());
383 return QAbstractTableModel::flags(index);
384 if (date < m_MinimumDate)
385 return Qt::NoItemFlags;
386 if (date > m_MaximumDate)
387 return Qt::NoItemFlags;
388 return QAbstractTableModel::flags(index);
391int CLunarCalendarModel::showWeek(
int year,
int week,
bool bForce)
393 if (m_ShownYear == year && m_ShowWeek == week && !bForce)
400int CLunarCalendarModel::showMonth(
int year,
int month,
bool bForce)
402 if (m_ShownYear == year && m_ShownMonth == month && !bForce)
406 m_ShownMonth = month;
415int CLunarCalendarModel::slotUpdate()
423 m_RowCount = WeeksOfMonth();
432 for(
int col = 0; col < 7; col++)
436 d = dateForCell(row, col);
442 if(m_bEnableHolidays) {
443 auto szHoliday = GetHoliday(d);
444 if(!szHoliday.isEmpty())
445 day.SolarHoliday << szHoliday;
450 if(
static_cast<int>(m_calendarType)
454 day.nLunarMonth = lunar.GetMonth();
455 day.nLunarDay = lunar.GetDay();
456 day.szLunar = lunar.GetLunar();
457 day.szLunarDay = lunar.GetLunarDay();
459 if(m_bEnableHolidays){
461 if(12 == day.nLunarMonth && 29 <= day.nLunarDay) {
463 if(1 == l.GetMonth())
464 day.LunarHoliday <<
"除夕";
466 auto szLunarHoliday = GetLunarHoliday(lunar.GetMonth(), lunar.GetDay());
467 if(!szLunarHoliday.isEmpty())
468 day.LunarHoliday << szLunarHoliday;
470 if(m_bEnableSolarTerm && !lunar.GetJieQi().isEmpty()) {
471 day.LunarHoliday << lunar.GetJieQi();
474 day.szImageBackgroup = lunar.GetJieQiImage();
478 day.TaskCounts += m_GetTaskHandler->onHandle(d, day.Tasks);
482 day.TaskCounts += m_cbTaskHandler(d, day.Tasks);
485 day.WorkDay = GetChineseHolidays(d);
486 m_Day.push_back(day);
492 }
while(d.isValid());
499const int CLunarCalendarModel::GetShowYear()
const
504const int CLunarCalendarModel::GetShowMonth()
const
509const int CLunarCalendarModel::GetShowWeek()
const
514int CLunarCalendarModel::setDate(
const QDate &d)
519 if (m_Date < m_MinimumDate)
520 m_Date = m_MinimumDate;
521 else if (m_Date > m_MaximumDate)
522 m_Date = m_MaximumDate;
532int CLunarCalendarModel::SetMinimumDate(
const QDate &d)
534 if (!d.isValid() || d == m_MinimumDate)
538 if (m_MaximumDate < m_MinimumDate)
539 m_MaximumDate = m_MinimumDate;
540 if (m_Date < m_MinimumDate)
541 m_Date = m_MinimumDate;
547const QDate CLunarCalendarModel::GetMinimumDate()
const
549 return m_MinimumDate;
552int CLunarCalendarModel::SetMaximumDate(
const QDate &d)
554 if (!d.isValid() || d == m_MaximumDate)
558 if (m_MinimumDate > m_MaximumDate)
559 m_MinimumDate = m_MaximumDate;
560 if (m_Date > m_MaximumDate)
561 m_Date = m_MaximumDate;
566const QDate CLunarCalendarModel::GetMaximumDate()
const
568 return m_MaximumDate;
571const Qt::DayOfWeek CLunarCalendarModel::firstDayOfWeek()
const
581int CLunarCalendarModel::setRange(
const QDate &min,
const QDate &max)
585 if (m_MinimumDate > m_MaximumDate)
586 qSwap(m_MinimumDate, m_MaximumDate);
587 if (m_Date < m_MinimumDate)
588 m_Date = m_MinimumDate;
589 if (m_Date > m_MaximumDate)
590 m_Date = m_MaximumDate;
595const QDate CLunarCalendarModel::GetDate()
const
600void CLunarCalendarModel::internalUpdate()
602 QModelIndex begin = index(0, 0);
603 QModelIndex end = index(m_RowCount - 1, m_ColumnCount - 1);
604 emit dataChanged(begin, end);
605 emit headerDataChanged(Qt::Vertical, 0, m_RowCount - 1);
606 emit headerDataChanged(Qt::Horizontal, 0, m_ColumnCount - 1);
609const QDate CLunarCalendarModel::dateForCell(
int row,
int column)
const
611 switch (m_viewType) {
613 return dateForCellMonth(row, column);
615 return dateForCellWeek(row, column);
620const QDate CLunarCalendarModel::dateForCellMonth(
int row,
int column)
const
622 if (row < 0 || row > m_RowCount - 1
623 || column < 0 || column > m_ColumnCount - 1)
625 const QDate refDate = firstDateMonth();
626 if (!refDate.isValid())
629 const int columnForFirstOfShownMonth = columnForFirstOfMonth(refDate);
630 if (columnForFirstOfShownMonth < 0)
633 const int requestedDay = 7 * (row) + column - columnForFirstOfShownMonth - refDate.day() + 1;
634 return refDate.addDays(requestedDay);
637const QDate CLunarCalendarModel::dateForCellWeek(
int row,
int column)
const
639 if (row != 0 || column < 0 || column > m_ColumnCount - 1)
642 QDate firstOfYear(m_ShownYear, 1, 1);
645 int weeks = m_ShowWeek;
647 if(1 != firstOfYear.weekNumber(&year))
650 date = firstOfYear.addDays((weeks -1 )* 7);
651 int col = columnForDayOfWeek(
static_cast<Qt::DayOfWeek
>(date.dayOfWeek()));
652 QDate firstDayOfWeek = date.addDays(-col);
653 return firstDayOfWeek.addDays(column);
656void CLunarCalendarModel::cellForDate(
const QDate &date,
int *row,
int *column)
const
666 switch (m_viewType) {
668 return cellForDateMonth(date, row, column);
670 return cellForDateWeek(date, row, column);
674void CLunarCalendarModel::cellForDateMonth(
const QDate &date,
int *row,
int *column)
const
684 const QDate refDate = firstDateMonth();
685 if (!refDate.isValid())
688 const int columnForFirstOfShownMonth = columnForFirstOfMonth(refDate);
689 const int requestedPosition = refDate.daysTo(date) + columnForFirstOfShownMonth + refDate.day() - 1;
691 int c = requestedPosition % 7;
692 int r = requestedPosition / 7;
698 if (columnForFirstOfShownMonth < 0)
701 if (r < 0 || r > m_RowCount - 1 || c < 0 || c > m_ColumnCount - 1)
710void CLunarCalendarModel::cellForDateWeek(
const QDate &date,
int *row,
int *column)
const
721 int weeks = date.weekNumber(&year);
722 if(weeks != m_ShowWeek)
724 if(date.year() != m_ShownYear && date.year() != year)
728 *column = columnForDayOfWeek(
static_cast<Qt::DayOfWeek
>(date.dayOfWeek()));
743const QDate CLunarCalendarModel::firstDateMonth()
const
746 while (refDay <= 31) {
747 QDate refDate(m_ShownYear, m_ShownMonth, refDay);
748 if (refDate.isValid())
755const QDate CLunarCalendarModel::endDateMonth()
const
760 QDate date(m_ShownYear, m_ShownMonth, day);
768const int CLunarCalendarModel::WeeksOfMonth()
const
770 if(1 == m_ShownMonth)
773 firstDateMonth().weekNumber(&y);
774 if(firstDateMonth().year() != y)
775 return endDateMonth().weekNumber() + 1;
777 if(12 == m_ShownMonth)
784 QDate d(m_ShownYear, m_ShownMonth, day);
800 return date.weekNumber() - firstDateMonth().weekNumber() + 1 + 1;
803 return endDateMonth().weekNumber() - firstDateMonth().weekNumber() + 1;
806const int CLunarCalendarModel::GetWeeksOfYear(
int year)
const
808 QDate date(year, 1, 1);
809 QDate endDate = date.addDays(date.daysInYear());
811 int nWeeks = endDate.weekNumber(&y);
813 nWeeks = endDate.addDays(-7).weekNumber();
817const int CLunarCalendarModel::columnForFirstOfMonth(
const QDate &date)
const
819 return (columnForDayOfWeek(
static_cast<Qt::DayOfWeek
>(date.dayOfWeek()))
820 - (date.day() % 7) + 8) % 7;
823const int CLunarCalendarModel::columnForDayOfWeek(Qt::DayOfWeek day)
const
825 if (day < 1 ||
unsigned(day) >
unsigned(7))
827 int column =
static_cast<int>(day) -
static_cast<int>(m_FirstDay);
833const QTextCharFormat CLunarCalendarModel::formatForCell(QDate d,
int row,
int col)
const
835 QTextCharFormat format;
836 QPalette pal = QApplication::style()->standardPalette();
837 QPalette::ColorGroup cg = QPalette::Active;
839 if(d.month() != m_ShownMonth)
841 cg = QPalette::Disabled;
844 format.setBackground(pal.brush(cg, QPalette::Window));
845 format.setForeground(pal.brush(cg, QPalette::Text));
847 if(d.dayOfWeek() == Qt::Saturday
848 || Qt::Sunday == d.dayOfWeek()
849 || d == QDate::currentDate()
850 || !GetDay(row, col).SolarHoliday.isEmpty())
852 format.setForeground(QBrush(GetHeight()));
854 if(!GetDay(row, col).SolarHoliday.isEmpty())
856 QFont font = format.font();
858 format.setFont(font);
863const QColor CLunarCalendarModel::GetHeight()
const
866 QPalette pal = QApplication::style()->standardPalette();
867 QPalette::ColorGroup cg = QPalette::Active;
868 return pal.color(cg, QPalette::Highlight);
871bool CLunarCalendarModel::EnableHolidays(
bool bEnable)
873 bool old = m_bEnableHolidays;
874 m_bEnableHolidays = bEnable;
878bool CLunarCalendarModel::EnableSolarTerm(
bool bEnable)
880 bool old = m_bEnableSolarTerm;
881 m_bEnableSolarTerm = bEnable;
885int CLunarCalendarModel::SetTaskHandle(QSharedPointer<CLunarCalendar::CTaskHandler> handler)
887 m_GetTaskHandler = handler;
895int CLunarCalendarModel::SetTaskHandle(
896 std::function<uint (
const QDate &,
897 QStringList &)> cbHandler)
899 m_cbTaskHandler = cbHandler;
904CLunarCalendarModel::_DAY CLunarCalendarModel::GetDay(
int row,
int col)
const
906 return m_Day[row * 7 + col];
923 m_calendarType = type;
928void CLunarCalendarModel::EnableToolTip(
bool enable) {
929 m_bEnableToolTip = enable;
934 return m_calendarType;
937int CLunarCalendarModel::InitHoliday()
970int CLunarCalendarModel::OpenDatabase()
973 QString szDatabaseFile;
974 szDatabaseFile = RabbitCommon::CDir::Instance()->GetDirUserDatabase()
975 + QDir::separator() +
"holidays.sqlite";
976 m_Database = QSqlDatabase::addDatabase(
"QSQLITE");
977 m_Database.setDatabaseName(szDatabaseFile);
979 if(d.exists(szDatabaseFile))
980 qDebug(LogDB) <<
"Database file is exists:" << szDatabaseFile;
983 qDebug(LogDB) <<
"Database file isn't exists:" << szDatabaseFile;
984 if(!m_Database.open())
986 qCritical(LogDB) <<
"Open database fail:" << m_Database.lastError()
987 <<
"database file: " << szDatabaseFile;
988 return m_Database.lastError().type();
991 nRet = InitTableHolidays();
993 nRet = InitTableChineseHolidays();
998 if(!m_Database.open())
1000 qCritical(LogDB) <<
"Open datebase fail. database name:"
1001 << m_Database.databaseName()
1002 <<
"database file:" << szDatabaseFile;
1009int CLunarCalendarModel::ExecSqlFile(
const QString& szFile)
1011 QFile sqlFile(szFile);
1012 if(!sqlFile.open(QFile::ReadOnly))
1014 qCritical(LogDB) <<
"Open sql file fail:" << szFile;
1018 QSqlQuery query(m_Database);
1019 QString szSql(sqlFile.readAll());
1020 QStringList sql = szSql.split(
";");
1021 for(
int i = 0; i < sql.size(); i++)
1023 qDebug(LogDB) <<
"sql:" << sql[i];
1024 if(!query.exec(sql[i])
1025 && m_Database.lastError().type() != QSqlError::NoError)
1027 qCritical(LogDB) <<
"Exec sql fail:" << m_Database.lastError();
1038int CLunarCalendarModel::InitTableHolidays()
1040 if(!m_Database.isOpen())
1042 qCritical(LogDB) <<
"The database isn't open." << m_Database.databaseName();
1046 QString szSqlFile =
":/database/Holidays";
1047#if !(defined (_DEBUG) || defined(DEBUG))
1048 szSqlFile = RabbitCommon::CDir::Instance()->GetDirUserDatabase()
1049 + QDir::separator() +
"holidays.sql";
1050 if(!QFile::exists(szSqlFile))
1052 QFile file(RabbitCommon::CDir::Instance()->GetDirDatabase(
true)
1053 + QDir::separator() +
"holidays.sql");
1054 if(file.copy(szSqlFile))
1055 qInfo(Logger) <<
"Copy holidays sql file success. from"
1056 << file.fileName() <<
"to" << szSqlFile;
1058 qCritical(Logger) <<
"Copy holidays sql file fail. from"
1059 << file.fileName() <<
"to" << szSqlFile;
1063 return ExecSqlFile(szSqlFile);
1069int CLunarCalendarModel::InitTableChineseHolidays()
1071 if(!m_Database.isOpen())
1073 qCritical(LogDB) <<
"The database isn't open." << m_Database.databaseName();
1077 QString szSqlFile =
":/database/ChineseHolidays";
1078#if !(defined (_DEBUG) || defined(DEBUG))
1079 szSqlFile = RabbitCommon::CDir::Instance()->GetDirUserDatabase()
1080 + QDir::separator() +
"chinese_holidays.sql";
1081 if(!QFile::exists(szSqlFile))
1083 QFile file(RabbitCommon::CDir::Instance()->GetDirDatabase(
true)
1084 + QDir::separator() +
"chinese_holidays.sql");
1085 if(file.copy(szSqlFile))
1086 qInfo(Logger) <<
"Copy chinese holidays sql file success. from"
1087 << file.fileName() <<
"to" << szSqlFile;
1089 qCritical(Logger) <<
"Copy chinese holidays sql file fail. from"
1090 << file.fileName() <<
"to" << szSqlFile;
1094 return ExecSqlFile(szSqlFile);
1097void CLunarCalendarModel::CheckUpdateChineseHolidaysTable()
1100 QString szNativeSqlFile = RabbitCommon::CDir::Instance()->GetDirUserDatabase()
1101 + QDir::separator() +
"chinese_holidays.sql";
1103 QFile sqlNative(szNativeSqlFile);
1106 if(m_ChineseHolidaysSql.size() == 0)
1109 if(!m_ChineseHolidaysSql.isOpen())
1110 if(!m_ChineseHolidaysSql.open(QIODevice::ReadOnly))
1112 qCritical(LogDB) <<
"Open update sql file fail."
1113 << m_ChineseHolidaysSql.fileName();
1117 QCryptographicHash md5Update(QCryptographicHash::Md5);
1118 if(!md5Update.addData(&m_ChineseHolidaysSql))
1120 qCritical(Logger) <<
"Update sql file md5sum fail";
1124 if(!sqlNative.isOpen())
1125 if(!sqlNative.open(QIODevice::ReadOnly))
1127 qCritical(LogDB) <<
"Open native sql file fail."
1128 << sqlNative.fileName();
1133 QCryptographicHash md5Native(QCryptographicHash::Md5);
1134 if(md5Native.addData(&sqlNative))
1136 if(md5Update.result() == md5Native.result())
1138 qInfo(Logger) <<
"The files is same:"
1139 << sqlNative.fileName()
1140 << m_ChineseHolidaysSql.fileName();
1147 if(sqlNative.isOpen())
1149 if(m_ChineseHolidaysSql.isOpen())
1150 m_ChineseHolidaysSql.close();
1154 qDebug(Logger) <<
"Update chinese_holidays.sql:"
1155 << sqlNative.fileName() <<
"from"
1156 << m_ChineseHolidaysSql.fileName();
1158 if(QFile::exists(szNativeSqlFile))
1159 QFile::remove(szNativeSqlFile);
1160 if(m_ChineseHolidaysSql.copy(szNativeSqlFile))
1161 qInfo(Logger) <<
"Update chinese_holidays.sql success. from"
1162 << m_ChineseHolidaysSql.fileName()
1163 <<
"to" << sqlNative.fileName();
1165 qCritical(Logger) <<
"Update chinese_holidays.sql fail. from"
1166 << m_ChineseHolidaysSql.fileName()
1167 <<
"to" << sqlNative.fileName();
1169 InitTableChineseHolidays();
1172void CLunarCalendarModel::slotDownloadChineseHolidaysSqlFileError(
int nErr,
const QString szError)
1174 qCritical(Logger) <<
"Download chinese holidays sql file error:" << nErr << szError;
1175 QString szMsg = szError;
1176 if(szMsg.isEmpty()) szMsg = tr(
"Download chinese holidays sql file fail");
1177 m_ChineseHolidaysSql.close();
1180void CLunarCalendarModel::slotDownloadChineseHolidaysSqlFileFinished(
const QString szFile)
1182 if(m_ChineseHolidaysSql.isOpen())
1183 m_ChineseHolidaysSql.close();
1185 QString f = m_ChineseHolidaysSql.fileName();
1186 if(QFile::exists(f))
1188 if(QFile::rename(szFile, f))
1189 qInfo(Logger) <<
"Download chinese_holidays.sql success: rename"
1190 << szFile <<
"to" << f;
1192 qCritical(Logger) <<
"Download chinese_holidays.sql success. but rename fail from"
1193 << szFile <<
"to" << f;
1194 CheckUpdateChineseHolidaysTable();
1198int CLunarCalendarModel::DownloadChineseHolidaysSqlFile(
const QVector<QUrl> &urls)
1202 if(m_ChineseHolidaysSql.isOpen())
1203 m_ChineseHolidaysSql.close();
1206 m_DownloadChineseHolidaysSql = QSharedPointer<RabbitCommon::CDownload>(
1207 new RabbitCommon::CDownload());
1208 bool check = connect(m_DownloadChineseHolidaysSql.data(), SIGNAL(sigFinished(
const QString)),
1209 this, SLOT(slotDownloadChineseHolidaysSqlFileFinished(
const QString)));
1211 check = connect(m_DownloadChineseHolidaysSql.data(), SIGNAL(sigError(
int,
const QString)),
1212 this, SLOT(slotDownloadChineseHolidaysSqlFileError(
int,
const QString)));
1214 m_DownloadChineseHolidaysSql->Start(urls);
1219CLunarCalendarModel::__WORK_DAY CLunarCalendarModel::GetChineseHolidays(
const QDate &d)
1221 __WORK_DAY day = __WORK_DAY::NO;
1222 if(!m_Database.isOpen())
1224 qWarning(LogDB) <<
"The dababase isn't open."
1225 << m_Database.databaseName();
1229 QSqlQuery query(m_Database);
1230 QString szSql =
"select * from chinese_holidays where date='"
1231 + d.toString(
"yyyy-MM-dd") +
"'";
1233 if(query.exec(szSql))
1237 QVariant v = query.value(
"iswork");
1242 day = __WORK_DAY::WORK;
1244 day = __WORK_DAY::REST;
1248 qCritical(LogDB) <<
"Get chinese holiday fail."
1249 << query.lastError() << szSql;
1254const QStringList CLunarCalendarModel::GetHoliday(
const QDate &d)
const
1256 QStringList lstHolidays;
1257 if(!m_Database.isOpen())
1259 qWarning(LogDB) <<
"The dababase isn't open."
1260 << m_Database.databaseName();
1261 return QStringList();
1265 QSqlQuery query(m_Database);
1266 QString szSql =
"select * from holiday_filter where table_name='holidays'";
1268 if(query.exec(szSql))
1272 QVariant v = query.value(
"filter");
1275 szFilter = v.toString();
1279 qWarning(LogDB) <<
"Get holiday filter fail."
1280 << query.lastError() << szSql;
1282 szSql =
"select * from holidays where month="
1283 + QString::number(d.month())
1284 +
" and day=" + QString::number(d.day());
1285 if(!szFilter.isEmpty())
1286 szSql +=
" " + szFilter;
1288 if(query.exec(szSql))
1292 QVariant v = query.value(
"name");
1295 QString szHoliday = v.toString();
1296 if(!szHoliday.isEmpty())
1297 lstHolidays << szHoliday;
1301 qCritical(LogDB) <<
"Get holiday fail."
1302 << query.lastError() << szSql;
1307const QStringList CLunarCalendarModel::GetLunarHoliday(
int month,
int day)
const
1309 QStringList lstHolidays;
1310 if(!m_Database.isOpen())
1312 qWarning(LogDB) <<
"The dababase isn't open."
1313 << m_Database.databaseName();
1314 return QStringList();
1318 QSqlQuery query(m_Database);
1319 QString szSql =
"select * from holiday_filter where table_name='holidays_lunar'";
1321 if(query.exec(szSql))
1325 QVariant v = query.value(
"filter");
1328 szFilter = v.toString();
1332 qWarning(LogDB) <<
"Get holiday filter fail."
1333 << query.lastError() << szSql;
1334 szSql =
"select * from holidays_lunar where month="
1335 + QString::number(month)
1336 +
" and day=" + QString::number(day);
1337 if(!szFilter.isEmpty())
1338 szSql +=
" " + szFilter;
1340 if(query.exec(szSql))
1344 QVariant v = query.value(
"name");
1347 QString szHoliday = v.toString();
1348 if(!szHoliday.isEmpty())
1349 lstHolidays << szHoliday;
1353 qCritical(LogDB) <<
"Get lunar holiday fail."
1354 << query.lastError() << szSql;
1359int CLunarCalendarModel::DownloadHolidaysSqlFile(
const QVector<QUrl> &urls)
1363 if(m_ChineseHolidaysSql.isOpen())
1364 m_ChineseHolidaysSql.close();
1367 m_DownloadHolidaysSql = QSharedPointer<RabbitCommon::CDownload>(
1368 new RabbitCommon::CDownload());
1369 bool check = connect(m_DownloadHolidaysSql.data(), SIGNAL(sigFinished(
const QString)),
1370 this, SLOT(slotDownloadHolidaysSqlFileFinished(
const QString)));
1372 check = connect(m_DownloadHolidaysSql.data(), SIGNAL(sigError(
int,
const QString)),
1373 this, SLOT(slotDownloadHolidaysSqlFileError(
int,
const QString)));
1375 m_DownloadHolidaysSql->Start(urls);
1380void CLunarCalendarModel::slotDownloadHolidaysSqlFileError(
int nErr,
const QString szError)
1382 qCritical(Logger) <<
"Download holidays sql file error:" << nErr << szError;
1383 QString szMsg = szError;
1384 if(szMsg.isEmpty()) szMsg = tr(
"Download holidays sql file fail");
1385 m_ChineseHolidaysSql.close();
1388void CLunarCalendarModel::slotDownloadHolidaysSqlFileFinished(
const QString szFile)
1390 if(m_ChineseHolidaysSql.isOpen())
1391 m_ChineseHolidaysSql.close();
1393 QString f = m_ChineseHolidaysSql.fileName();
1394 if(QFile::exists(f))
1396 if(QFile::rename(szFile, f))
1397 qInfo(Logger) <<
"Download holidays.sql success: rename"
1398 << szFile <<
"to" << f;
1400 qCritical(Logger) <<
"Download holidays.sql success. but rename fail from"
1401 << szFile <<
"to" << f;
1402 CheckUpdateHolidaysTable();
1406void CLunarCalendarModel::CheckUpdateHolidaysTable()
1409 QString szNativeSqlFile = RabbitCommon::CDir::Instance()->GetDirUserDatabase()
1410 + QDir::separator() +
"holidays.sql";
1412 QFile sqlNative(szNativeSqlFile);
1415 if(m_HolidaysSql.size() == 0)
1418 if(!m_HolidaysSql.isOpen())
1419 if(!m_HolidaysSql.open(QIODevice::ReadOnly))
1421 qCritical(LogDB) <<
"Open update sql file fail."
1422 << m_HolidaysSql.fileName();
1426 QCryptographicHash md5Update(QCryptographicHash::Md5);
1427 if(!md5Update.addData(&m_HolidaysSql))
1429 qCritical(Logger) <<
"Update sql file md5sum fail";
1433 if(!sqlNative.isOpen())
1434 if(!sqlNative.open(QIODevice::ReadOnly))
1436 qCritical(LogDB) <<
"Open native sql file fail."
1437 << sqlNative.fileName();
1442 QCryptographicHash md5Native(QCryptographicHash::Md5);
1443 if(md5Native.addData(&sqlNative))
1445 if(md5Update.result() == md5Native.result())
1447 qInfo(Logger) <<
"The files is same:"
1448 << sqlNative.fileName()
1449 << m_HolidaysSql.fileName();
1456 if(sqlNative.isOpen())
1458 if(m_HolidaysSql.isOpen())
1459 m_HolidaysSql.close();
1463 qDebug(Logger) <<
"Update holidays.sql:"
1464 << sqlNative.fileName() <<
"from"
1465 << m_HolidaysSql.fileName();
1467 if(QFile::exists(szNativeSqlFile))
1468 QFile::remove(szNativeSqlFile);
1469 if(m_HolidaysSql.copy(szNativeSqlFile))
1470 qInfo(Logger) <<
"Update holidays.sql success. from"
1471 << m_HolidaysSql.fileName()
1472 <<
"to" << sqlNative.fileName();
1474 qCritical(Logger) <<
"Update holidays.sql fail. from"
1475 << m_HolidaysSql.fileName()
1476 <<
"to" << sqlNative.fileName();
1478 InitTableHolidays();
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const override
得到数据