[优化] 避免并发风险
This commit is contained in:
@@ -127,7 +127,7 @@ fun Book.contains(word: String?): Boolean {
|
|||||||
fun Book.canSafelyRebindTo(newBookUrl: String): Boolean {
|
fun Book.canSafelyRebindTo(newBookUrl: String): Boolean {
|
||||||
if (newBookUrl == bookUrl) return true
|
if (newBookUrl == bookUrl) return true
|
||||||
val targetBook = appDb.bookDao.getBook(newBookUrl) ?: return true
|
val targetBook = appDb.bookDao.getBook(newBookUrl) ?: return true
|
||||||
if (targetBook.bookUrl == bookUrl) return true
|
|
||||||
val sameOriginName = originName.isNotBlank() && originName == targetBook.originName
|
val sameOriginName = originName.isNotBlank() && originName == targetBook.originName
|
||||||
val sameNameAuthor = name.isNotBlank() && author.isNotBlank()
|
val sameNameAuthor = name.isNotBlank() && author.isNotBlank()
|
||||||
&& name == targetBook.name && author == targetBook.author
|
&& name == targetBook.name && author == targetBook.author
|
||||||
@@ -173,27 +173,31 @@ fun Book.getLocalUri(): Uri {
|
|||||||
|
|
||||||
// 查找书籍保存目录
|
// 查找书籍保存目录
|
||||||
if (!defaultBookDir.isNullOrBlank()) {
|
if (!defaultBookDir.isNullOrBlank()) {
|
||||||
val treeUri = Uri.parse(defaultBookDir)
|
val treeUri = defaultBookDir.toUri()
|
||||||
val treeFileDoc = FileDoc.fromUri(treeUri, true)
|
val treeFileDoc = FileDoc.fromUri(treeUri, true)
|
||||||
|
|
||||||
if (!treeFileDoc.exists()) {
|
if (!treeFileDoc.exists()) {
|
||||||
appCtx.toastOnUi("书籍保存目录失效,请重新设置!")
|
appCtx.toastOnUi("书籍保存目录失效,请重新设置!")
|
||||||
} else {
|
} else {
|
||||||
val fileDoc = treeFileDoc.find(originName, 5, 100)
|
val fileDoc = treeFileDoc.find(originName, 5, 100)
|
||||||
if (fileDoc != null) {
|
if (fileDoc != null) {
|
||||||
localUriCache[bookUrl] = fileDoc.uri
|
|
||||||
//更新bookUrl时要迁移主键,避免save()按新bookUrl插入重复书籍
|
|
||||||
val oldBook = copy()
|
|
||||||
val newBookUrl = fileDoc.toString()
|
val newBookUrl = fileDoc.toString()
|
||||||
|
val oldBook = copy()
|
||||||
if (!oldBook.canSafelyRebindTo(newBookUrl)) {
|
if (!oldBook.canSafelyRebindTo(newBookUrl)) {
|
||||||
return fileDoc.uri
|
return fileDoc.uri
|
||||||
}
|
}
|
||||||
bookUrl = newBookUrl
|
appDb.runInTransaction {
|
||||||
if (oldBook.bookUrl == bookUrl) {
|
|
||||||
save()
|
if (oldBook.bookUrl == newBookUrl) {
|
||||||
} else {
|
save()
|
||||||
appDb.bookDao.replace(oldBook, this)
|
} else {
|
||||||
BookHelp.updateCacheFolder(oldBook, this)
|
val newBook = oldBook.copy(bookUrl = newBookUrl)
|
||||||
|
appDb.bookDao.replace(oldBook, newBook)
|
||||||
|
BookHelp.updateCacheFolder(oldBook, newBook)
|
||||||
|
this.bookUrl = newBookUrl
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
localUriCache[newBookUrl] = fileDoc.uri
|
||||||
return fileDoc.uri
|
return fileDoc.uri
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -209,20 +213,23 @@ fun Book.getLocalUri(): Uri {
|
|||||||
val treeFileDoc = FileDoc.fromUri(treeUri, true)
|
val treeFileDoc = FileDoc.fromUri(treeUri, true)
|
||||||
val fileDoc = treeFileDoc.find(originName, 5, 100)
|
val fileDoc = treeFileDoc.find(originName, 5, 100)
|
||||||
if (fileDoc != null) {
|
if (fileDoc != null) {
|
||||||
localUriCache[bookUrl] = fileDoc.uri
|
|
||||||
//更新bookUrl时要迁移主键,避免save()按新bookUrl插入重复书籍
|
|
||||||
val oldBook = copy()
|
|
||||||
val newBookUrl = fileDoc.toString()
|
val newBookUrl = fileDoc.toString()
|
||||||
|
val oldBook = copy()
|
||||||
if (!oldBook.canSafelyRebindTo(newBookUrl)) {
|
if (!oldBook.canSafelyRebindTo(newBookUrl)) {
|
||||||
return fileDoc.uri
|
return fileDoc.uri
|
||||||
}
|
}
|
||||||
bookUrl = newBookUrl
|
|
||||||
if (oldBook.bookUrl == bookUrl) {
|
appDb.runInTransaction {
|
||||||
save()
|
if (oldBook.bookUrl == newBookUrl) {
|
||||||
} else {
|
save()
|
||||||
appDb.bookDao.replace(oldBook, this)
|
} else {
|
||||||
BookHelp.updateCacheFolder(oldBook, this)
|
val newBook = oldBook.copy(bookUrl = newBookUrl)
|
||||||
|
appDb.bookDao.replace(oldBook, newBook)
|
||||||
|
BookHelp.updateCacheFolder(oldBook, newBook)
|
||||||
|
this.bookUrl = newBookUrl
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
localUriCache[newBookUrl] = fileDoc.uri
|
||||||
return fileDoc.uri
|
return fileDoc.uri
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ import io.legado.app.utils.isAbsUrl
|
|||||||
import io.legado.app.utils.isContentScheme
|
import io.legado.app.utils.isContentScheme
|
||||||
import io.legado.app.utils.isDataUrl
|
import io.legado.app.utils.isDataUrl
|
||||||
import io.legado.app.utils.printOnDebug
|
import io.legado.app.utils.printOnDebug
|
||||||
|
import kotlinx.coroutines.currentCoroutineContext
|
||||||
import kotlinx.coroutines.runBlocking
|
import kotlinx.coroutines.runBlocking
|
||||||
import org.apache.commons.text.StringEscapeUtils
|
import org.apache.commons.text.StringEscapeUtils
|
||||||
import splitties.init.appCtx
|
import splitties.init.appCtx
|
||||||
@@ -63,7 +64,6 @@ import java.io.FileNotFoundException
|
|||||||
import java.io.FileOutputStream
|
import java.io.FileOutputStream
|
||||||
import java.io.InputStream
|
import java.io.InputStream
|
||||||
import java.util.regex.Pattern
|
import java.util.regex.Pattern
|
||||||
import kotlin.coroutines.coroutineContext
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 书籍文件导入 目录正文解析
|
* 书籍文件导入 目录正文解析
|
||||||
@@ -406,7 +406,7 @@ object LocalBook {
|
|||||||
val inputStream = when {
|
val inputStream = when {
|
||||||
str.isAbsUrl() -> AnalyzeUrl(
|
str.isAbsUrl() -> AnalyzeUrl(
|
||||||
str, source = source, callTimeout = 0,
|
str, source = source, callTimeout = 0,
|
||||||
coroutineContext = coroutineContext
|
coroutineContext = currentCoroutineContext()
|
||||||
).getInputStreamAwait()
|
).getInputStreamAwait()
|
||||||
|
|
||||||
str.isDataUrl() -> ByteArrayInputStream(
|
str.isDataUrl() -> ByteArrayInputStream(
|
||||||
@@ -461,7 +461,7 @@ object LocalBook {
|
|||||||
fun isOnBookShelf(
|
fun isOnBookShelf(
|
||||||
fileName: String
|
fileName: String
|
||||||
): Boolean {
|
): Boolean {
|
||||||
return appDb.bookDao.hasFile(fileName) == true
|
return appDb.bookDao.hasFile(fileName)
|
||||||
}
|
}
|
||||||
|
|
||||||
//文件类书源 合并在线书籍信息 在线 > 本地
|
//文件类书源 合并在线书籍信息 在线 > 本地
|
||||||
@@ -511,13 +511,23 @@ object LocalBook {
|
|||||||
localBook.cacheLocalUri(fileUri)
|
localBook.cacheLocalUri(fileUri)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
localBook.bookUrl = newBookUrl
|
|
||||||
localBook.origin = BookType.webDavTag + CustomUrl(webDavUrl).toString()
|
appDb.runInTransaction {
|
||||||
if (oldBook.bookUrl == localBook.bookUrl) {
|
if (oldBook.bookUrl == newBookUrl) {
|
||||||
localBook.save()
|
localBook.origin =
|
||||||
} else {
|
BookType.webDavTag + CustomUrl(webDavUrl).toString()
|
||||||
appDb.bookDao.replace(oldBook, localBook)
|
|
||||||
BookHelp.updateCacheFolder(oldBook, localBook)
|
localBook.save()
|
||||||
|
} else {
|
||||||
|
val newBook = oldBook.copy(
|
||||||
|
bookUrl = newBookUrl,
|
||||||
|
origin = BookType.webDavTag + CustomUrl(webDavUrl).toString()
|
||||||
|
)
|
||||||
|
appDb.bookDao.replace(oldBook, newBook)
|
||||||
|
BookHelp.updateCacheFolder(oldBook, newBook)
|
||||||
|
localBook.bookUrl = newBookUrl
|
||||||
|
localBook.origin = newBook.origin
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user