2024-01-30 14:35:04 +08:00
/*
*
* Copyright ( C ) 2023 , KylinSoft Co . , Ltd .
*
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation , either version 3 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program . If not , see < https : //www.gnu.org/licenses/>.
*
*/
2022-06-28 11:20:36 +08:00
# include "app-info-table.h"
# include "app-info-table-private.h"
2022-07-12 11:26:03 +08:00
# include "app-info-dbus-argument.h"
2022-06-28 11:20:36 +08:00
2022-06-13 13:38:47 +08:00
# include <QDebug>
# include <QtGlobal>
# include <string>
# include <QStandardPaths>
# include <QProcess>
# include <QDBusInterface>
# include <QDBusReply>
2022-07-12 11:26:03 +08:00
# include <QDBusMetaType>
2022-06-13 13:38:47 +08:00
# include <QFileInfo>
# include <QTime>
# include <QSqlQuery>
# include <QSqlError>
2023-03-07 17:33:08 +08:00
# include <mutex>
# include <QFile>
# include <application-property-helper.h>
2022-06-13 13:38:47 +08:00
2022-03-01 17:39:53 +08:00
using namespace UkuiSearch ;
2023-03-07 17:33:08 +08:00
static std : : once_flag flag ;
static AppInfoTable * global_intance = nullptr ;
2022-06-28 11:20:36 +08:00
2022-10-19 17:11:05 +08:00
AppInfoTablePrivate : : AppInfoTablePrivate ( AppInfoTable * parent ) : QObject ( parent ) , q ( parent ) , m_database ( new QSqlDatabase ( ) )
2022-06-13 13:38:47 +08:00
{
2022-07-12 11:26:03 +08:00
//dbus接收数据库信号
2023-11-27 11:20:16 +08:00
qRegisterMetaType < UkuiSearch : : ApplicationProperty : : Property > ( " ApplicationProperty::Property " ) ;
qRegisterMetaType < UkuiSearch : : ApplicationInfoMap > ( " ApplicationInfoMap " ) ;
qRegisterMetaType < UkuiSearch : : ApplicationPropertyMap > ( " ApplicationPropertyMap " ) ;
qDBusRegisterMetaType < UkuiSearch : : ApplicationProperty : : Property > ( ) ;
2023-03-15 16:39:38 +08:00
qDBusRegisterMetaType < ApplicationPropertyMap > ( ) ;
2023-03-14 14:01:28 +08:00
qDBusRegisterMetaType < ApplicationInfoMap > ( ) ;
2022-07-12 11:26:03 +08:00
m_signalTransInterface = new QDBusInterface ( " com.ukui.search.appdb.service " ,
" /org/ukui/search/appDataBase/signalTransformer " ,
" org.ukui.search.signalTransformer " ) ;
if ( ! m_signalTransInterface - > isValid ( ) ) {
2023-12-04 16:49:52 +08:00
qCritical ( ) < < " Create signalTransformer Interface Failed Because: " < < QDBusConnection : : sessionBus ( ) . lastError ( ) ;
2022-06-28 11:20:36 +08:00
return ;
} else {
2023-03-14 14:01:28 +08:00
connect ( m_signalTransInterface , SIGNAL ( appDBItemsUpdate ( ApplicationInfoMap ) ) , this , SLOT ( sendAppDBItemsUpdate ( ApplicationInfoMap ) ) ) ;
connect ( m_signalTransInterface , SIGNAL ( appDBItemsUpdateAll ( QStringList ) ) , this , SLOT ( sendAppDBItemsUpdateAll ( QStringList ) ) ) ;
connect ( m_signalTransInterface , SIGNAL ( appDBItemsAdd ( QStringList ) ) , this , SLOT ( sendAppDBItemsAdd ( QStringList ) ) ) ;
2022-07-12 11:26:03 +08:00
connect ( m_signalTransInterface , SIGNAL ( appDBItemsDelete ( QStringList ) ) , this , SLOT ( sendAppDBItemsDelete ( QStringList ) ) ) ;
2022-06-28 11:20:36 +08:00
}
2022-07-12 11:26:03 +08:00
//使用dbus操作数据库获取数据
m_appDBInterface = new QDBusInterface ( " com.ukui.search.appdb.service " ,
" /org/ukui/search/appDataBase/dbManager " ,
" org.ukui.search.appDBManager " ) ;
2022-06-13 13:38:47 +08:00
while ( 1 ) {
srand ( QTime ( 0 , 0 , 0 ) . secsTo ( QTime : : currentTime ( ) ) ) ;
m_ConnectionName = QString : : fromStdString ( std : : to_string ( rand ( ) ) ) ; //随机生产链接
if ( ! QSqlDatabase : : contains ( m_ConnectionName ) )
break ;
}
qDebug ( ) < < " App info database currunt connection name: " < < m_ConnectionName ;
2022-06-23 10:12:02 +08:00
if ( ! this - > openDataBase ( ) ) {
Q_EMIT q - > DBOpenFailed ( ) ;
2022-10-19 17:11:05 +08:00
qWarning ( ) < < " Fail to open App DataBase, because: " < < m_database - > lastError ( ) ;
2022-06-23 10:12:02 +08:00
}
2022-06-13 13:38:47 +08:00
}
2023-03-31 17:24:06 +08:00
void AppInfoTablePrivate : : setAppFavoritesState ( const QString & desktopfp )
2022-06-13 13:38:47 +08:00
{
2023-03-31 17:24:06 +08:00
m_appDBInterface - > call ( " updateFavoritesState " , desktopfp ) ;
2022-06-13 13:38:47 +08:00
}
2023-03-31 17:24:06 +08:00
void AppInfoTablePrivate : : setAppFavoritesState ( const QString & desktopfp , uint num )
2022-06-13 13:38:47 +08:00
{
2023-03-31 17:24:06 +08:00
m_appDBInterface - > call ( " updateFavoritesState " , desktopfp , num ) ;
2022-06-13 13:38:47 +08:00
}
2023-03-31 17:24:06 +08:00
void AppInfoTablePrivate : : setAppTopState ( const QString & desktopfp )
2022-06-13 13:38:47 +08:00
{
2023-03-31 17:24:06 +08:00
m_appDBInterface - > call ( " updateTopState " , desktopfp ) ;
2022-06-28 11:20:36 +08:00
}
2023-03-31 17:24:06 +08:00
void AppInfoTablePrivate : : setAppTopState ( const QString & desktopfp , uint num )
2022-06-28 11:20:36 +08:00
{
2023-03-31 17:24:06 +08:00
m_appDBInterface - > call ( " updateTopState " , desktopfp , num ) ;
2022-06-13 13:38:47 +08:00
}
2023-04-14 13:45:05 +08:00
void AppInfoTablePrivate : : setAppLaunchedState ( const QString & desktopFilePath , bool launched )
{
ApplicationInfoMap infoMap ;
infoMap [ desktopFilePath ] . insert ( ApplicationProperty : : Launched , launched ) ;
QVariant var ;
var . setValue ( infoMap ) ;
m_appDBInterface - > call ( " setValue " , var ) ;
}
2022-06-13 13:38:47 +08:00
bool AppInfoTablePrivate : : searchInstallApp ( QString & keyWord , QStringList & installAppInfoRes )
{
bool res ( true ) ;
2022-10-19 17:11:05 +08:00
if ( m_database - > transaction ( ) ) {
QSqlQuery sql ( * m_database ) ;
2022-06-13 13:38:47 +08:00
QString cmd ;
if ( keyWord . size ( ) < 2 ) {
2022-07-12 11:26:03 +08:00
cmd = QString ( " SELECT DESKTOP_FILE_PATH,LOCAL_NAME,ICON FROM APPINFO WHERE LOCAL_NAME OR NAME_EN OR NAME_ZH OR FIRST_LETTER_OF_PINYIN LIKE '%%0%' ORDER BY FAVORITES DESC " )
2022-06-13 13:38:47 +08:00
. arg ( keyWord ) ;
} else {
2022-07-12 11:26:03 +08:00
cmd = QString ( " SELECT DESKTOP_FILE_PATH,LOCAL_NAME,ICON FROM APPINFO WHERE LOCAL_NAME OR NAME_EN OR NAME_ZH OR PINYIN_NAME OR FIRST_LETTER_OF_PINYIN LIKE '%%0%' ORDER BY FAVORITES DESC " )
2022-06-13 13:38:47 +08:00
. arg ( keyWord ) ;
}
if ( sql . exec ( cmd ) ) {
while ( sql . next ( ) ) {
installAppInfoRes < < sql . value ( 0 ) . toString ( ) < < sql . value ( 1 ) . toString ( ) < < sql . value ( 2 ) . toString ( ) ;
}
} else {
2022-10-19 17:11:05 +08:00
qWarning ( ) < < QString ( " cmd %0 failed! " ) . arg ( cmd ) < < m_database - > lastError ( ) ;
2022-06-13 13:38:47 +08:00
res = false ;
}
2022-10-19 17:11:05 +08:00
if ( ! m_database - > commit ( ) ) {
2022-06-13 13:38:47 +08:00
qWarning ( ) < < " Failed to commit ! " < < cmd ;
2022-10-19 17:11:05 +08:00
m_database - > rollback ( ) ;
2022-06-13 13:38:47 +08:00
res = false ;
}
} else {
qWarning ( ) < < " Failed to start transaction mode!!! " ;
res = false ;
}
return res ;
}
bool AppInfoTablePrivate : : searchInstallApp ( QStringList & keyWord , QStringList & installAppInfoRes )
{
bool res ( true ) ;
2024-01-04 17:16:45 +08:00
if ( m_database - > transaction ( ) or ! keyWord . isEmpty ( ) ) {
2022-10-19 17:11:05 +08:00
QSqlQuery sql ( * m_database ) ;
2022-06-13 13:38:47 +08:00
QString cmd ;
if ( keyWord . at ( 0 ) . size ( ) < 2 ) {
2022-07-12 11:26:03 +08:00
cmd = QString ( " SELECT DESKTOP_FILE_PATH,LOCAL_NAME,ICON,NAME_EN,NAME_ZH,FIRST_LETTER_OF_PINYIN FROM APPINFO "
2022-06-13 13:38:47 +08:00
" WHERE LOCAL_NAME LIKE '%%0%' OR NAME_EN LIKE '%%0%' OR NAME_ZH LIKE '%%0%' OR FIRST_LETTER_OF_PINYIN LIKE '%%0%' " )
. arg ( keyWord . at ( 0 ) ) ;
} else {
2022-07-12 11:26:03 +08:00
cmd = QString ( " SELECT DESKTOP_FILE_PATH,LOCAL_NAME,ICON,NAME_EN,NAME_ZH,FIRST_LETTER_OF_PINYIN FROM APPINFO "
2022-06-13 13:38:47 +08:00
" WHERE LOCAL_NAME LIKE '%%0%' OR NAME_EN LIKE '%%0%' OR NAME_ZH LIKE '%%0%' OR PINYIN_NAME LIKE '%%0%' OR FIRST_LETTER_OF_PINYIN LIKE '%%0%' " )
. arg ( keyWord . at ( 0 ) ) ;
}
for ( int i = 0 ; + + i < keyWord . size ( ) ; ) {
if ( keyWord . at ( i ) . size ( ) < 2 ) {
cmd + = QString ( " AND (LOCAL_NAME LIKE '%%1%' OR NAME_EN LIKE '%%1%' OR NAME_ZH LIKE '%%1%' OR FIRST_LETTER_OF_PINYIN LIKE '%%1%') " )
. arg ( keyWord . at ( i ) ) ;
} else {
cmd + = QString ( " AND (LOCAL_NAME LIKE '%%1%' OR NAME_EN LIKE '%%1%' OR NAME_ZH LIKE '%%1%' OR PINYIN_NAME LIKE '%%1%' OR FIRST_LETTER_OF_PINYIN LIKE '%%1%') " )
. arg ( keyWord . at ( i ) ) ;
}
}
cmd + = QString ( " ORDER BY LENGTH(LOCAL_NAME) " ) ;
if ( sql . exec ( cmd ) ) {
while ( sql . next ( ) ) {
installAppInfoRes < < sql . value ( 0 ) . toString ( ) < < sql . value ( 1 ) . toString ( ) < < sql . value ( 2 ) . toString ( ) ;
}
} else {
2022-10-19 17:11:05 +08:00
qWarning ( ) < < QString ( " cmd %0 failed! " ) . arg ( cmd ) < < m_database - > lastError ( ) ;
2022-06-13 13:38:47 +08:00
res = false ;
}
2022-10-19 17:11:05 +08:00
if ( ! m_database - > commit ( ) ) {
2022-06-13 13:38:47 +08:00
qWarning ( ) < < " Failed to commit ! " < < cmd ;
2022-10-19 17:11:05 +08:00
m_database - > rollback ( ) ;
2022-06-13 13:38:47 +08:00
res = false ;
}
} else {
qWarning ( ) < < " Failed to start transaction mode!!! keyword size: " < < keyWord . size ( ) ;
res = false ;
}
return res ;
}
QString AppInfoTablePrivate : : lastError ( ) const
{
2022-10-19 17:11:05 +08:00
return m_database - > lastError ( ) . text ( ) ;
2022-06-13 13:38:47 +08:00
}
2023-04-17 16:14:44 +08:00
bool AppInfoTablePrivate : : tranPidToDesktopFp ( uint pid , QString & desktopfp )
2023-02-17 15:55:10 +08:00
{
QDBusReply < QString > reply = m_appDBInterface - > call ( " tranPidToDesktopFp " , pid ) ;
if ( reply . isValid ( ) ) {
desktopfp = reply . value ( ) ;
return true ;
} else {
qDebug ( ) < < m_appDBInterface - > lastError ( ) ;
return false ;
}
}
2023-08-08 17:00:31 +08:00
bool AppInfoTablePrivate : : tranWinIdToDesktopFilePath ( const QVariant & winId , QString & desktopfp )
{
QDBusReply < QString > reply = m_appDBInterface - > call ( " tranWinIdToDesktopFilePath " , QVariant : : fromValue ( QDBusVariant ( winId ) ) ) ;
if ( reply . isValid ( ) ) {
desktopfp = reply . value ( ) ;
return true ;
} else {
qDebug ( ) < < m_appDBInterface - > lastError ( ) ;
return false ;
}
}
2023-04-17 16:14:44 +08:00
bool AppInfoTablePrivate : : desktopFilePathFromName ( const QString & desktopFileName , QString & desktopFilePath )
{
QDBusReply < QString > reply = m_appDBInterface - > call ( " desktopFilePathFromName " , desktopFileName ) ;
if ( reply . isValid ( ) ) {
desktopFilePath = reply . value ( ) ;
return true ;
} else {
qDebug ( ) < < m_appDBInterface - > lastError ( ) ;
return false ;
}
}
2023-03-14 16:06:37 +08:00
bool AppInfoTablePrivate : : setAppLaunchTimes ( const QString & desktopfp , size_t num )
2022-06-28 14:00:57 +08:00
{
bool res ( true ) ;
2022-10-19 17:11:05 +08:00
if ( m_database - > transaction ( ) ) {
QSqlQuery sql ( * m_database ) ;
2022-06-28 14:00:57 +08:00
QString cmd = QString ( " UPDATE appInfo SET MODIFYED_TIME='%0', LAUNCH_TIMES=%1, LAUNCHED=%2 WHERE DESKTOP_FILE_PATH='%3' " )
. arg ( QDateTime : : currentDateTime ( ) . toString ( " yyyy-MM-dd hh:mm:ss " ) )
. arg ( num )
. arg ( 1 )
. arg ( desktopfp ) ;
if ( ! sql . exec ( cmd ) ) {
2022-10-19 17:11:05 +08:00
qWarning ( ) < < " Set app favorites state failed! " < < m_database - > lastError ( ) ;
2022-06-28 14:00:57 +08:00
res = false ;
}
2022-10-19 17:11:05 +08:00
if ( ! m_database - > commit ( ) ) {
2022-06-28 14:00:57 +08:00
qWarning ( ) < < " Failed to commit ! " < < cmd ;
2022-10-19 17:11:05 +08:00
m_database - > rollback ( ) ;
2022-06-28 14:00:57 +08:00
res = false ;
}
} else {
qWarning ( ) < < " Failed to start transaction mode!!! " ;
res = false ;
}
return res ;
}
2023-03-14 16:06:37 +08:00
bool AppInfoTablePrivate : : updateAppLaunchTimes ( const QString & desktopfp )
2022-06-28 14:00:57 +08:00
{
bool res ( true ) ;
2022-10-19 17:11:05 +08:00
if ( m_database - > transaction ( ) ) {
QSqlQuery sql ( * m_database ) ;
2022-07-12 11:26:03 +08:00
QString cmd = QString ( " SELECT LAUNCH_TIMES FROM APPINFO WHERE DESKTOP_FILE_PATH='%1' " ) . arg ( desktopfp ) ;
2022-06-28 14:00:57 +08:00
if ( sql . exec ( cmd ) ) {
if ( sql . next ( ) ) {
cmd = QString ( " UPDATE appInfo SET MODIFYED_TIME='%0', LAUNCH_TIMES=%1, LAUNCHED=%2 WHERE DESKTOP_FILE_PATH='%3' " )
. arg ( QDateTime : : currentDateTime ( ) . toString ( " yyyy-MM-dd hh:mm:ss " ) )
. arg ( sql . value ( 0 ) . toInt ( ) + 1 )
. arg ( 1 )
. arg ( desktopfp ) ;
if ( ! sql . exec ( cmd ) ) {
2022-10-19 17:11:05 +08:00
qWarning ( ) < < " Set app favorites state failed! " < < m_database - > lastError ( ) ;
2022-06-28 14:00:57 +08:00
res = false ;
}
} else {
qWarning ( ) < < " Failed to exec next! " < < cmd ;
res = false ;
}
} else {
qWarning ( ) < < " Failed to exec: " < < cmd ;
res = false ;
}
2022-10-19 17:11:05 +08:00
if ( ! m_database - > commit ( ) ) {
2022-06-28 14:00:57 +08:00
qWarning ( ) < < " Failed to commit ! " < < cmd ;
2022-10-19 17:11:05 +08:00
m_database - > rollback ( ) ;
2022-06-28 14:00:57 +08:00
res = false ;
}
} else {
qWarning ( ) < < " Failed to start transaction mode!!! " ;
res = false ;
}
return res ;
}
2023-03-14 16:06:37 +08:00
bool AppInfoTablePrivate : : setAppLockState ( const QString & desktopfp , size_t num )
2022-06-28 14:00:57 +08:00
{
bool res ( true ) ;
2022-10-19 17:11:05 +08:00
if ( m_database - > transaction ( ) ) {
QSqlQuery sql ( * m_database ) ;
2022-06-28 14:00:57 +08:00
QString cmd = QString ( " UPDATE appInfo SET MODIFYED_TIME='%0', LOCK=%1 WHERE DESKTOP_FILE_PATH='%2' " )
. arg ( QDateTime : : currentDateTime ( ) . toString ( " yyyy-MM-dd hh:mm:ss " ) )
. arg ( num )
. arg ( desktopfp ) ;
if ( ! sql . exec ( cmd ) ) {
2022-10-19 17:11:05 +08:00
qWarning ( ) < < " Set app favorites state failed! " < < m_database - > lastError ( ) ;
2022-06-28 14:00:57 +08:00
res = false ;
}
2022-10-19 17:11:05 +08:00
if ( ! m_database - > commit ( ) ) {
2022-06-28 14:00:57 +08:00
qWarning ( ) < < " Failed to commit ! " < < cmd ;
2022-10-19 17:11:05 +08:00
m_database - > rollback ( ) ;
2022-06-28 14:00:57 +08:00
res = false ;
}
} else {
qWarning ( ) < < " Failed to start transaction mode!!! " ;
res = false ;
}
return res ;
}
2022-06-13 13:38:47 +08:00
AppInfoTablePrivate : : ~ AppInfoTablePrivate ( )
{
this - > closeDataBase ( ) ;
2022-10-19 17:11:05 +08:00
if ( m_signalTransInterface )
delete m_signalTransInterface ;
m_signalTransInterface = nullptr ;
if ( m_appDBInterface )
delete m_appDBInterface ;
m_appDBInterface = nullptr ;
2022-06-13 13:38:47 +08:00
}
2022-06-23 10:12:02 +08:00
bool AppInfoTablePrivate : : initDateBaseConnection ( )
2022-06-13 13:38:47 +08:00
{
2022-10-19 17:11:05 +08:00
m_database - > setDatabaseName ( APP_DATABASE_PATH + APP_DATABASE_NAME ) ;
if ( ! m_database - > open ( ) ) {
qWarning ( ) < < m_database - > lastError ( ) ;
2022-06-23 10:12:02 +08:00
return false ;
// QApplication::quit();
2022-06-13 13:38:47 +08:00
}
2022-06-23 10:12:02 +08:00
return true ;
2022-06-13 13:38:47 +08:00
}
2022-06-23 10:12:02 +08:00
bool AppInfoTablePrivate : : openDataBase ( )
2022-06-13 13:38:47 +08:00
{
2022-10-19 17:11:05 +08:00
* m_database = QSqlDatabase : : addDatabase ( " QSQLITE " , m_ConnectionName ) ;
m_database - > setDatabaseName ( APP_DATABASE_PATH + APP_DATABASE_NAME ) ;
2022-06-13 13:38:47 +08:00
2022-10-19 17:11:05 +08:00
if ( ! m_database - > open ( ) ) {
2022-06-23 10:12:02 +08:00
return false ;
2022-06-13 13:38:47 +08:00
}
2022-06-23 10:12:02 +08:00
return true ;
2022-06-13 13:38:47 +08:00
}
void AppInfoTablePrivate : : closeDataBase ( )
2022-03-01 17:39:53 +08:00
{
2022-10-19 17:11:05 +08:00
m_database - > close ( ) ;
delete m_database ;
m_database = nullptr ;
2022-06-13 13:38:47 +08:00
QSqlDatabase : : removeDatabase ( m_ConnectionName ) ;
2022-03-01 17:39:53 +08:00
}
2023-03-14 14:01:28 +08:00
void AppInfoTablePrivate : : sendAppDBItemsUpdate ( ApplicationInfoMap results )
2022-06-28 11:20:36 +08:00
{
Q_EMIT q - > appDBItems2BUpdate ( results ) ;
}
2023-03-14 14:01:28 +08:00
void AppInfoTablePrivate : : sendAppDBItemsUpdateAll ( QStringList desktopFilePaths )
2022-06-28 11:20:36 +08:00
{
2023-03-14 14:01:28 +08:00
Q_EMIT q - > appDBItems2BUpdateAll ( desktopFilePaths ) ;
2022-06-28 11:20:36 +08:00
}
2023-03-14 14:01:28 +08:00
void AppInfoTablePrivate : : sendAppDBItemsAdd ( QStringList desktopFilePaths )
2022-06-28 11:20:36 +08:00
{
2023-03-14 14:01:28 +08:00
Q_EMIT q - > appDBItems2BAdd ( desktopFilePaths ) ;
}
void AppInfoTablePrivate : : sendAppDBItemsDelete ( QStringList desktopFilePaths )
{
Q_EMIT q - > appDBItems2BDelete ( desktopFilePaths ) ;
2022-06-28 11:20:36 +08:00
}
2022-03-01 17:39:53 +08:00
AppInfoTable : : AppInfoTable ( QObject * parent ) : QObject ( parent ) , d ( new AppInfoTablePrivate ( this ) )
{
}
2022-06-13 13:38:47 +08:00
2024-01-04 17:16:45 +08:00
bool AppInfoTable : : query ( ApplicationPropertyMap & propertyMap , const QString & desktopFile , const ApplicationProperties & properties )
2023-03-07 17:33:08 +08:00
{
QString field ;
for ( const ApplicationProperty : : Property & pro : properties ) {
field . append ( ApplicationPropertyHelper ( pro ) . dataBaseField ( ) + " , " ) ;
}
field . remove ( field . length ( ) - 1 , 1 ) ;
2023-03-15 16:39:38 +08:00
if ( field . isEmpty ( ) ) {
return true ;
}
2023-03-07 17:33:08 +08:00
QSqlQuery query ( * d - > m_database ) ;
query . setForwardOnly ( true ) ;
query . prepare ( QString ( " SELECT %0 FROM APPINFO WHERE DESKTOP_FILE_PATH=:desktopFile " ) . arg ( field ) ) ;
query . bindValue ( " :desktopFile " , desktopFile ) ;
if ( ! query . exec ( ) ) {
qWarning ( ) < < d - > m_database - > lastError ( ) < < query . lastError ( ) ;
return false ;
}
while ( query . next ( ) ) {
for ( int i = 0 ; i < properties . size ( ) ; i + + ) {
propertyMap . insert ( properties . at ( i ) , query . value ( i ) ) ;
}
}
return true ;
}
2024-01-04 17:16:45 +08:00
bool AppInfoTable : : query ( ApplicationInfoMap & infoMap , const ApplicationProperties & properties )
2023-03-07 17:33:08 +08:00
{
2023-03-15 16:39:38 +08:00
QString field ;
2023-03-07 17:33:08 +08:00
for ( const ApplicationProperty : : Property & pro : properties ) {
2023-03-15 16:39:38 +08:00
field . append ( ApplicationPropertyHelper ( pro ) . dataBaseField ( ) + " , " ) ;
2023-03-07 17:33:08 +08:00
}
2023-03-15 16:39:38 +08:00
if ( ! properties . contains ( ApplicationProperty : : Property : : DesktopFilePath ) ) {
field . append ( ApplicationPropertyHelper ( ApplicationProperty : : Property : : DesktopFilePath ) . dataBaseField ( ) ) ;
} else if ( ! field . isEmpty ( ) ) {
field . remove ( field . length ( ) - 1 , 1 ) ;
}
2023-03-07 17:33:08 +08:00
QString sql = QString ( " SELECT %0 FROM APPINFO " ) . arg ( field ) ;
QSqlQuery query ( * d - > m_database ) ;
query . setForwardOnly ( true ) ;
if ( ! query . exec ( sql ) ) {
qWarning ( ) < < d - > m_database - > lastError ( ) < < sql ;
return false ;
}
while ( query . next ( ) ) {
2023-03-15 16:39:38 +08:00
ApplicationPropertyMap propertyMap ;
for ( const ApplicationProperty : : Property & pro : properties ) {
propertyMap . insert ( pro , query . value ( ApplicationPropertyHelper ( pro ) . dataBaseField ( ) ) ) ;
2023-03-07 17:33:08 +08:00
}
2023-03-15 16:39:38 +08:00
infoMap . insert ( query . value ( ApplicationPropertyHelper ( ApplicationProperty : : Property : : DesktopFilePath ) . dataBaseField ( ) ) . toString ( ) , propertyMap ) ;
2023-03-07 17:33:08 +08:00
}
return true ;
}
2024-01-04 17:16:45 +08:00
bool AppInfoTable : : query ( ApplicationInfoMap & infoMap , const ApplicationProperties & properties , const ApplicationPropertyMap & restrictions )
2022-06-13 13:38:47 +08:00
{
2023-03-15 16:39:38 +08:00
QString field ;
2023-03-14 14:01:28 +08:00
for ( const ApplicationProperty : : Property & pro : properties ) {
2023-03-15 16:39:38 +08:00
field . append ( ApplicationPropertyHelper ( pro ) . dataBaseField ( ) + " , " ) ;
}
if ( ! properties . contains ( ApplicationProperty : : Property : : DesktopFilePath ) ) {
field . append ( ApplicationPropertyHelper ( ApplicationProperty : : Property : : DesktopFilePath ) . dataBaseField ( ) ) ;
} else if ( ! field . isEmpty ( ) ) {
field . remove ( field . length ( ) - 1 , 1 ) ;
2023-03-14 14:01:28 +08:00
}
2022-06-13 13:38:47 +08:00
2023-03-14 14:01:28 +08:00
QString condition ;
for ( const ApplicationProperty : : Property prop : restrictions . keys ( ) ) {
2023-03-14 16:06:37 +08:00
condition . append ( ApplicationPropertyHelper ( prop ) . dataBaseField ( ) + " =? AND " ) ;
2023-03-14 14:01:28 +08:00
}
2023-03-14 16:06:37 +08:00
condition = condition . left ( condition . lastIndexOf ( " AND " ) ) ;
2022-06-13 13:38:47 +08:00
2023-03-14 14:01:28 +08:00
QSqlQuery query ( * d - > m_database ) ;
query . setForwardOnly ( true ) ;
query . prepare ( QString ( " SELECT %0 FROM APPINFO WHERE %1 " )
. arg ( field )
. arg ( condition ) ) ;
int i = 0 ;
for ( const QVariant & conditionValue : restrictions ) {
query . bindValue ( i , conditionValue ) ;
i + + ;
}
if ( ! query . exec ( ) ) {
qWarning ( ) < < d - > m_database - > lastError ( ) < < query . lastError ( ) ;
return false ;
}
while ( query . next ( ) ) {
2023-03-15 16:39:38 +08:00
ApplicationPropertyMap propertyMap ;
for ( const ApplicationProperty : : Property & pro : properties ) {
propertyMap . insert ( pro , query . value ( ApplicationPropertyHelper ( pro ) . dataBaseField ( ) ) ) ;
2022-06-13 13:38:47 +08:00
2023-03-14 16:06:37 +08:00
}
2023-03-15 16:39:38 +08:00
infoMap . insert ( query . value ( ApplicationPropertyHelper ( ApplicationProperty : : Property : : DesktopFilePath ) . dataBaseField ( ) ) . toString ( ) , propertyMap ) ;
2023-03-14 16:06:37 +08:00
}
return true ;
}
2023-11-28 17:15:31 +08:00
bool AppInfoTable : : query ( ApplicationInfoMap & infoMap , const ApplicationProperties & properties , const QStringList & keywords , const ApplicationPropertyMap & restrictions )
2023-03-14 16:06:37 +08:00
{
2023-03-15 16:39:38 +08:00
QString field ;
2023-03-14 16:06:37 +08:00
for ( const ApplicationProperty : : Property & pro : properties ) {
2023-03-15 16:39:38 +08:00
field . append ( ApplicationPropertyHelper ( pro ) . dataBaseField ( ) + " , " ) ;
}
if ( ! properties . contains ( ApplicationProperty : : Property : : DesktopFilePath ) ) {
2023-11-28 17:15:31 +08:00
field . append ( ApplicationPropertyHelper ( ApplicationProperty : : Property : : DesktopFilePath ) . dataBaseField ( ) + " , " ) ;
2023-03-14 16:06:37 +08:00
}
2023-11-28 17:15:31 +08:00
field . append ( ApplicationPropertyHelper ( ApplicationProperty : : Property : : LocalKeywords ) . dataBaseField ( ) ) ;
2023-03-14 16:06:37 +08:00
QString condition ;
for ( const ApplicationProperty : : Property prop : restrictions . keys ( ) ) {
condition . append ( ApplicationPropertyHelper ( prop ) . dataBaseField ( ) + " =? AND " ) ;
}
2023-03-15 16:39:38 +08:00
QString keywordCondition ;
2023-11-28 17:15:31 +08:00
QString findWithLocalKeywords = " ((select count(*) from ( "
" WITH RECURSIVE split(str, rest) AS "
" ( "
" SELECT substr(LOCAL_KEYWORDS || ';', 1, instr(LOCAL_KEYWORDS || ';', ';') - 1), "
" substr(LOCAL_KEYWORDS || ';', instr(LOCAL_KEYWORDS || ';', ';') + 1) "
" UNION ALL "
" SELECT substr(rest, 1, instr(rest, ';') - 1), substr(rest, instr(rest, ';') + 1) "
" FROM split WHERE str <> '' "
" ) "
" SELECT str FROM split WHERE lower(str)=?)) <> 0) " ;
2023-03-15 16:39:38 +08:00
for ( const QString & keyword : keywords ) {
if ( keyword . size ( ) < 2 ) {
2024-06-11 14:11:38 +08:00
keywordCondition . append ( QString ( " (ifnull(LOCAL_NAME, '') like ? or ifnull(replace(LOCAL_NAME,' ',''), '') like ? or ifnull(NAME_EN, '') like ? or ifnull(replace(NAME_EN,' ',''), '') like ? or ifnull(NAME_ZH, '') like ? or ifnull(replace(NAME_ZH,' ',''), '') like ? or ifnull(FIRST_LETTER_OF_PINYIN, '') like ? or ifnull(replace(FIRST_LETTER_OF_PINYIN,' ',''), '') like ? or %0) AND " ) . arg ( findWithLocalKeywords ) ) ;
2023-03-14 16:06:37 +08:00
} else {
2024-06-11 14:11:38 +08:00
keywordCondition . append ( QString ( " (ifnull(LOCAL_NAME, '') like ? or ifnull(replace(LOCAL_NAME,' ',''), '') like ? or ifnull(NAME_EN, '') like ? or ifnull(replace(NAME_EN,' ',''), '') like ? or ifnull(NAME_ZH, '') like ? or ifnull(replace(NAME_ZH,' ',''), '') like ? or ifnull(FIRST_LETTER_OF_PINYIN, '') like ? or ifnull(replace(FIRST_LETTER_OF_PINYIN,' ',''), '') like ? or ifnull(PINYIN_NAME, '') like ? or ifnull(replace(PINYIN_NAME,' ',''), '') like ? or %0) AND " ) . arg ( findWithLocalKeywords ) ) ;
2023-03-14 16:06:37 +08:00
}
2023-03-14 14:01:28 +08:00
}
2023-03-15 16:39:38 +08:00
if ( ! keywordCondition . isEmpty ( ) ) {
keywordCondition . remove ( keywordCondition . length ( ) - 3 , 3 ) ;
}
2022-06-28 11:20:36 +08:00
2023-11-28 17:15:31 +08:00
QString sql = QString ( " SELECT %0 FROM APPINFO WHERE %1 %2 ORDER BY LENGTH(LOCAL_NAME) " ) . arg ( field , condition , keywordCondition ) ;
2023-03-14 14:01:28 +08:00
QSqlQuery query ( * d - > m_database ) ;
query . setForwardOnly ( true ) ;
2023-03-15 16:39:38 +08:00
query . prepare ( sql ) ;
2023-03-14 16:06:37 +08:00
int count = 0 ;
for ( const QVariant & conditionValue : restrictions ) {
query . bindValue ( count , conditionValue ) ;
count + + ;
}
2023-03-15 16:39:38 +08:00
for ( const QString & keyword : keywords ) {
2024-06-11 14:11:38 +08:00
int i = 11 ;
2023-03-15 16:39:38 +08:00
if ( keyword . size ( ) < 2 ) {
2024-06-11 14:11:38 +08:00
i = i - 2 ;
2023-03-15 16:39:38 +08:00
}
for ( int bindCount = 0 ; bindCount < i ; bindCount + + ) {
2023-11-28 17:15:31 +08:00
query . bindValue ( count , ( bindCount - i + 1 ) ? " % " + keyword + " % " : keyword . toLower ( ) ) ;
2023-03-15 16:39:38 +08:00
count + + ;
}
2023-03-14 16:06:37 +08:00
}
2023-03-14 14:01:28 +08:00
if ( ! query . exec ( ) ) {
2023-03-15 16:39:38 +08:00
qWarning ( ) < < d - > m_database - > lastError ( ) < < query . lastError ( ) < < query . lastQuery ( ) < < query . boundValues ( ) ;
2023-03-14 14:01:28 +08:00
return false ;
}
while ( query . next ( ) ) {
2023-03-15 16:39:38 +08:00
ApplicationPropertyMap propertyMap ;
for ( const ApplicationProperty : : Property & pro : properties ) {
propertyMap . insert ( pro , query . value ( ApplicationPropertyHelper ( pro ) . dataBaseField ( ) ) ) ;
2023-03-14 14:01:28 +08:00
}
2023-03-15 16:39:38 +08:00
infoMap . insert ( query . value ( ApplicationPropertyHelper ( ApplicationProperty : : Property : : DesktopFilePath ) . dataBaseField ( ) ) . toString ( ) , propertyMap ) ;
2023-03-14 14:01:28 +08:00
}
return true ;
2022-06-13 13:38:47 +08:00
}
2023-03-31 17:24:06 +08:00
void AppInfoTable : : setAppFavoritesState ( const QString & desktopfp )
{
return d - > setAppFavoritesState ( desktopfp ) ;
}
2023-03-14 16:06:37 +08:00
void AppInfoTable : : setAppFavoritesState ( const QString & desktopfp , size_t num )
2022-06-13 13:38:47 +08:00
{
2023-03-14 14:01:28 +08:00
return d - > setAppFavoritesState ( desktopfp , num ) ;
2022-06-13 13:38:47 +08:00
}
2023-03-14 16:06:37 +08:00
void AppInfoTable : : setAppTopState ( const QString & desktopfp , size_t num )
2022-06-13 13:38:47 +08:00
{
2023-03-14 14:01:28 +08:00
return d - > setAppTopState ( desktopfp , num ) ;
2022-06-13 13:38:47 +08:00
}
2023-04-14 13:45:05 +08:00
void AppInfoTable : : setAppLaunchedState ( const QString & desktopFilePath , bool launched )
{
return d - > setAppLaunchedState ( desktopFilePath , launched ) ;
}
2022-06-13 13:38:47 +08:00
2023-03-31 17:24:06 +08:00
void AppInfoTable : : setAppTopState ( const QString & desktopfp )
2022-06-13 13:38:47 +08:00
{
2023-03-31 17:24:06 +08:00
return d - > setAppTopState ( desktopfp ) ;
2022-06-13 13:38:47 +08:00
}
bool AppInfoTable : : searchInstallApp ( QString & keyWord , QStringList & installAppInfoRes )
{
return d - > searchInstallApp ( keyWord , installAppInfoRes ) ;
}
bool AppInfoTable : : searchInstallApp ( QStringList & keyWord , QStringList & installAppInfoRes )
{
return d - > searchInstallApp ( keyWord , installAppInfoRes ) ;
}
QString AppInfoTable : : lastError ( ) const
{
return d - > lastError ( ) ;
}
2022-06-28 14:00:57 +08:00
2023-04-17 16:14:44 +08:00
bool AppInfoTable : : tranPidToDesktopFp ( uint pid , QString & desktopfp )
2023-02-17 15:55:10 +08:00
{
return d - > tranPidToDesktopFp ( pid , desktopfp ) ;
}
2023-04-17 16:14:44 +08:00
bool AppInfoTable : : desktopFilePathFromName ( const QString & desktopFileName , QString & desktopFilePath )
{
return d - > desktopFilePathFromName ( desktopFileName , desktopFilePath ) ;
}
2023-08-08 17:00:31 +08:00
bool AppInfoTable : : tranWinIdToDesktopFilePath ( const QVariant & winId , QString & desktopfp )
{
return d - > tranWinIdToDesktopFilePath ( winId , desktopfp ) ;
}
2022-06-28 14:00:57 +08:00
//下面接口暂时没啥用,不外放。
2023-03-14 16:06:37 +08:00
bool AppInfoTable : : setAppLaunchTimes ( const QString & desktopfp , size_t num )
2022-06-28 14:00:57 +08:00
{
return d - > setAppLaunchTimes ( desktopfp , num ) ;
}
2023-03-14 16:06:37 +08:00
bool AppInfoTable : : updateAppLaunchTimes ( const QString & desktopfp )
2022-06-28 14:00:57 +08:00
{
return d - > updateAppLaunchTimes ( desktopfp ) ;
}
2023-03-14 16:06:37 +08:00
bool AppInfoTable : : setAppLockState ( const QString & desktopfp , size_t num )
2022-06-28 14:00:57 +08:00
{
return d - > setAppLockState ( desktopfp , num ) ;
}