kylin-music/UIControl/base/musicDataBase.cpp

2370 lines
82 KiB
C++
Raw Normal View History

2022-06-22 18:42:43 +08:00
#include "musicDataBase.h"
#include<iostream>
#include<QSqlQuery>
#include<QMessageBox>
#include<QApplication>
#include<QSqlError>
#include<QFileInfo>
#include<QDebug>
#include<QSqlRecord>
#include<QTime>
#include<sys/time.h>
MusicDataBase::MusicDataBase(QObject *parent) : QObject(parent)
{
qDebug() << QSqlDatabase::drivers();//当前环境支持哪些数据库
QMutexLocker lockData( &m_mutex); //加锁,函数执行完后自动解锁
m_database=QSqlDatabase::addDatabase("QSQLITE");
QString dirPath = QString(getenv("HOME")) + "/.config/.kylin_music_ver1.2_";
//TODO
QFileInfo oldVersion(QString(getenv("HOME")) + "/.config/.kylin_music_ver1.0_" + "mymusic.db");
if(oldVersion.exists())
{
//读取旧版本数据库内容,并添加至新版本数据库函数
qDebug() << "存在旧版本数据库" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
}
m_database.setDatabaseName(dirPath + "mymusic.db");
}
MusicDataBase::~MusicDataBase()
{
qDebug() << "析构";
if(true == m_databaseOpenFlag)
{
sqlite3_shutdown();
m_database.close();
}
}
MusicDataBase* MusicDataBase::getInstance()
{
static MusicDataBase *dbInstance = nullptr;
if (dbInstance == nullptr)
{
try
{
dbInstance = new MusicDataBase;
}
catch (const std::runtime_error &re)
{
qDebug() << "runtime_error:" << re.what();
}
}
return dbInstance;
}
int MusicDataBase::initDataBase()
{
if(!m_database.open())
{
m_databaseOpenFlag = true;
QMessageBox::warning(0, QObject::tr("Database Error"),
m_database.lastError().text());
return DB_UNCONNECT;
}
QVariant v = m_database.driver()->handle(); // 获得低级handle包
if(v.isValid() && qstrcmp(v.typeName(), "sqlite3*") == 0)
{
sqlite3_initialize();
// 显式地初始化一下。
sqlite3 *m_handle = *static_cast<sqlite3 **>(v.data());
if(m_handle)
{
sqlite3_enable_load_extension(m_handle, 1); //允许加载扩展
QSqlQuery loadExtension(m_database);
bool loadRes = loadExtension.exec("SELECT load_extension('libsimple')"); // 使用sql函数加载libsimple
if(!loadRes)
{
qDebug() << "无法加载分词器扩展" << loadExtension.lastError().text();
// 加载不成功先不return
}
}
}
bool queryRes = true;
QSqlQuery queryInit(m_database);
//新建表:总表,历史表,我喜欢表
queryRes &= queryInit.exec(QString("create table if not exists %1 ("
"id integer primary key autoincrement,"
"idIndex integer unique,"
"filepath varchar unique not NULL,"
"title varchar,"
"singer varchar,"
"album varchar,"
"filetype varchar,"
"size varchar,"
"time varchar)"
).arg(ALLMUSIC));//创建音乐总表自增id为主键index为唯一值插入歌曲时为空获取自增id值后赋值filepath为唯一值且不为空。
queryRes &= queryInit.exec(QString("create table if not exists %1 ("
"id integer primary key autoincrement,"
"idIndex integer unique,"
"filepath varchar unique not NULL,"
"title varchar,"
"singer varchar,"
"album varchar,"
"filetype varchar,"
"size varchar,"
"time varchar)"
).arg(HISTORY));//创建历史播放列表自增id为主键index为唯一值插入歌曲时为空获取自增id值后赋值filepath为唯一值且不为空。
queryRes &= queryInit.exec(QString("create table if not exists ListOfPlayList (title varchar primary key)"));//创建播放列表名称列表
queryRes &= queryInit.exec(QString("create virtual table if not exists AuxIndexLocalMusicContent"
" using fts5(id UNINDEXED, title, singer, album, filepath UNINDEXED, time UNINDEXED, tokenize='simple', prefix='1 2 3 4 5')"));
// 为localMusic本地音乐表创建辅助的全文索引虚拟表fts5设置前缀索引设置非索引项加载simple分词器包。
// queryRes &= queryInit.exec(QString("create trigger local_music_add after insert on LocalMusic begin"
// " insert into AuxIndexLocalMusicContent values(new.id, new.title); end"));
// 存在问题利用触发器插入时需要额外操作包括对新值处理从中文到拼音、从编码格式到不编码格式。即便表中存储的并非base64我们也需要处理从中文到拼音包括取old变量值到转换
// 废弃方案
queryRes &= queryInit.exec(QString("create trigger if not exists local_music_delete before delete on LocalMusic begin"
" delete from AuxIndexLocalMusicContent where id=old.id;"
" end"));
// 创建触发器根据id删除虚拟表记录
if(true == queryRes)
{
qDebug()<<"本地列表,历史列表,歌单表创建成功!";
//创建我喜欢列表
//先检查是否存在
int checkRes;
checkRes = checkPlayListExist(FAV);
if(LIST_NOT_FOUND == checkRes)//我喜欢列表不存在才创建
{
int createRes;
createRes = createNewPlayList(FAV);
return createRes;
}
else
{
return checkRes;
}
}
else
{
qDebug() << "初始化建表失败" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return CREATE_TABLE_FAILED;
}
}
int MusicDataBase::addMusicToLocalMusic(const musicDataStruct &fileData)
{
bool queryRes = true;
if(fileData.title.isEmpty() || fileData.filepath.isEmpty())
{
qDebug() << "无效入参" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return INVALID_INPUT;
}
else
{
if(true == m_database.isValid())
{
//查询历史列表中是否已有该歌曲,已有的话,返回添加失败
int checkLocalRes = checkIfSongExistsInLocalMusic(fileData.filepath);
//历史列表中已经有这首歌,重复添加了
if(DB_OP_SUCC == checkLocalRes)
{
qDebug() << "添加失败,重复添加" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return DB_OP_ADD_REPEAT;
}
QSqlQuery addSongToLocal(m_database);
QString addSongString = QString("insert into %1 (%2) values('%3','%4','%5','%6','%7','%8','%9')").
arg(ALLMUSIC).
arg(SHOWCONTEXTS).
arg(inPutStringHandle(fileData.filepath)).
arg(inPutStringHandle(fileData.title)).
arg(inPutStringHandle(fileData.singer)).
arg(inPutStringHandle(fileData.album)).
arg(inPutStringHandle(fileData.filetype)).
arg(inPutStringHandle(fileData.size)).
arg(inPutStringHandle(fileData.time));
queryRes &= addSongToLocal.exec(addSongString);
//插入歌曲时自增id和idIndex无法赋值插入后取得自增id给idIndex赋值
int tempIndex = addSongToLocal.lastInsertId().toInt();
bool setRes = true;
QSqlQuery setSongIDFromLocal(m_database);
QString setIndex = QString("update %1 set idIndex='%2' WHERE filepath='%3'")
.arg(ALLMUSIC)
.arg(tempIndex)
.arg(inPutStringHandle(fileData.filepath));
setRes &= setSongIDFromLocal.exec(setIndex);
// 每插入一条记录都要更新辅助的虚拟表AuxIndexLocalMusicContent
QSqlQuery addSongToIndexTable(m_database);
QString addSongIndex = QString("insert into AuxIndexLocalMusicContent(id,title,singer,album,filepath,time) values('%1', '%2', '%3', '%4', '%5', '%6')")
.arg(tempIndex)
.arg(preHandle(fileData.title),
preHandle(fileData.singer),
preHandle(fileData.album),
preHandle(fileData.filepath),
preHandle(fileData.time));
bool setVTableRes = addSongToIndexTable.exec(addSongIndex);
if(true == (queryRes&setRes&setVTableRes))
{
return DB_OP_SUCC;
}
else
{
qDebug() << "数据库操作失败,添加失败" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return DB_OP_ADD_FAILED;
}
}
else
{
return DB_UNCONNECT;
}
}
//如果是先添加至新建列表
//TODO
//添加至新建列表
}
int MusicDataBase::delMusicFromLocalMusic(const QString& filePath)
{
bool queryRes = true;
if(filePath.isEmpty())
{
qDebug() << "无效入参" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return INVALID_INPUT;
}
else
{
if(true == m_database.isValid())
{
int checkRes = checkIfSongExistsInLocalMusic(filePath);
if(checkRes == DB_OP_SUCC)
{
QSqlQuery delSongFromLocal(m_database);
QString delSongString = QString("delete from %1 where filepath = '%2'").
arg(ALLMUSIC).
arg(inPutStringHandle(filePath));
queryRes = delSongFromLocal.exec(delSongString);
if(true == queryRes)
{
return DB_OP_SUCC;
}
else
{
qDebug() << "数据库打开,删除失败!!!" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return DB_OP_DEL_FAILED;
}
}
else
{
return INVALID_INPUT;
}
}
else
{
qDebug() << "数据库无法打开,请重试!!!" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return DB_UNCONNECT;
}
}
}
int MusicDataBase::createNewPlayList(const QString& playListName)
{
if(playListName.isEmpty())
{
qDebug() << "无效入参" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return INVALID_INPUT;
}
if(true == m_database.isValid())
{
bool createRes = true;
// QMutexLocker lockData( &m_mutex); //加锁,函数执行完后自动解锁
QSqlQuery createNewPlayList(m_database);
QString createPlayListString = QString("create table if not exists 'playlist_%1' ("
"id integer primary key autoincrement,"
"idIndex integer unique,"
"filepath varchar unique not NULL,"
"title varchar,"
"singer varchar,"
"album varchar,"
"filetype varchar,"
"size varchar,"
"time varchar)").
arg(inPutStringHandle(playListName));//创建新建播放列表自增id为主键index为唯一值插入歌曲时为空获取自增id值后赋值filepath为唯一值且不为空。
createRes &= createNewPlayList.exec(createPlayListString);
if(true != createRes)
{
return CREATE_TABLE_FAILED;
}
QSqlQuery addPlayListToList(m_database);
QString addPlayListToListString = QString("insert into ListOfPlayList (title) values('%1')").
arg(inPutStringHandle(playListName));
createRes &= addPlayListToList.exec(addPlayListToListString);
if(true == createRes)
{
return DB_OP_SUCC;
}
else
{
qDebug() << "创建新歌单失败" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return CREATE_TABLE_FAILED;
}
}
else
{
return DB_UNCONNECT;
}
}
int MusicDataBase::delPlayList(const QString& playListName)
{
//入参检查
if(playListName.isEmpty() || playListName == FAV)
{
qDebug() << "无效入参" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return INVALID_INPUT;
}
if(true == m_database.isValid())
{
bool delRes = true;
QSqlQuery delPlayListFromList(m_database);
QString delPlayListFromListString = QString("delete from ListOfPlayList where title = '%1'").
arg(inPutStringHandle(playListName));
delRes &= delPlayListFromList.exec(delPlayListFromListString);
QSqlQuery delPlayList(m_database);
QString delPlayListString = QString("drop table if exists 'playlist_%1'"
).arg(inPutStringHandle(playListName));
delRes &= delPlayList.exec(delPlayListString);
if(true == delRes)
{
return DB_OP_SUCC;
}
else
{
return DEL_TABLE_FAILED;
}
}
else
{
return DB_UNCONNECT;
}
}
int MusicDataBase::getSongInfoFromLocalMusic(const QString& filePath, musicDataStruct &fileData)
{
if(filePath.isEmpty())
{
qDebug() << "入参无效" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return INVALID_INPUT;
}
if(true == m_database.isValid())
{
bool getRes = true;
QSqlQuery getSongFromLocalMusic(m_database);
QString getSongString = QString("select %1 from %2 where filepath = '%3'")
.arg(SHOWCONTEXTS)
.arg(ALLMUSIC)
.arg(inPutStringHandle(filePath));
getRes = getSongFromLocalMusic.exec(getSongString);
if(true == getRes)
{
if(getSongFromLocalMusic.next())
{
fileData.filepath = outPutStringHandle(getSongFromLocalMusic.value(0).toString());
fileData.title = outPutStringHandle(getSongFromLocalMusic.value(1).toString());
fileData.singer = outPutStringHandle(getSongFromLocalMusic.value(2).toString());
fileData.album = outPutStringHandle(getSongFromLocalMusic.value(3).toString());
fileData.filetype = outPutStringHandle(getSongFromLocalMusic.value(4).toString());
fileData.size = outPutStringHandle(getSongFromLocalMusic.value(5).toString());
fileData.time = outPutStringHandle(getSongFromLocalMusic.value(6).toString());
}
else
{
qDebug() << "数据库中查无此歌!" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return DB_DISORDERD;
}
return DB_OP_SUCC;
}
else
{
return DB_OP_GET_FAILED;
}
}
else
{
return DB_DISORDERD;
}
}
int MusicDataBase::getSongInfoListFromLocalMusic(QList<musicDataStruct>& resList)
{
if(true == m_database.isValid())
{
bool getRes = true;
QSqlQuery getSongListFromLocalMusic(m_database);
QString getSongListString = QString("select filepath from %1 order by idIndex").arg(ALLMUSIC);//按index排序返回给前端而非添加歌曲时的顺序
getRes = getSongListFromLocalMusic.exec(getSongListString);
if(true == getRes)
{
while(getSongListFromLocalMusic.next())
{
musicDataStruct temp;
temp.filepath = outPutStringHandle(getSongListFromLocalMusic.value(0).toString());
int curRes = getSongInfoFromLocalMusic(temp.filepath, temp);
if(DB_OP_SUCC == curRes)
{
resList.append(temp);
}
else
{
return curRes;
}
}
return DB_OP_SUCC;
}
else
{
return DB_OP_GET_FAILED;
}
}
else
{
return DB_DISORDERD;
}
}
int MusicDataBase::changeSongOrderInLocalMusic(const QString& selectFilePath, const QString& destinationFilePath)
{
//入参检查
if(selectFilePath.isEmpty() || destinationFilePath.isEmpty())
{
qDebug() << "入参为空" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return INVALID_INPUT;//入参为空
}
if(DB_OP_SUCC != checkIfSongExistsInLocalMusic(selectFilePath) || DB_OP_SUCC != checkIfSongExistsInLocalMusic(destinationFilePath))
{
qDebug() << "歌曲在歌曲总表中不存在" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return INVALID_INPUT;//歌曲在歌曲总表中不存在
}
if(selectFilePath == destinationFilePath)//位置没变化
{
qDebug() << "位置没变化,不用处理" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return DB_OP_SUCC;//位置没变化,不用处理
}
//获取歌曲的index信息
int oldIndex = 0, newIndex = 0;
int getRes1 = getSongIndexFromLocalMusic(selectFilePath, oldIndex);
int getRes2 = getSongIndexFromLocalMusic(destinationFilePath, newIndex);
if(getRes1 != DB_OP_SUCC)
{
qDebug() << "歌曲原INDEX获取失败" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return getRes1;
}
if(getRes2 != DB_OP_SUCC)
{
qDebug() << "目标歌曲INDEX获取失败" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return getRes2;
}
if(oldIndex < newIndex)//靠前的位置拖拽到了靠后的位置
{
bool setRes = true;
QSqlQuery setSongIndexFromLocal(m_database);
QString setIndex = QString("update %1 set idIndex=0 WHERE filepath='%2'")
.arg(ALLMUSIC)
.arg(inPutStringHandle(selectFilePath));
setRes &= setSongIndexFromLocal.exec(setIndex);
if(true == setRes)
{
bool getRes = true;
QSqlQuery getBetweenSongIndexFromLocal(m_database);
QString setIndexs = QString("select idIndex,filepath from %1 WHERE idIndex between '%2' and '%3'")
.arg(ALLMUSIC)
.arg(oldIndex)
.arg(newIndex);
getRes &= getBetweenSongIndexFromLocal.exec(setIndexs);
if(true == getRes)
{
bool updateIndexRes = true;
while(getBetweenSongIndexFromLocal.next())
{
int tempIndex = getBetweenSongIndexFromLocal.value(0).toInt();
QString tempFilepath = outPutStringHandle(getBetweenSongIndexFromLocal.value(1).toString());
QSqlQuery updateSongIndexFromLocal(m_database);
QString updateIndex = QString("update %1 set idIndex='%2' WHERE filepath='%3'")
.arg(ALLMUSIC)
.arg(tempIndex-1)
.arg(inPutStringHandle(tempFilepath));
updateIndexRes &= updateSongIndexFromLocal.exec(updateIndex);
}
if(true == updateIndexRes)
{
bool setRes2 = true;
QSqlQuery setSongIndexFromLocal2(m_database);
QString setIndex2 = QString("update %1 set idIndex='%2' WHERE filepath='%3'")
.arg(ALLMUSIC)
.arg(newIndex)
.arg(inPutStringHandle(selectFilePath));
setRes2 &= setSongIndexFromLocal2.exec(setIndex2);
if(true == setRes2)
{
return DB_OP_SUCC;
}
else
{
return LIST_REORDER_ERR;
}
}
else
{
return LIST_REORDER_ERR;
}
}
}
}
else if(oldIndex > newIndex)//靠后的位置拖拽到了靠前的位置
{
bool setRes = true;
QSqlQuery setSongIndexFromLocal(m_database);
QString setIndex = QString("update %1 set idIndex=0 WHERE filepath='%2'")
.arg(ALLMUSIC)
.arg(inPutStringHandle(selectFilePath));
setRes &= setSongIndexFromLocal.exec(setIndex);
if(true == setRes)
{
bool getRes = true;
QSqlQuery getBetweenSongIndexFromLocal(m_database);
QString setIndexs = QString("select idIndex,filepath from %1 WHERE idIndex between '%2' and '%3' order by idIndex desc")
.arg(ALLMUSIC)
.arg(newIndex+1)
.arg(oldIndex);
getRes &= getBetweenSongIndexFromLocal.exec(setIndexs);
if(true == getRes)
{
bool updateIndexRes = true;
while(getBetweenSongIndexFromLocal.next())
{
int tempIndex = getBetweenSongIndexFromLocal.value(0).toInt();
QString tempFilepath = outPutStringHandle(getBetweenSongIndexFromLocal.value(1).toString());
QSqlQuery updateSongIndexFromLocal(m_database);
QString updateIndex = QString("update %1 set idIndex='%2' WHERE filepath='%3'")
.arg(ALLMUSIC)
.arg(tempIndex+1)
.arg(inPutStringHandle(tempFilepath));
updateIndexRes &= updateSongIndexFromLocal.exec(updateIndex);
}
if(true == updateIndexRes)
{
bool setRes2 = true;
QSqlQuery setSongIndexFromLocal2(m_database);
QString setIndex2 = QString("update %1 set idIndex='%2' WHERE filepath='%3'")
.arg(ALLMUSIC)
.arg(newIndex+1)
.arg(inPutStringHandle(selectFilePath));
setRes2 &= setSongIndexFromLocal2.exec(setIndex2);
if(true == setRes2)
{
return DB_OP_SUCC;
}
else
{
return LIST_REORDER_ERR;
}
}
else
{
return LIST_REORDER_ERR;
}
}
}
}
else//位置没变
{
return DB_OP_SUCC;
}
}
int MusicDataBase::getSongInfoListFromLocalMusicByKeyword(QList<musicDataStruct> &resList, const QString &keyword)
{
// ph-code
if(true == keyword.isEmpty())
{
// 空keyword不处理
return INVALID_INPUT;
}
if(true == m_database.isValid())
{
bool getRes = true;
QSqlQuery getSongListFromLocalMusicByKeyword(m_database);
// QString getSongListStringByKeyword = QString("select * from LocalMusic where `id` in ("
// "select id from AuxIndexLocalMusicContent where AuxIndexLocalMusicContent match simple_query('%1') order by rank) ")
// .arg(keyword);
// 直接在虚表中存取不再根据id回表。
QString getSongListStringByKeyword = QString("select * from AuxIndexLocalMusicContent"
" where AuxIndexLocalMusicContent match simple_query('%1') order by rank")
.arg(keyword);
getRes = getSongListFromLocalMusicByKeyword.exec(getSongListStringByKeyword);
if(true == getRes)
{
while(getSongListFromLocalMusicByKeyword.next())
{
musicDataStruct temp;
temp.title = getSongListFromLocalMusicByKeyword.value(1).toString();
temp.singer = getSongListFromLocalMusicByKeyword.value(2).toString();
temp.album = getSongListFromLocalMusicByKeyword.value(3).toString();
temp.filepath = getSongListFromLocalMusicByKeyword.value(4).toString();
temp.time = getSongListFromLocalMusicByKeyword.value(5).toString();
resList.append(temp);
}
return DB_OP_SUCC;
}
else
{
qDebug() << "执行错误信息:" << getSongListFromLocalMusicByKeyword.lastError().text();
return DB_OP_GET_FAILED;
}
}
else
{
return DB_DISORDERD;
}
}
int MusicDataBase::getCurtEstimatedListByKeyword(const QString& keyword,
int Number,
QList<musicDataStruct>& titleSongsList,
QList<musicDataStruct>& singersList,
QList<musicDataStruct>& albumsList)
{
// qDebug() << "\n" << "====================" << "\n"
// << keyword
// << Number
// << "\n" << "====================" << "\n";
// Number = 99;
if(true == keyword.isEmpty())
{
// 空keyword不处理
return INVALID_INPUT;
}
if(true == m_database.isValid())
{
bool getTitle = true;
bool getSinger = true;
bool getAlbum = true;
QSqlQuery getCurtEstimatedTitleList(m_database);
QString getCurtEstimatedTitleListString = QString("select * from AuxIndexLocalMusicContent"
" where title match simple_query('%1') order by rank limit %2")
.arg(keyword, QString::number(Number));
getTitle &= getCurtEstimatedTitleList.exec(getCurtEstimatedTitleListString);
QSqlQuery getCurtEstimatedSingerList(m_database);
QString getCurtEstimatedSingerListString = QString("select * from AuxIndexLocalMusicContent"
" where singer match simple_query('%1') order by rank limit %2")
.arg(keyword, QString::number(Number));
getSinger &= getCurtEstimatedSingerList.exec(getCurtEstimatedSingerListString);
QSqlQuery getCurtEstimatedAlbumList(m_database);
QString getCurtEstimatedAlbumListString = QString("select * from AuxIndexLocalMusicContent"
" where album match simple_query('%1') order by rank limit %2")
.arg(keyword, QString::number(Number));
getAlbum &= getCurtEstimatedAlbumList.exec(getCurtEstimatedAlbumListString);
if(getTitle)
{
while(getCurtEstimatedTitleList.next())
{
musicDataStruct temp;
temp.title = getCurtEstimatedTitleList.value(1).toString();
temp.singer = getCurtEstimatedTitleList.value(2).toString();
temp.album = getCurtEstimatedTitleList.value(3).toString();
temp.filepath = getCurtEstimatedTitleList.value(4).toString();
temp.time = getCurtEstimatedTitleList.value(5).toString();
titleSongsList.append(temp);
}
}
else
{
qDebug() << "执行错误信息:" << getCurtEstimatedTitleList.lastError().text();
qDebug() << getCurtEstimatedTitleList.lastQuery();
}
if(getSinger)
{
while(getCurtEstimatedSingerList.next())
{
musicDataStruct temp;
temp.title = getCurtEstimatedSingerList.value(1).toString();
temp.singer = getCurtEstimatedSingerList.value(2).toString();
temp.album = getCurtEstimatedSingerList.value(3).toString();
temp.filepath = getCurtEstimatedSingerList.value(4).toString();
temp.time = getCurtEstimatedSingerList.value(5).toString();
singersList.append(temp);
}
}
else
{
qDebug() << "执行错误信息:" << getCurtEstimatedSingerList.lastError().text();
}
if(getAlbum)
{
while(getCurtEstimatedAlbumList.next())
{
musicDataStruct temp;
temp.title = getCurtEstimatedAlbumList.value(1).toString();
temp.singer = getCurtEstimatedAlbumList.value(2).toString();
temp.album = getCurtEstimatedAlbumList.value(3).toString();
temp.filepath = getCurtEstimatedAlbumList.value(4).toString();
temp.time = getCurtEstimatedAlbumList.value(5).toString();
albumsList.append(temp);
}
}
else
{
qDebug() << "执行错误信息:" << getCurtEstimatedAlbumList.lastError().text();
}
if(getTitle && getSinger && getAlbum)
{
return DB_OP_SUCC;
}
else
{
return DB_OP_GET_FAILED;
}
}
else
{
return DB_DISORDERD;
}
}
int MusicDataBase::getSongInfoListByAlbum(QList<musicDataStruct> &resList, const QString &album)
{
if(true == album.isEmpty())
{
return INVALID_INPUT;
}
if(true == m_database.isValid())
{
bool getRes = true;
QSqlQuery getSongsListByAlbum(m_database);
QString getSongsListByAlbumString = QString("select * from LocalMusic where album = '%1'").arg(inPutStringHandle(album));
getRes = getSongsListByAlbum.exec(getSongsListByAlbumString);
if(true == getRes)
{
while(getSongsListByAlbum.next())
{
musicDataStruct fileData;
fileData.filepath = outPutStringHandle(getSongsListByAlbum.value(2).toString());
fileData.title = outPutStringHandle(getSongsListByAlbum.value(3).toString());
fileData.singer = outPutStringHandle(getSongsListByAlbum.value(4).toString());
fileData.album = outPutStringHandle(getSongsListByAlbum.value(5).toString());
fileData.filetype = outPutStringHandle(getSongsListByAlbum.value(6).toString());
fileData.size = outPutStringHandle(getSongsListByAlbum.value(7).toString());
fileData.time = outPutStringHandle(getSongsListByAlbum.value(8).toString());
resList.append(fileData);
}
return DB_OP_SUCC;
}
else
{
qDebug() << "执行错误信息:" << getSongsListByAlbum.lastError().text();
return DB_OP_GET_FAILED;
}
}
else
{
return DB_DISORDERD;
}
}
int MusicDataBase::getSongInfoListBySinger(QList<musicDataStruct> &resList, const QString &singer)
{
if(true == singer.isEmpty())
{
return INVALID_INPUT;
}
if(true == m_database.isValid())
{
bool getRes = true;
QSqlQuery getSongsListBySinger(m_database);
QString getSongsListBySingerString = QString("select * from LocalMusic where singer = '%1'").arg(inPutStringHandle(singer));
getRes = getSongsListBySinger.exec(getSongsListBySingerString);
if(true == getRes)
{
while(getSongsListBySinger.next())
{
musicDataStruct fileData;
fileData.filepath = outPutStringHandle(getSongsListBySinger.value(2).toString());
fileData.title = outPutStringHandle(getSongsListBySinger.value(3).toString());
fileData.singer = outPutStringHandle(getSongsListBySinger.value(4).toString());
fileData.album = outPutStringHandle(getSongsListBySinger.value(5).toString());
fileData.filetype = outPutStringHandle(getSongsListBySinger.value(6).toString());
fileData.size = outPutStringHandle(getSongsListBySinger.value(7).toString());
fileData.time = outPutStringHandle(getSongsListBySinger.value(8).toString());
resList.append(fileData);
}
return DB_OP_SUCC;
}
else
{
qDebug() << "执行错误信息:" << getSongsListBySinger.lastError().text();
return DB_OP_GET_FAILED;
}
}
else
{
return DB_DISORDERD;
}
}
int MusicDataBase::getSongInfoFromPlayList(musicDataStruct &fileData, const QString& filePath,const QString& playListName)
{
if(filePath.isEmpty() || playListName.isEmpty())
{
qDebug() << "无效入参" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return INVALID_INPUT;
}
if(true == m_database.isValid())
{
int checkRes = checkPlayListExist(playListName);
if(checkRes == DB_OP_SUCC)
{
bool getRes = true;
QSqlQuery getplayList(m_database);
QString getplayListString = QString("select title from ListOfPlayList where title = '%1'").
arg(inPutStringHandle(playListName));
getRes = getplayList.exec(getplayListString);
if(false == getRes)
{
qDebug() << "歌单表中查询歌单失败" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return DB_OP_GET_FAILED;
}
if(getplayList.next())
{
QSqlQuery getSongFromPlayList(m_database);
QString getSongFromPlayListString = QString("select %1 from 'playlist_%2' where filepath = '%3'")
.arg(SHOWCONTEXTS)
.arg(inPutStringHandle(playListName))
.arg(inPutStringHandle(filePath));
getRes = getSongFromPlayList.exec(getSongFromPlayListString);
if(false == getRes)
{
return DB_OP_GET_FAILED;
}
if(getSongFromPlayList.next())
{
fileData.filepath = outPutStringHandle(getSongFromPlayList.value(0).toString());
fileData.title = outPutStringHandle(getSongFromPlayList.value(1).toString());
fileData.singer = outPutStringHandle(getSongFromPlayList.value(2).toString());
fileData.album = outPutStringHandle(getSongFromPlayList.value(3).toString());
fileData.filetype = outPutStringHandle(getSongFromPlayList.value(4).toString());
fileData.size = outPutStringHandle(getSongFromPlayList.value(5).toString());
fileData.time = outPutStringHandle(getSongFromPlayList.value(6).toString());
}
else
{
qDebug() << "歌单中未查询到歌曲" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return DB_OP_GET_FAILED;
}
return DB_OP_SUCC;
}
else
{
qDebug() << "歌单表中未查询到该歌单" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return PLAYLIST_UNFOUND;
}
}
else
{
return checkRes;
}
}
else
{
return DB_UNCONNECT;
}
}
int MusicDataBase::getSongInfoListFromPlayList(QList<musicDataStruct>& resList,const QString& playListName)
{
if(playListName.isEmpty())
{
qDebug() << "输入歌单名为空" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return INVALID_INPUT;
}
if(true == m_database.isValid())
{
int checkRes = checkPlayListExist(playListName);
if(checkRes == DB_OP_SUCC)
{
bool getRes = true;
resList.clear();
QSqlQuery getplayList(m_database);
QString getplayListString = QString("select title from ListOfPlayList where title = '%1'").
arg(inPutStringHandle(playListName));
getRes = getplayList.exec(getplayListString);
if(false == getRes)
{
qDebug() << "歌单表中查询歌单失败" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return DB_OP_GET_FAILED;
}
if(getplayList.next())
{
QSqlQuery getSongFromPlayList(m_database);
QString getSongFromPlayListString = QString("select %1 from 'playlist_%2' order by idIndex")
.arg(SHOWCONTEXTS)
.arg(inPutStringHandle(playListName));//按index排序返回给前端而非添加歌曲时的顺序
getRes = getSongFromPlayList.exec(getSongFromPlayListString);
if(true == getRes)
{
while(getSongFromPlayList.next())
{
musicDataStruct temp;
temp.filepath = outPutStringHandle(getSongFromPlayList.value(0).toString());
temp.title = outPutStringHandle(getSongFromPlayList.value(1).toString());
temp.singer = outPutStringHandle(getSongFromPlayList.value(2).toString());
temp.album = outPutStringHandle(getSongFromPlayList.value(3).toString());
temp.filetype = outPutStringHandle(getSongFromPlayList.value(4).toString());
temp.size = outPutStringHandle(getSongFromPlayList.value(5).toString());
temp.time = outPutStringHandle(getSongFromPlayList.value(6).toString());
resList.append(temp);
}
return DB_OP_SUCC;
}
else
{
return DB_OP_GET_FAILED;
}
}
else
{
return DB_DISORDERD;
}
}
else
{
return checkRes;
}
}
else
{
return DB_DISORDERD;
}
}
int MusicDataBase::changeSongOrderInPlayList(const QString& selectFilePath, const QString& destinationFilePath, const QString& playListName)
{
//入参检查
if(selectFilePath.isEmpty() || destinationFilePath.isEmpty() || playListName.isEmpty())
{
qDebug() << "入参为空" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return INVALID_INPUT;//入参为空
}
if(DB_OP_SUCC != checkPlayListExist(playListName))
{
qDebug() << "歌单在歌单表中不存在" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return INVALID_INPUT;//歌单在歌单表中不存在
}
if(DB_OP_SUCC != checkIfSongExistsInPlayList(selectFilePath, playListName)
|| DB_OP_SUCC != checkIfSongExistsInPlayList(destinationFilePath, playListName))
{
qDebug() << "歌曲在歌单表中不存在" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return INVALID_INPUT;//歌曲在歌单表中不存在
}
if(selectFilePath == destinationFilePath)//位置没变化
{
qDebug() << "位置没变化,不用处理" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return DB_OP_SUCC;//位置没变化,不用处理
}
//获取歌曲的index信息
int oldIndex = 0, newIndex = 0;
int getRes1 = getSongIndexFromPlayList(selectFilePath, playListName, oldIndex);
int getRes2 = getSongIndexFromPlayList(destinationFilePath, playListName, newIndex);
if(getRes1 != DB_OP_SUCC)
{
qDebug() << "歌曲原INDEX获取失败" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return getRes1;
}
if(getRes2 != DB_OP_SUCC)
{
qDebug() << "目标歌曲INDEX获取失败" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return getRes2;
}
if(oldIndex < newIndex)//靠前的位置拖拽到了靠后的位置
{
bool setRes = true;
QSqlQuery setSongIndexFromLocal(m_database);
QString setIndex = QString("update 'playlist_%1' set idIndex=0 WHERE filepath='%2'")
.arg(inPutStringHandle(playListName))
.arg(inPutStringHandle(selectFilePath));
setRes &= setSongIndexFromLocal.exec(setIndex);
if(true == setRes)
{
bool getRes = true;
QSqlQuery getBetweenSongIndexFromLocal(m_database);
QString setIndexs = QString("select idIndex,filepath from 'playlist_%1' WHERE idIndex between '%2' and '%3'")
.arg(inPutStringHandle(playListName)).arg(oldIndex).arg(newIndex);
getRes &= getBetweenSongIndexFromLocal.exec(setIndexs);
if(true == getRes)
{
bool updateIndexRes = true;
while(getBetweenSongIndexFromLocal.next())
{
int tempIndex = getBetweenSongIndexFromLocal.value(0).toInt();
QString tempFilepath = outPutStringHandle(getBetweenSongIndexFromLocal.value(1).toString());
QSqlQuery updateSongIndexFromLocal(m_database);
QString updateIndex = QString("update 'playlist_%1' set idIndex='%2' WHERE filepath='%3'")
.arg(inPutStringHandle(playListName)).arg(tempIndex-1).arg(inPutStringHandle(tempFilepath));
updateIndexRes &= updateSongIndexFromLocal.exec(updateIndex);
}
if(true == updateIndexRes)
{
bool setRes2 = true;
QSqlQuery setSongIndexFromLocal2(m_database);
QString setIndex2 = QString("update 'playlist_%1' set idIndex='%2' WHERE filepath='%3'")
.arg(inPutStringHandle(playListName)).arg(newIndex).arg(inPutStringHandle(selectFilePath));
setRes2 &= setSongIndexFromLocal2.exec(setIndex2);
if(true == setRes2)
{
return DB_OP_SUCC;
}
else
{
return LIST_REORDER_ERR;
}
}
else
{
return LIST_REORDER_ERR;
}
}
}
}
else if(oldIndex > newIndex)//靠后的位置拖拽到了靠前的位置
{
bool setRes = true;
QSqlQuery setSongIndexFromLocal(m_database);
QString setIndex = QString("update 'playlist_%1' set idIndex=0 WHERE filepath='%2'")
.arg(inPutStringHandle(playListName)).arg(inPutStringHandle(selectFilePath));
setRes &= setSongIndexFromLocal.exec(setIndex);
if(true == setRes)
{
bool getRes = true;
QSqlQuery getBetweenSongIndexFromLocal(m_database);
QString setIndexs = QString("select idIndex,filepath from 'playlist_%1' WHERE idIndex between '%2' and '%3' order by idIndex desc")
.arg(inPutStringHandle(playListName)).arg(newIndex+1).arg(oldIndex);
getRes &= getBetweenSongIndexFromLocal.exec(setIndexs);
if(true == getRes)
{
bool updateIndexRes = true;
while(getBetweenSongIndexFromLocal.next())
{
int tempIndex = getBetweenSongIndexFromLocal.value(0).toInt();
QString tempFilepath = outPutStringHandle(getBetweenSongIndexFromLocal.value(1).toString());
QSqlQuery updateSongIndexFromLocal(m_database);
QString updateIndex = QString("update 'playlist_%1' set idIndex='%2' WHERE filepath='%3'")
.arg(inPutStringHandle(playListName)).arg(tempIndex+1).arg(inPutStringHandle(tempFilepath));
updateIndexRes &= updateSongIndexFromLocal.exec(updateIndex);
}
if(true == updateIndexRes)
{
bool setRes2 = true;
QSqlQuery setSongIndexFromLocal2(m_database);
QString setIndex2 = QString("update 'playlist_%1' set idIndex='%2' WHERE filepath='%3'")
.arg(inPutStringHandle(playListName)).arg(newIndex+1).arg(inPutStringHandle(selectFilePath));
setRes2 &= setSongIndexFromLocal2.exec(setIndex2);
if(true == setRes2)
{
return DB_OP_SUCC;
}
else
{
return LIST_REORDER_ERR;
}
}
else
{
return LIST_REORDER_ERR;
}
}
}
}
else//位置没变
{
return DB_OP_SUCC;
}
}
int MusicDataBase::addMusicToHistoryMusic(const QString& filePath)
{
if(filePath.isEmpty())
{
return INVALID_INPUT;
}
else
{
musicDataStruct temp;
if(true == m_database.isValid())
{
bool queryRes = true;
//检查歌曲在总表中是否存在
int checkLocalRes = getSongInfoFromLocalMusic(filePath, temp);
if(DB_OP_SUCC != checkLocalRes)
{
return checkLocalRes;
}
//查询历史列表中是否已有该歌曲,已有的话,返回添加失败
int checkHistoryRes = checkIfSongExistsInHistoryMusic(filePath);
//历史列表中没有这首歌,直接添加
if(SONG_NOT_FOUND == checkHistoryRes)
{
//历史列表中不存在该歌曲,添加该歌曲
QSqlQuery addSongToHistory(m_database);
QString addSongString = QString("insert into %1 (%2) values('%3','%4','%5','%6','%7','%8','%9')").
arg(HISTORY).
arg(SHOWCONTEXTS).
arg(inPutStringHandle(temp.filepath)).
arg(inPutStringHandle(temp.title)).
arg(inPutStringHandle(temp.singer)).
arg(inPutStringHandle(temp.album)).
arg(inPutStringHandle(temp.filetype)).
arg(inPutStringHandle(temp.size)).
arg(inPutStringHandle(temp.time));
queryRes = addSongToHistory.exec(addSongString);
//插入歌曲时自增id和idIndex无法赋值插入后取得自增id给idIndex赋值
int tempIndex = addSongToHistory.lastInsertId().toInt();
bool setRes = true;
QSqlQuery setSongIDFromLocal(m_database);
QString setIndex = QString("update %1 set idIndex='%2' WHERE filepath='%3'").
arg(HISTORY).arg(tempIndex).arg(inPutStringHandle(temp.filepath));
setRes &= setSongIDFromLocal.exec(setIndex);
if(true == (queryRes&setRes))
{
return DB_OP_SUCC;
}
else
{
qDebug() << "数据库打开,添加失败!!!" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return DB_OP_ADD_FAILED;
}
}
else//历史列表中已存在该,歌曲,需要先删除再添加
{
int delHistoryRes = delMusicFromHistoryMusic(filePath);
if(DB_OP_SUCC == delHistoryRes)
{
//历史列表中不存在该歌曲,添加该歌曲
QSqlQuery addSongToHistory(m_database);
QString addSongString = QString("insert into %1 (%2) values('%3','%4','%5','%6','%7','%8','%9')").
arg(HISTORY).
arg(SHOWCONTEXTS).
arg(inPutStringHandle(temp.filepath)).
arg(inPutStringHandle(temp.title)).
arg(inPutStringHandle(temp.singer)).
arg(inPutStringHandle(temp.album)).
arg(inPutStringHandle(temp.filetype)).
arg(inPutStringHandle(temp.size)).
arg(inPutStringHandle(temp.time));
queryRes = addSongToHistory.exec(addSongString);
//插入歌曲时自增id和idIndex无法赋值插入后取得自增id给idIndex赋值
int tempIndex = addSongToHistory.lastInsertId().toInt();
bool setRes = true;
QSqlQuery setSongIDFromLocal(m_database);
QString setIndex = QString("update %1 set idIndex='%2' WHERE filepath='%3'").
arg(HISTORY).
arg(tempIndex).
arg(inPutStringHandle(temp.filepath));
setRes &= setSongIDFromLocal.exec(setIndex);
if(true == (queryRes&setRes))
{
return DB_OP_SUCC;
}
else
{
qDebug() << "数据库打开,添加失败!!!" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return DB_OP_ADD_FAILED;
}
}
else
{
return delHistoryRes;
}
}
}
else
{
qDebug() << "数据库无法打开,请重试!!!" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return DB_UNCONNECT;
}
}
}
int MusicDataBase::delMusicFromHistoryMusic(const QString& filePath)
{
bool delRes = true;
if(filePath.isEmpty())
{
return INVALID_INPUT;
}
else
{
if(m_database.isValid())
{
//查询历史列表中是否已有该歌曲,没有的话,返回删除失败
int checkHistoryRes = checkIfSongExistsInHistoryMusic(filePath);
if(DB_OP_SUCC == checkHistoryRes)
{
QSqlQuery delSongFromHistoryPlayList(m_database);
QString delSongString = QString("delete from %1 where filepath = '%2'").
arg(HISTORY).
arg(inPutStringHandle(filePath));
delRes &= delSongFromHistoryPlayList.exec(delSongString);
if(true == delRes)
{
return DB_OP_SUCC;
}
else
{
qDebug() << "数据库打开,删除失败!!!" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return DB_OP_DEL_FAILED;
}
}
else
{
qDebug() << "歌曲不存在!!!" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return checkHistoryRes;
}
}
else
{
qDebug() << "数据库无法打开,请重试!!!" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return DB_UNCONNECT;
}
}
}
int MusicDataBase::getSongInfoFromHistoryMusic(const QString& filePath, musicDataStruct &fileData)
{
bool getRes = true;
if(filePath.isEmpty())
{
return INVALID_INPUT;
}
else
{
if(true == m_database.isValid())
{
int checkRes = checkIfSongExistsInHistoryMusic(filePath);
if(checkRes == SONG_NOT_FOUND)
{
return SONG_NOT_FOUND;
}
else
{
QSqlQuery getSongInfoFromHistoryPlayList(m_database);
QString getSongString = QString("select %1 from %2 where filepath = '%3'")
.arg(SHOWCONTEXTS)
.arg(HISTORY)
.arg(inPutStringHandle(filePath));
getRes &= getSongInfoFromHistoryPlayList.exec(getSongString);
if(false == getRes)
{
return DB_OP_GET_FAILED;
}
//判断是否找到了对应的歌曲
if(getSongInfoFromHistoryPlayList.next())
{
fileData.filepath = outPutStringHandle(getSongInfoFromHistoryPlayList.value(0).toString());
fileData.title = outPutStringHandle(getSongInfoFromHistoryPlayList.value(1).toString());
fileData.singer = outPutStringHandle(getSongInfoFromHistoryPlayList.value(2).toString());
fileData.album = outPutStringHandle(getSongInfoFromHistoryPlayList.value(3).toString());
fileData.filetype = outPutStringHandle(getSongInfoFromHistoryPlayList.value(4).toString());
fileData.size = outPutStringHandle(getSongInfoFromHistoryPlayList.value(5).toString());
fileData.time = outPutStringHandle(getSongInfoFromHistoryPlayList.value(6).toString());
return DB_OP_SUCC;
}
else
{
return DB_DISORDERD;
}
}
}
else
{
qDebug() << "数据库无法打开,请重试!!!" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return DB_UNCONNECT;
}
}
}
//使用歌曲的path值查询歌曲信息(因为所有歌曲都在本地歌单,所以只用歌曲路径)
int MusicDataBase::getSongInfoFromDB(const QString& filePath, musicDataStruct &fileData)
{
bool getRes = true;
if(filePath.isEmpty())
{
qDebug() << "入参错误" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return INVALID_INPUT;
}
else
{
getRes = getSongInfoFromLocalMusic(filePath, fileData);
return getRes;
}
}
int MusicDataBase::getSongInfoListFromDB(QList<musicDataStruct>& resList,const QString& playListName)
{
bool getRes = true;
if(playListName.isEmpty())
{
qDebug() << "输入歌单名为空" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return INVALID_INPUT;
}
else
{
if(ALLMUSIC == playListName)
{
getRes = getSongInfoListFromLocalMusic(resList);
}
else if(HISTORY == playListName)
{
getRes = getSongInfoListFromHistoryMusic(resList);
}
else if(FAV == playListName)
{
getRes = getSongInfoListFromPlayList(resList,FAV);
}
else
{
getRes = getSongInfoListFromPlayList(resList,playListName);
}
return getRes;
}
}
bool MusicDataBase::checkSongIsInFav(const QString& filePath)
{
int isExist = OUT_OF_RESULT;
isExist = checkIfSongExistsInPlayList(filePath, FAV);
if(isExist == DB_OP_SUCC)
{
return true;
}
else
{
return false;
}
}
int MusicDataBase::getSongInfoListFromHistoryMusic(QList<musicDataStruct>& resList)
{
if(true == m_database.isValid())
{
bool getRes = true;
QSqlQuery getSongListFromHistoryMusic(m_database);
QString getSongListString = QString("select filepath from %1 order by idIndex desc").arg(HISTORY);
getRes = getSongListFromHistoryMusic.exec(getSongListString);
if(true == getRes)
{
while(getSongListFromHistoryMusic.next())
{
musicDataStruct temp;
temp.filepath = outPutStringHandle(getSongListFromHistoryMusic.value(0).toString());
int curRes = getSongInfoFromHistoryMusic(temp.filepath, temp);
if(DB_OP_SUCC == curRes)
{
resList.append(temp);
}
else
{
return curRes;
}
}
return DB_OP_SUCC;
}
else
{
return DB_OP_GET_FAILED;
}
}
else
{
return DB_DISORDERD;
}
}
//清空历史歌单
int MusicDataBase::emptyHistoryMusic()
{
if(true == m_database.isValid())
{
bool delRes = true;
QSqlQuery delPlayList(m_database);
QString delPlayListString = QString("DROP TABLE %1").arg(HISTORY);
delRes &= delPlayList.exec(delPlayListString);
if(true == delRes)
{
bool queryRes = true;
QSqlQuery queryInit(m_database);
queryRes &= queryInit.exec(QString("create table if not exists %1 ("
"id integer primary key autoincrement,"
"idIndex integer unique,"
"filepath varchar unique not NULL,"
"title varchar,"
"singer varchar,"
"album varchar,"
"filetype varchar,"
"size varchar,"
"time varchar)"
).arg(HISTORY));//创建历史播放列表自增id为主键index为唯一值插入歌曲时为空获取自增id值后赋值filepath为唯一值且不为空。
if(true == queryRes)
{
return DB_OP_SUCC;
}
else
{
return CREATE_HIS_FAILED;
}
}
else
{
return EMPTYT_HIS_FAILED;
}
}
else
{
qDebug() << "数据库无法打开,请重试!!!" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return DB_UNCONNECT;
}
}
int MusicDataBase::checkIfSongExistsInLocalMusic(const QString& filePath)
{
bool queryRes = true;
QString filePathHash = inPutStringHandle(filePath);
QSqlQuery getSongFromLocalMusic(m_database);
QString getSongString = QString("select id from %1 where filepath = '%2'")
.arg(ALLMUSIC)
.arg(filePathHash);
queryRes = getSongFromLocalMusic.exec(getSongString);
if(false == queryRes)
{
return DB_OP_GET_FAILED;
}
//判断总表中是否存在此歌曲,不存在返回错误!
if(getSongFromLocalMusic.next())
{
return DB_OP_SUCC;
}
else
{
qDebug() << "歌曲未找到" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return SONG_NOT_FOUND;
}
}
int MusicDataBase::checkIfSongExistsInHistoryMusic(const QString& filePath)
{
bool queryRes = true;
QString filePathHash = inPutStringHandle(filePath);
QSqlQuery getSongFromHistoryMusic(m_database);
QString getSongString = QString("select id from %1 where filepath = '%2'")
.arg(HISTORY)
.arg(filePathHash);
queryRes = getSongFromHistoryMusic.exec(getSongString);
if(false == queryRes)
{
return DB_OP_GET_FAILED;
}
//判断历史歌单中是否存在此歌曲,不存在返回错误!
if(getSongFromHistoryMusic.next())
{
return DB_OP_SUCC;
}
else
{
//歌曲未找到
return SONG_NOT_FOUND;
}
}
int MusicDataBase::checkIfSongExistsInPlayList(const QString& filePath, const QString& playListName)
{
if(filePath.isEmpty() || playListName.isEmpty())
{
return INVALID_INPUT;
}
QString filePathHash = inPutStringHandle(filePath);
QString playListNameHash = inPutStringHandle(playListName);
int checkRes = checkPlayListExist(playListName);
if(DB_OP_SUCC == checkRes)
{
bool queryRes = true;
QSqlQuery getSongFromPlayListMusic(m_database);
QString getSongString = QString("select id from 'playlist_%1' where filepath = '%2'").arg(playListNameHash).arg(filePathHash);
queryRes = getSongFromPlayListMusic.exec(getSongString);
if(false == queryRes)
{
return DB_OP_GET_FAILED;
}
//判断歌曲列表中是否存在此歌曲,不存在返回错误!
if(getSongFromPlayListMusic.next())
{
return DB_OP_SUCC;
}
else
{
//歌曲不存在
return SONG_NOT_FOUND;
}
}
else
{
return checkRes;
}
}
int MusicDataBase::getPlayList(QStringList& playListNameList)
{
bool getRes = true;
if(true == m_database.isValid())
{
// QMutexLocker lockData( &m_mutex); //加锁,函数执行完后自动解锁
QSqlQuery getplayListFromLocalMusic(m_database);
QString getplayListFromLocalMusicString = QString("select title from ListOfPlayList");
getRes = getplayListFromLocalMusic.exec(getplayListFromLocalMusicString);
if(false == getRes)
{
return DB_OP_GET_FAILED;
}
while(getplayListFromLocalMusic.next())
{
playListNameList.append(outPutStringHandle(getplayListFromLocalMusic.value(0).toString()));
}
return DB_OP_SUCC;
}
else
{
return DB_DISORDERD;
}
}
int MusicDataBase::renamePlayList(const QString& oldPlayListName, const QString& newPlayListName)
{
if(oldPlayListName.isEmpty() || newPlayListName.isEmpty())
{
return INVALID_INPUT;
}
if(FAV == oldPlayListName || FAV == newPlayListName)
{
return INVALID_INPUT;
}
int oldCheckRes = checkPlayListExist(oldPlayListName);
if(DB_OP_SUCC == oldCheckRes)
{
int newCheckRes = checkPlayListExist(newPlayListName);
if(LIST_NOT_FOUND == newCheckRes)
{
//sql支持table重命名
bool queryRes = true;
QSqlQuery queryRename(m_database);
//重命名歌单
QString renameListString = QString("ALTER TABLE 'playlist_%1' RENAME TO 'playlist_%2'").
arg(inPutStringHandle(oldPlayListName)).
arg(inPutStringHandle(newPlayListName));
queryRes &= queryRename.exec(renameListString);
if(true == queryRes)
{
//要把歌单列表中的对应旧歌单名删除,添加新歌单名
int createRes = createNewPlayList(newPlayListName);
if(DB_OP_SUCC == createRes)
{
int delRes = delPlayList(oldPlayListName);
if(DB_OP_SUCC == delRes)
{
return DB_OP_SUCC;//歌单名表名和歌单列表中的名称全部改变
}
else
{
return LIST_RENAME_ERR;//歌单名已改变,但歌单表中同时存在新歌单名和旧歌单名
}
}
else
{
return LIST_RENAME_ERR;//歌单名已改变,但歌单表中名未改变
}
}
else
{
return LIST_RENAME_FAILED;
}
}
else
{
if(DB_OP_SUCC == newCheckRes)
{
return LIST_EXISTS;
}
else
{
return newCheckRes;
}
}
}
else
{
return oldCheckRes;
}
}
int MusicDataBase::checkPlayListExist(const QString& playListName)
{
bool getRes = true;
QStringList playListNameList;
if(m_database.isValid())
{
QSqlQuery getplayListFromLocalMusic(m_database);
QString getplayListFromLocalMusicString = QString("select title from ListOfPlayList");
getRes = getplayListFromLocalMusic.exec(getplayListFromLocalMusicString);
if(false == getRes)
{
return DB_OP_GET_FAILED;
}
playListNameList.clear();
while(getplayListFromLocalMusic.next())
{
playListNameList.append(outPutStringHandle(getplayListFromLocalMusic.value(0).toString()));
}
if(playListNameList.contains(playListName))
{
return DB_OP_SUCC;
}
else
{
//该列表不存在
return LIST_NOT_FOUND;
}
}
else
{
return DB_DISORDERD;
}
}
//添加歌曲到新建歌单,使用歌曲的歌名值,歌单名值,输入数据必须有效,
int MusicDataBase::addMusicToPlayList(const QString& filePath,const QString& playListName)
{
if(filePath.isEmpty() || playListName.isEmpty())
{
return INVALID_INPUT;
}
int checkRes;
checkRes = checkPlayListExist(playListName);
if(DB_OP_SUCC == checkRes)
{
int checkLocalRes = checkIfSongExistsInLocalMusic(filePath);
if(DB_OP_SUCC == checkLocalRes)
{
musicDataStruct temp;
if(true == m_database.isValid())
{
//从总表中添加的,故要从总表中取歌曲信息!!!
//TODO缺少直接添加文件到播放列表的接口
int getLocalRes = getSongInfoFromLocalMusic(filePath, temp);
if(DB_OP_SUCC != getLocalRes)
{
return getLocalRes;
}
//查询歌单列表中是否已有该歌曲,已有的话,返回添加失败
int checkPlayListRes = checkIfSongExistsInPlayList(temp.filepath,playListName);
//歌单列表中已经有这首歌,重复添加了
if(DB_OP_SUCC == checkPlayListRes)
{
return DB_OP_ADD_REPEAT;
}
bool addRes;
//歌单列表中不存在该歌曲,添加该歌曲
QSqlQuery addSongToHistory(m_database);
QString addSongString = QString("insert into 'playlist_%1' (%2) values('%3','%4','%5','%6','%7','%8','%9')").
arg(inPutStringHandle(playListName)).
arg(SHOWCONTEXTS).
arg(inPutStringHandle(temp.filepath)).
arg(inPutStringHandle(temp.title)).
arg(inPutStringHandle(temp.singer)).
arg(inPutStringHandle(temp.album)).
arg(inPutStringHandle(temp.filetype)).
arg(inPutStringHandle(temp.size)).
arg(inPutStringHandle(temp.time));
addRes = addSongToHistory.exec(addSongString);
int tempIndex = addSongToHistory.lastInsertId().toInt();
bool setRes = true;
QSqlQuery setSongIDFromLocal(m_database);
QString setIndex = QString("update 'playlist_%1' set idIndex='%2' WHERE filepath='%3'").
arg(inPutStringHandle(playListName)).arg(tempIndex).arg(inPutStringHandle(temp.filepath));
setRes &= setSongIDFromLocal.exec(setIndex);
if(true == (addRes&setRes))
{
return DB_OP_SUCC;
}
else
{
qDebug() << "数据库打开,添加失败!!!" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return DB_OP_ADD_FAILED;
}
}
else
{
qDebug() << "数据库无法打开,请重试!!!" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return DB_UNCONNECT;
}
}
else
{
//本地歌单中检查该歌曲失败
return checkLocalRes;
}
}
else
{
//该歌单检查是否存在失败
return checkRes;
}
}
//从歌单中添加歌曲到新建歌单如果本地歌单中没有同样插入本地歌单使用musicDataStruct结构,输入数据必须有效,
int MusicDataBase::addNewSongToPlayList(const musicDataStruct& fileData,const QString& playListName)
{
if(playListName.isEmpty())
{
return INVALID_INPUT;
}
if(fileData.title.isEmpty() || fileData.filepath.isEmpty())
{
qDebug() << "无效入参" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return INVALID_INPUT;
}
int checkListRes = checkIfSongExistsInPlayList(fileData.filepath,playListName);
if(SONG_NOT_FOUND != checkListRes)
{
if(DB_OP_SUCC == checkListRes)
{
qDebug() << "歌曲重复添加";
return DB_OP_ADD_REPEAT;
}
else
{
qDebug() << "检查歌曲是否存在失败,失败码为:" << checkListRes;
return checkListRes;
}
}
else
{
int checkLocalRes = checkIfSongExistsInLocalMusic(fileData.filepath);
if(checkLocalRes == SONG_NOT_FOUND)
{
int addLocalRes;
addLocalRes = addMusicToLocalMusic(fileData);
if(DB_OP_SUCC == addLocalRes)
{
int addListRes;
addListRes = addMusicToPlayList(fileData.filepath,playListName);
return addListRes;
}
else
{
return addLocalRes;
}
}
else if(checkLocalRes == DB_OP_SUCC)
{
int addListRes;
addListRes = addMusicToPlayList(fileData.filepath,playListName);
return addListRes;
}
else
{
return checkLocalRes;
}
}
}
//从新建歌单中删除歌曲,使用歌曲的路径值,输入数据必须有效,
int MusicDataBase::delMusicFromPlayList(const QString& filePath,const QString& playListName)
{
if(filePath.isEmpty() || playListName.isEmpty())
{
return INVALID_INPUT;
}
int checkRes;
checkRes = checkPlayListExist(playListName);
if(DB_OP_SUCC == checkRes)
{
//暂时把歌单和本地歌曲分离
// int checkLocalRes = checkIfSongExistsInLocalMusic(filePath);
// if(DB_OP_SUCC == checkLocalRes)
// {
if(m_database.isValid())
{
//查询歌单列表中是否已有该歌曲,没有的话,返回删除失败
int checkPlayListRes = checkIfSongExistsInPlayList(filePath,playListName);
//歌单列表中已经有这首歌,可以删除
if(DB_OP_SUCC == checkPlayListRes)
{
bool delRes;
//歌单列表中存在该歌曲,删除该歌曲
QSqlQuery delSongToHistory(m_database);
QString delSongString = QString("delete from 'playlist_%1' where filepath = '%2'").
arg(inPutStringHandle(playListName)).
arg(inPutStringHandle(filePath));
delRes = delSongToHistory.exec(delSongString);
if(true == delRes)
{
return DB_OP_SUCC;
}
else
{
qDebug() << "数据库打开, 删除失败!!!" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return DB_OP_DEL_FAILED;
}
}
else
{
return DB_OP_DEL_FAILED;
}
}
else
{
qDebug() << "数据库无法打开,请重试!!!" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return DB_UNCONNECT;
}
// }
// else
// {
// //本地歌单中检查该歌曲失败
// return checkLocalRes;
// }
}
else
{
//该歌单检查是否存在失败
return checkRes;
}
}
int MusicDataBase::getSongIndexFromLocalMusic(const QString& filePath, int &songIndex)
{
if(filePath.isEmpty())
{
return INVALID_INPUT;
}
if(true == m_database.isValid())
{
bool getRes = true;
QSqlQuery getSongFromLocalMusic(m_database);
QString getSongString = QString("select idIndex from %1 where filepath = '%2'")
.arg(ALLMUSIC)
.arg(inPutStringHandle(filePath));
getRes = getSongFromLocalMusic.exec(getSongString);
if(true == getRes)
{
if(getSongFromLocalMusic.next())
{
songIndex = getSongFromLocalMusic.value(0).toInt();
}
else
{
qDebug() << "数据库中查无此歌!" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return DB_DISORDERD;
}
return DB_OP_SUCC;
}
else
{
return DB_OP_GET_FAILED;
}
}
else
{
return DB_DISORDERD;
}
}
int MusicDataBase::getSongIndexFromPlayList(const QString& filePath,const QString& playListName, int &songIndex)
{
if(filePath.isEmpty())
{
return INVALID_INPUT;
}
if(true == m_database.isValid())
{
int checkRes = checkPlayListExist(playListName);
if(checkRes == DB_OP_SUCC)
{
bool getRes = true;
QSqlQuery getSongFromPlayList(m_database);
QString getSongString = QString("select idIndex from 'playlist_%1' where filepath = '%2'").
arg(inPutStringHandle(playListName)).arg(inPutStringHandle(filePath));
getRes = getSongFromPlayList.exec(getSongString);
if(true == getRes)
{
if(getSongFromPlayList.next())
{
songIndex = getSongFromPlayList.value(0).toInt();
}
else
{
qDebug() << "数据库中查无此歌!" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return DB_DISORDERD;
}
return DB_OP_SUCC;
}
else
{
return DB_OP_GET_FAILED;
}
}
else
{
return checkRes;
}
}
else
{
return DB_DISORDERD;
}
}
int MusicDataBase::delSongFromEveryWhere(const QString& filePath)
{
//从历史歌单中删除该歌
int checkHistoryRes = checkIfSongExistsInHistoryMusic(filePath);
if(DB_OP_SUCC == checkHistoryRes)
{
int delHistoryRes = delMusicFromHistoryMusic(filePath);
if(DB_OP_SUCC != delHistoryRes)
{
return delHistoryRes;
}
else
{}
}
else
{
if(SONG_NOT_FOUND != checkHistoryRes)
{
return checkHistoryRes;
}
else
{}
}
//从总歌单中删除该歌
int checkLocalRes = checkIfSongExistsInLocalMusic(filePath);
if(DB_OP_SUCC == checkLocalRes)
{
int delLocalRes = delMusicFromLocalMusic(filePath);
if(DB_OP_SUCC != delLocalRes)
{
return delLocalRes;
}
else
{}
}
else
{
if(SONG_NOT_FOUND != checkLocalRes)
{
return checkLocalRes;
}
else
{}
}
QStringList temp;
//查询当前已有歌单列表
int getPlayListRes = getPlayList(temp);
if(DB_OP_SUCC == getPlayListRes)
{
foreach (auto tempList, temp)
{
//检查歌曲是否在歌单列表中存在
int checkPlayListRes = checkIfSongExistsInPlayList(filePath, tempList);
if(DB_OP_SUCC == checkPlayListRes)
{
//从新建歌单中删除歌曲使用歌曲filePath,歌单名title值输入数据必须有效
int delMusicFromPlayListRes = delMusicFromPlayList(filePath, tempList);
if(DB_OP_SUCC != delMusicFromPlayListRes)
{
return delMusicFromPlayListRes;
}
else
{}
}
else
{
if(SONG_NOT_FOUND != checkPlayListRes)
{
return checkPlayListRes;
}
else
{}
}
}
}
else
{
return getPlayListRes;
}
//从历史歌单,总歌单,各新建歌单中都删除后,返回成功。
return DB_OP_SUCC;
}
//删除多首歌曲
int MusicDataBase::delMultiSongs(const QString &playListName, const QStringList &songsList)
{
//入参检查
if(playListName.isEmpty())
{
return INVALID_INPUT;
}
if(0 == songsList.size())
{
return INVALID_INPUT;
}
foreach (auto songName, songsList)
{
if(songName.isEmpty())
{
return INVALID_INPUT;
}
}
if(ALLMUSIC == playListName || HISTORY == playListName)
{
}
else
{
int playListCheckRes = checkPlayListExist(playListName);
if(DB_OP_SUCC != playListCheckRes)
{
return playListCheckRes;
}
}
foreach (auto songName, songsList)
{
int checkIfSongExists = OUT_OF_RESULT;
if(ALLMUSIC == playListName)
{
checkIfSongExists = checkIfSongExistsInLocalMusic(songName);
if(SONG_NOT_FOUND == checkIfSongExists)
{
continue;
}
}
else if(HISTORY == playListName)
{
checkIfSongExists = checkIfSongExistsInHistoryMusic(songName);
if(SONG_NOT_FOUND == checkIfSongExists)
{
continue;
}
}
else
{
checkIfSongExists = checkIfSongExistsInPlayList(songName, playListName);
if(SONG_NOT_FOUND == checkIfSongExists)
{
continue;
}
}
if(DB_OP_SUCC == checkIfSongExists)
{
int delRes = OUT_OF_RESULT;
if(ALLMUSIC == playListName)
{
delRes = delMusicFromLocalMusic(songName);
}
else if(HISTORY == playListName)
{
delRes = delMusicFromHistoryMusic(songName);
}
else
{
delRes = delMusicFromPlayList(songName, playListName);
}
if(delRes != DB_OP_SUCC)
{
return delRes;
}
else
{
continue;
}
}
else
{
return checkIfSongExists;
}
}
return DB_OP_SUCC;
}
int MusicDataBase::checkIfPlayListIsEmpty(const QString& playListName)
{
if(playListName.isEmpty())
{
return INVALID_INPUT;
}
int playListCheckRes = checkPlayListExist(playListName);
if(DB_OP_SUCC != playListCheckRes)
{
return playListCheckRes;
}
else
{
if(true == m_database.isValid())
{
bool getRes = true;
int count = 0;
QSqlQuery getSongFromPlayList(m_database);
QString getSongString = QString("select count(title) from 'playlist_%1'").arg(inPutStringHandle(playListName));
getRes = getSongFromPlayList.exec(getSongString);
if(true == getRes)
{
if(getSongFromPlayList.next())
{
count = getSongFromPlayList.value(0).toInt();
if(count > 0)
{
return LIST_NOT_EMPTY;
}
else
{
return LIST_IS_EMPTY;
}
}
else
{
qDebug() << "数据库中查无此歌!" <<__FILE__<< ","<<__FUNCTION__<<","<<__LINE__;
return DB_DISORDERD;
}
}
else
{
return DB_OP_GET_FAILED;
}
}
}
}
QString MusicDataBase::inPutStringHandle(const QString& input)
{
QString temp = input;
QByteArray text = temp.toUtf8();
QString output = text.toBase64();
return output;
}
QString MusicDataBase::outPutStringHandle(const QString& output)
{
QString temp = output;
QByteArray text = temp.toUtf8();
text = QByteArray::fromBase64(text);
QString outOrigin;
outOrigin.prepend(text.data());
return outOrigin;
}
QString MusicDataBase::preHandle(const QString &input)
{
// 将'替换成''
QString res = input;
int iPos = res.indexOf("'", 0);
while(-1 != iPos){
res.insert(iPos, QString("'"));
iPos = res.indexOf("'", iPos + 2);
}
return res;
}