mirror of
https://github.com/siyuan-note/siyuan.git
synced 2026-01-03 23:38:49 +01:00
Merge remote-tracking branch 'origin/dev' into dev
This commit is contained in:
commit
838f3977db
32 changed files with 500 additions and 52 deletions
2
API.md
2
API.md
|
|
@ -480,7 +480,7 @@ Move documents by `id`:
|
|||
```
|
||||
|
||||
* `fromIDs`: Source docs' IDs
|
||||
* `toID`: Target parent ID
|
||||
* `toID`: Target parent doc's ID or notebook ID
|
||||
* Return value
|
||||
|
||||
```json
|
||||
|
|
|
|||
|
|
@ -478,7 +478,7 @@
|
|||
```
|
||||
|
||||
* `fromIDs`:源文档 ID
|
||||
* `toID`:目标父文档 ID
|
||||
* `toID`:目标父文档 ID 或笔记本 ID
|
||||
* 返回值
|
||||
|
||||
```json
|
||||
|
|
|
|||
|
|
@ -1,4 +1,8 @@
|
|||
{
|
||||
"vacuumDataIndex": "تحسين الفهرس",
|
||||
"vacuumDataIndexTip": "تحقق من فهرس البيانات، وحرر مساحة التخزين وحسّن أداء الفهرس",
|
||||
"rebuildDataIndex": "إعادة بناء الفهرس",
|
||||
"rebuildDataIndexTip": "إعادة بناء كاملة لفهرس البيانات، قد يستغرق ذلك بعض الوقت، يرجى الانتظار",
|
||||
"displayFieldName": "عرض اسم الحقل",
|
||||
"sortBySelectOption": "Nach Option sortieren",
|
||||
"groupStep": "فاصل التجميع",
|
||||
|
|
@ -1649,6 +1653,9 @@
|
|||
"265": "خارج النطاق",
|
||||
"266": "Tesseract OCR غير مثبت أو غير مهيأ، يرجى الرجوع إلى دليل المستخدم - قسم ملفات الموارد لإجراء الإعداد",
|
||||
"267": "قاعدة بيانات غير مسماة",
|
||||
"268": "يرجى ملاحظة أن الملف [%s] قد تجاوز بالفعل [%d MB]، وقد يؤدي ذلك إلى انخفاض الأداء"
|
||||
"268": "يرجى ملاحظة أن الملف [%s] قد تجاوز بالفعل [%d MB]، وقد يؤدي ذلك إلى انخفاض الأداء",
|
||||
"269": "تمت إضافة هذا المقطع بالفعل إلى قاعدة البيانات [%s]",
|
||||
"270": "يتم تحسين فهرس البيانات، يرجى الانتظار...",
|
||||
"271": "اكتملت عملية تحسين فهرس البيانات، تم تحرير [%s] من مساحة القرص"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,8 @@
|
|||
{
|
||||
"vacuumDataIndex": "Index optimieren",
|
||||
"vacuumDataIndexTip": "Datenindex prüfen, Speicherplatz freigeben und Indexleistung verbessern",
|
||||
"rebuildDataIndex": "Index neu erstellen",
|
||||
"rebuildDataIndexTip": "Kompletter Neuaufbau des Datenindex, dies kann einige Zeit dauern. Bitte warten",
|
||||
"displayFieldName": "Feldnamen anzeigen",
|
||||
"sortBySelectOption": "Nach Option sortieren",
|
||||
"groupStep": "Gruppierungsintervall",
|
||||
|
|
@ -1649,6 +1653,9 @@
|
|||
"265": "Außerhalb des Bereichs",
|
||||
"266": "Tesseract OCR ist nicht installiert oder konfiguriert, bitte lesen Sie das Benutzerhandbuch - Abschnitt Ressourcen-Dateien zur Konfiguration",
|
||||
"267": "Unbenannte Datenbank",
|
||||
"268": "Bitte beachten Sie, dass die Datei [%s] bereits [%d MB] überschritten hat, was die Leistung beeinträchtigen kann"
|
||||
"268": "Bitte beachten Sie, dass die Datei [%s] bereits [%d MB] überschritten hat, was die Leistung beeinträchtigen kann",
|
||||
"269": "Dieser Block wurde bereits zur Datenbank [%s] hinzugefügt",
|
||||
"270": "Datenindex wird optimiert, bitte warten...",
|
||||
"271": "Datenindex-Optimierung abgeschlossen, [%s] Speicherplatz freigegeben"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,8 @@
|
|||
{
|
||||
"vacuumDataIndex": "Optimize Index",
|
||||
"vacuumDataIndexTip": "Check data index, free up storage, and improve index performance",
|
||||
"rebuildDataIndex": "Rebuild Index",
|
||||
"rebuildDataIndexTip": "Fully rebuild the data index, which may take some time. Please wait",
|
||||
"displayFieldName": "Display field name",
|
||||
"sortBySelectOption": "Sort by option",
|
||||
"groupStep": "Group interval",
|
||||
|
|
@ -1649,6 +1653,9 @@
|
|||
"265": "Out of range",
|
||||
"266": "Tesseract OCR is not installed or configured, please refer to the User Guide - Assets section for configuration",
|
||||
"267": "Unnamed database",
|
||||
"268": "Please note that the file [%s] has already exceeded [%d MB], which may cause performance degradation"
|
||||
"268": "Please note that the file [%s] has already exceeded [%d MB], which may cause performance degradation",
|
||||
"269": "This block has already been added to the database [%s]",
|
||||
"270": "Optimizing data index, please wait...",
|
||||
"271": "Data index optimization completed, [%s] disk space freed"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,8 @@
|
|||
{
|
||||
"vacuumDataIndex": "Optimizar índice",
|
||||
"vacuumDataIndexTip": "Verifique el índice de datos, libere espacio y mejore el rendimiento del índice",
|
||||
"rebuildDataIndex": "Reconstruir índice",
|
||||
"rebuildDataIndexTip": "Reconstrucción completa del índice de datos, puede tardar, por favor espere",
|
||||
"displayFieldName": "Mostrar nombre de campo",
|
||||
"sortBySelectOption": "Ordenar por opción",
|
||||
"groupStep": "Intervalo de agrupación",
|
||||
|
|
@ -1649,6 +1653,9 @@
|
|||
"265": "Fuera de rango",
|
||||
"266": "Tesseract OCR no está instalado o configurado, consulte la Guía del Usuario - Sección de archivos de recursos para la configuración",
|
||||
"267": "Base de datos sin nombre",
|
||||
"268": "Atención: el archivo [%s] ya ha superado los [%d MB], lo que puede causar una disminución del rendimiento"
|
||||
"268": "Atención: el archivo [%s] ya ha superado los [%d MB], lo que puede causar una disminución del rendimiento",
|
||||
"269": "Este bloque ya ha sido añadido a la base de datos [%s]",
|
||||
"270": "Optimizando el índice de datos, por favor espere...",
|
||||
"271": "Optimización del índice de datos completada, se liberaron [%s] de espacio en disco"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,8 @@
|
|||
{
|
||||
"vacuumDataIndex": "Optimiser l’index",
|
||||
"vacuumDataIndexTip": "Vérifiez l’index des données, libérez de l’espace et améliorez les performances de l’index",
|
||||
"rebuildDataIndex": "Reconstruire l’index",
|
||||
"rebuildDataIndexTip": "Reconstruction complète de l’index des données, cela peut prendre du temps, veuillez patienter",
|
||||
"displayFieldName": "Afficher le nom du champ",
|
||||
"sortBySelectOption": "Trier par option",
|
||||
"groupStep": "Intervalle de regroupement",
|
||||
|
|
@ -1649,6 +1653,9 @@
|
|||
"265": "Hors de portée",
|
||||
"266": "Tesseract OCR n'est pas installé ou configuré, veuillez consulter le Guide de l'utilisateur - Section des fichiers de ressources pour la configuration",
|
||||
"267": "Base de données sans nom",
|
||||
"268": "Attention : le fichier [%s] a déjà dépassé [%d MB], ce qui peut entraîner une baisse des performances"
|
||||
"268": "Attention : le fichier [%s] a déjà dépassé [%d MB], ce qui peut entraîner une baisse des performances",
|
||||
"269": "Ce bloc a déjà été ajouté à la base de données [%s]",
|
||||
"270": "Optimisation de l’index des données en cours, veuillez patienter...",
|
||||
"271": "Optimisation de l’index des données terminée, [%s] d’espace disque libéré"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,8 @@
|
|||
{
|
||||
"vacuumDataIndex": "אופטימיזציית אינדקס",
|
||||
"vacuumDataIndexTip": "בדוק את אינדקס הנתונים, שחרר שטח אחסון ושפר את ביצועי האינדקס",
|
||||
"rebuildDataIndex": "בנה מחדש את האינדקס",
|
||||
"rebuildDataIndexTip": "בנייה מחדש מלאה של אינדקס הנתונים, עשוי להימשך זמן, נא להמתין",
|
||||
"displayFieldName": "הצג שם שדה",
|
||||
"sortBySelectOption": "מיין לפי אפשרות",
|
||||
"groupStep": "מרווח קיבוץ",
|
||||
|
|
@ -1649,6 +1653,9 @@
|
|||
"265": "מחוץ לטווח",
|
||||
"266": "Tesseract OCR לא הותקן או הוגדר, אנא עיין במדריך למשתמש - פרק קבצי משאבים לצורך הגדרה",
|
||||
"267": "מסד נתונים ללא שם",
|
||||
"268": "שים לב שהקובץ [%s] כבר חרג מ-[%d MB], דבר שעלול לגרום לירידה בביצועים"
|
||||
"268": "שים לב שהקובץ [%s] כבר חרג מ-[%d MB], דבר שעלול לגרום לירידה בביצועים",
|
||||
"269": "הבלוק נוסף כבר למסד הנתונים [%s]",
|
||||
"270": "מתבצעת אופטימיזציה של אינדקס הנתונים, נא להמתין...",
|
||||
"271": "אופטימיזציית אינדקס הנתונים הושלמה, שוחררו [%s] שטח דיסק"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,8 @@
|
|||
{
|
||||
"vacuumDataIndex": "Ottimizza indice",
|
||||
"vacuumDataIndexTip": "Verifica l'indice dei dati, libera spazio e migliora le prestazioni dell'indice",
|
||||
"rebuildDataIndex": "Ricostruisci indice",
|
||||
"rebuildDataIndexTip": "Ricostruzione completa dell'indice dei dati, potrebbe richiedere tempo, attendere prego",
|
||||
"displayFieldName": "Mostra nome campo",
|
||||
"sortBySelectOption": "Ordina per opzione",
|
||||
"groupStep": "Intervallo di raggruppamento",
|
||||
|
|
@ -1649,6 +1653,9 @@
|
|||
"265": "Fuori intervallo",
|
||||
"266": "Tesseract OCR non è installato o configurato, fare riferimento alla Guida utente - Sezione file di risorse per la configurazione",
|
||||
"267": "Database senza nome",
|
||||
"268": "Attenzione: il file [%s] ha già superato [%d MB], il che potrebbe causare un calo delle prestazioni"
|
||||
"268": "Attenzione: il file [%s] ha già superato [%d MB], il che potrebbe causare un calo delle prestazioni",
|
||||
"269": "Questo blocco è già stato aggiunto al database [%s]",
|
||||
"270": "Ottimizzazione dell'indice dei dati in corso, attendere prego...",
|
||||
"271": "Ottimizzazione dell'indice dei dati completata, liberati [%s] di spazio su disco"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,8 @@
|
|||
{
|
||||
"vacuumDataIndex": "インデックスの最適化",
|
||||
"vacuumDataIndexTip": "データインデックスを検証し、ストレージを解放してインデックス性能を向上させます",
|
||||
"rebuildDataIndex": "インデックスの再構築",
|
||||
"rebuildDataIndexTip": "データインデックスを完全に再構築します。時間がかかる場合がありますのでお待ちください",
|
||||
"displayFieldName": "フィールド名を表示",
|
||||
"sortBySelectOption": "オプションで並べ替え",
|
||||
"groupStep": "グループ間隔",
|
||||
|
|
@ -1649,6 +1653,9 @@
|
|||
"265": "範囲外",
|
||||
"266": "Tesseract OCR がインストールされていないか、設定されていません。ユーザーガイド - リソースファイルセクションを参照して設定してください",
|
||||
"267": "未命名のデータベース",
|
||||
"268": "ファイル [%s] はすでに [%d MB] を超えており、パフォーマンスが低下する可能性があります"
|
||||
"268": "ファイル [%s] はすでに [%d MB] を超えており、パフォーマンスが低下する可能性があります",
|
||||
"269": "このブロックはすでにデータベース [%s] に追加されています",
|
||||
"270": "データインデックスを最適化しています。しばらくお待ちください...",
|
||||
"271": "データインデックスの最適化が完了しました。合計 [%s] のディスク容量が解放されました"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,8 @@
|
|||
{
|
||||
"vacuumDataIndex": "Optymalizuj indeks",
|
||||
"vacuumDataIndexTip": "Sprawdź indeks danych, zwolnij miejsce i popraw wydajność indeksu",
|
||||
"rebuildDataIndex": "Odbuduj indeks",
|
||||
"rebuildDataIndexTip": "Pełna odbudowa indeksu danych, może to potrwać, proszę czekać",
|
||||
"displayFieldName": "Wyświetl nazwę pola",
|
||||
"sortBySelectOption": "Sortuj według opcji",
|
||||
"groupStep": "Odstęp grupowania",
|
||||
|
|
@ -1649,6 +1653,9 @@
|
|||
"265": "Poza zakresem",
|
||||
"266": "Tesseract OCR nie jest zainstalowany lub skonfigurowany, zapoznaj się z Podręcznikiem użytkownika - Sekcja plików zasobów, aby skonfigurować",
|
||||
"267": "Nienazwana baza danych",
|
||||
"268": "Uwaga: plik [%s] przekroczył już [%d MB], co może spowodować spadek wydajności"
|
||||
"268": "Uwaga: plik [%s] przekroczył już [%d MB], co może spowodować spadek wydajności",
|
||||
"269": "Ten blok został już dodany do bazy danych [%s]",
|
||||
"270": "Optymalizacja indeksu danych, proszę czekać...",
|
||||
"271": "Optymalizacja indeksu danych zakończona, zwolniono [%s] miejsca na dysku"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,8 @@
|
|||
{
|
||||
"vacuumDataIndex": "Otimizar índice",
|
||||
"vacuumDataIndexTip": "Verifique o índice de dados, libere espaço e melhore o desempenho do índice",
|
||||
"rebuildDataIndex": "Reconstruir índice",
|
||||
"rebuildDataIndexTip": "Reconstrução completa do índice de dados, pode demorar, por favor aguarde",
|
||||
"displayFieldName": "Exibir nome do campo",
|
||||
"sortBySelectOption": "Classificar por opção",
|
||||
"groupStep": "Intervalo de agrupamento",
|
||||
|
|
@ -1649,6 +1653,9 @@
|
|||
"265": "Fora do intervalo",
|
||||
"266": "Tesseract OCR não está instalado ou configurado, consulte o Guia do Usuário - Seção de Arquivos de Recursos para configuração",
|
||||
"267": "Banco de dados sem nome",
|
||||
"268": "Atenção: o arquivo [%s] já excedeu [%d MB], o que pode causar queda de desempenho"
|
||||
"268": "Atenção: o arquivo [%s] já excedeu [%d MB], o que pode causar queda de desempenho",
|
||||
"269": "Este bloco já foi adicionado ao banco de dados [%s]",
|
||||
"270": "Otimizando o índice de dados, por favor aguarde...",
|
||||
"271": "Otimização do índice de dados concluída, [%s] de espaço liberado"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,8 @@
|
|||
{
|
||||
"vacuumDataIndex": "Оптимизация индекса",
|
||||
"vacuumDataIndexTip": "Проверить индекс данных, освободить место и повысить производительность индекса",
|
||||
"rebuildDataIndex": "Перестроить индекс",
|
||||
"rebuildDataIndexTip": "Полная перестройка индекса данных, это может занять некоторое время, пожалуйста, подождите",
|
||||
"displayFieldName": "Показать имя поля",
|
||||
"sortBySelectOption": "Сортировать по опции",
|
||||
"groupStep": "Интервал группировки",
|
||||
|
|
@ -1649,6 +1653,9 @@
|
|||
"265": "Вне диапазона",
|
||||
"266": "Tesseract OCR не установлен или не настроен, пожалуйста, обратитесь к Руководству пользователя - Раздел ресурсов для настройки",
|
||||
"267": "База данных не названа",
|
||||
"268": "Обратите внимание, что файл [%s] уже превышает [%d МБ], это может привести к снижению производительности"
|
||||
"268": "Обратите внимание, что файл [%s] уже превышает [%d МБ], это может привести к снижению производительности",
|
||||
"269": "Этот блок уже добавлен в базу данных [%s]",
|
||||
"270": "Оптимизация индекса данных, пожалуйста, подождите...",
|
||||
"271": "Оптимизация индекса данных завершена, освобождено [%s] дискового пространства"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,8 @@
|
|||
{
|
||||
"vacuumDataIndex": "優化索引",
|
||||
"vacuumDataIndexTip": "校驗資料索引,釋放儲存空間並提升索引效能",
|
||||
"rebuildDataIndex": "重建索引",
|
||||
"rebuildDataIndexTip": "完全重建資料索引,較為耗時,請耐心等待",
|
||||
"displayFieldName": "顯示欄位名稱",
|
||||
"sortBySelectOption": "按選項排序",
|
||||
"groupStep": "分組間隔",
|
||||
|
|
@ -1649,6 +1653,9 @@
|
|||
"265": "不在範圍內",
|
||||
"266": "Tesseract OCR 未安裝或未配置,請參考 用戶指南-資料文件 章節進行配置",
|
||||
"267": "未命名資料庫",
|
||||
"268": "請注意該檔案 [%s] 已經超過 [%d MB],可能會導致效能下降"
|
||||
"268": "請注意該檔案 [%s] 已經超過 [%d MB],可能會導致效能下降",
|
||||
"269": "該塊已經添加到資料庫 [%s] 中",
|
||||
"270": "正在優化資料索引,請稍等...",
|
||||
"271": "資料索引優化完畢,共釋放 [%s] 磁碟空間"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,8 @@
|
|||
{
|
||||
"vacuumDataIndex": "优化索引",
|
||||
"vacuumDataIndexTip": "校验数据索引,释放存储空间并提升索引性能",
|
||||
"rebuildDataIndex": "重建索引",
|
||||
"rebuildDataIndexTip": "完全重建数据索引,较为耗时,请耐心等待",
|
||||
"displayFieldName": "显示字段名称",
|
||||
"sortBySelectOption": "按选项排序",
|
||||
"groupStep": "分组间隔",
|
||||
|
|
@ -1649,6 +1653,9 @@
|
|||
"265": "不在范围内",
|
||||
"266": "Tesseract OCR 未安装或未配置,请参考 用户指南-资源文件 章节进行配置",
|
||||
"267": "未命名数据库",
|
||||
"268": "请注意该文件 [%s] 已经超过 [%d MB],可能会导致性能下降"
|
||||
"268": "请注意该文件 [%s] 已经超过 [%d MB],可能会导致性能下降",
|
||||
"269": "该块已经添加到数据库 [%s] 中",
|
||||
"270": "正在优化数据索引,请稍等...",
|
||||
"271": "数据索引优化完毕,共释放 [%s] 磁盘空间"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
"id": "20230405172236-pg3l9eu",
|
||||
"title": "Performance Optimization",
|
||||
"type": "doc",
|
||||
"updated": "20240420104851"
|
||||
"updated": "20250825114750"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
|
@ -379,7 +379,7 @@
|
|||
"HeadingLevel": 3,
|
||||
"Properties": {
|
||||
"id": "20230405172238-v4hbjbe",
|
||||
"updated": "20230405172238"
|
||||
"updated": "20250825114750"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
|
@ -637,6 +637,62 @@
|
|||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"ID": "20250825114750-j9t49j2",
|
||||
"Type": "NodeHeading",
|
||||
"HeadingLevel": 3,
|
||||
"Properties": {
|
||||
"id": "20250825114750-j9t49j2",
|
||||
"updated": "20250825114750"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "Optimizing the Index"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"ID": "20250825114750-qtm8i82",
|
||||
"Type": "NodeParagraph",
|
||||
"Properties": {
|
||||
"id": "20250825114750-qtm8i82",
|
||||
"updated": "20250825114750"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "It is recommended to regularly optimize the index by going to "
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "Settings"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": " - "
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "About"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": " - "
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "Optimize Index"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "."
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -7,7 +7,7 @@
|
|||
"id": "20230405155631-leo4vc6",
|
||||
"title": "性能优化",
|
||||
"type": "doc",
|
||||
"updated": "20240420104842"
|
||||
"updated": "20250825114628"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
|
@ -375,7 +375,7 @@
|
|||
"HeadingLevel": 3,
|
||||
"Properties": {
|
||||
"id": "20230405171407-ltaakx8",
|
||||
"updated": "20230405171419"
|
||||
"updated": "20250825114421"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
|
@ -633,6 +633,62 @@
|
|||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"ID": "20250825114421-fq73tbi",
|
||||
"Type": "NodeHeading",
|
||||
"HeadingLevel": 3,
|
||||
"Properties": {
|
||||
"id": "20250825114421-fq73tbi",
|
||||
"updated": "20250825114628"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "优化索引"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"ID": "20250825114436-jm8dekc",
|
||||
"Type": "NodeParagraph",
|
||||
"Properties": {
|
||||
"id": "20250825114436-jm8dekc",
|
||||
"updated": "20250825114628"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "建议定期执行优化索引 "
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "设置"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": " - "
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "关于"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": " - "
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "优化索引"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "。"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -7,7 +7,7 @@
|
|||
"id": "20230405172131-yb16aax",
|
||||
"title": "性能最佳化",
|
||||
"type": "doc",
|
||||
"updated": "20240420104915"
|
||||
"updated": "20250825114942"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
|
@ -379,7 +379,7 @@
|
|||
"HeadingLevel": 3,
|
||||
"Properties": {
|
||||
"id": "20230405172204-kitngfu",
|
||||
"updated": "20230405172204"
|
||||
"updated": "20250825114815"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
|
@ -637,6 +637,62 @@
|
|||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"ID": "20250825114815-of1bnnd",
|
||||
"Type": "NodeHeading",
|
||||
"HeadingLevel": 3,
|
||||
"Properties": {
|
||||
"id": "20250825114815-of1bnnd",
|
||||
"updated": "20250825114942"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "優化索引"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"ID": "20250825114815-ck2ln4u",
|
||||
"Type": "NodeParagraph",
|
||||
"Properties": {
|
||||
"id": "20250825114815-ck2ln4u",
|
||||
"updated": "20250825114936"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "建議定期執行最佳化索引 "
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "設定"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": " - "
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "關於"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": " - "
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "優化索引"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "。"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -8,7 +8,7 @@
|
|||
"id": "20240530101000-flot1gj",
|
||||
"title": "パフォーマンスの最適化",
|
||||
"type": "doc",
|
||||
"updated": "20250115145306"
|
||||
"updated": "20250825115021"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
|
@ -421,7 +421,7 @@
|
|||
"Properties": {
|
||||
"ID": "20240530101000-utjkzhs",
|
||||
"id": "20240530101000-9doivgv",
|
||||
"updated": "20250115145306"
|
||||
"updated": "20250825114907"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
|
@ -755,12 +755,60 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"ID": "20240530101000-9swho08",
|
||||
"ID": "20250825114907-tkuwv3h",
|
||||
"Type": "NodeHeading",
|
||||
"HeadingLevel": 3,
|
||||
"Properties": {
|
||||
"id": "20250825114907-tkuwv3h",
|
||||
"updated": "20250825115021"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "インデックスの最適化"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"ID": "20250825114907-av6973u",
|
||||
"Type": "NodeParagraph",
|
||||
"Properties": {
|
||||
"ID": "20240530101000-ugpv1is",
|
||||
"id": "20240530101000-9swho08"
|
||||
}
|
||||
"id": "20250825114907-av6973u",
|
||||
"updated": "20250825115021"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": ""
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "設定"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": " - "
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "バージョン情報"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": " - "
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "インデックスの最適化"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": " から、定期的にインデックスを最適化することをお勧めします。"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -156,6 +156,26 @@ export const about = {
|
|||
<input class="b3-text-field fn__flex-center fn__size200" min="1" type="number" id="retentionIndexesDaily" value="${window.siyuan.config.repo.retentionIndexesDaily}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="fn__flex b3-label config__item">
|
||||
<div class="fn__flex-1">
|
||||
${window.siyuan.languages.vacuumDataIndex}
|
||||
<div class="b3-label__text">${window.siyuan.languages.vacuumDataIndexTip}</div>
|
||||
</div>
|
||||
<div class="fn__space"></div>
|
||||
<button id="vacuumDataIndex" class="b3-button b3-button--outline fn__size200 fn__flex-center">
|
||||
<svg><use xlink:href="#iconRefresh"></use></svg>${window.siyuan.languages.vacuumDataIndex}
|
||||
</button>
|
||||
</div>
|
||||
<div class="fn__flex b3-label config__item">
|
||||
<div class="fn__flex-1">
|
||||
${window.siyuan.languages.rebuildDataIndex}
|
||||
<div class="b3-label__text">${window.siyuan.languages.rebuildDataIndexTip}</div>
|
||||
</div>
|
||||
<div class="fn__space"></div>
|
||||
<button id="rebuildDataIndex" class="b3-button b3-button--outline fn__size200 fn__flex-center">
|
||||
<svg><use xlink:href="#iconRefresh"></use></svg>${window.siyuan.languages.rebuildDataIndex}
|
||||
</button>
|
||||
</div>
|
||||
<div class="fn__flex b3-label config__item">
|
||||
<div class="fn__flex-1">
|
||||
${window.siyuan.languages.systemLog}
|
||||
|
|
@ -234,6 +254,12 @@ ${checkUpdateHTML}
|
|||
about.element.querySelector("#tokenTip").innerHTML = window.siyuan.languages.about14.replace("${token}", window.siyuan.config.api.token);
|
||||
});
|
||||
});
|
||||
about.element.querySelector("#vacuumDataIndex").addEventListener("click", () => {
|
||||
fetchPost("/api/system/vacuumDataIndex", {}, (response) => {});
|
||||
});
|
||||
about.element.querySelector("#rebuildDataIndex").addEventListener("click", () => {
|
||||
fetchPost("/api/system/rebuildDataIndex", {}, (response) => {});
|
||||
});
|
||||
about.element.querySelector("#exportLog").addEventListener("click", () => {
|
||||
fetchPost("/api/system/exportLog", {}, (response) => {
|
||||
openByMobile(response.data.zip);
|
||||
|
|
|
|||
|
|
@ -101,8 +101,8 @@ export const initConfigSearch = (element: HTMLElement, app: App) => {
|
|||
"systemLog", "importKey", "genKey", "genKeyByPW", "copyKey", "resetRepo", "systemLogTip", "export",
|
||||
"downloadLatestVer", "safeQuit", "directConnection", "siyuanNote", "key", "password", "copied", "resetRepoTip",
|
||||
"autoDownloadUpdatePkg", "autoDownloadUpdatePkgTip", "networkProxy", "keyPlaceholder", "initRepoKeyTip",
|
||||
"dataRepoPurge", "dataRepoPurgeTip", "dataRepoAutoPurgeIndexRetentionDays",
|
||||
"dataRepoAutoPurgeRetentionIndexesDaily"]),
|
||||
"dataRepoPurge", "dataRepoPurgeTip", "dataRepoAutoPurgeIndexRetentionDays", "dataRepoAutoPurgeRetentionIndexesDaily",
|
||||
"vacuumDataIndex", "vacuumDataIndexTip", "rebuildDataIndex", "rebuildDataIndexTip"]),
|
||||
];
|
||||
const inputElement = element.querySelector(".b3-form__icon input") as HTMLInputElement;
|
||||
/// #if !BROWSER
|
||||
|
|
|
|||
|
|
@ -386,7 +386,7 @@ export const transactionError = () => {
|
|||
export const refreshFileTree = (cb?: () => void) => {
|
||||
window.siyuan.storage[Constants.LOCAL_FILEPOSITION] = {};
|
||||
setStorageVal(Constants.LOCAL_FILEPOSITION, window.siyuan.storage[Constants.LOCAL_FILEPOSITION]);
|
||||
fetchPost("/api/filetree/refreshFiletree", {}, () => {
|
||||
fetchPost("/api/system/rebuildDataIndex", {}, () => {
|
||||
if (cb) {
|
||||
cb();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -94,6 +94,22 @@ export const initAbout = () => {
|
|||
<input class="b3-text-field fn__block" style="padding-right: 64px;" id="retentionIndexesDaily" min="1" type="number" class="b3-text-field" value="${window.siyuan.config.repo.retentionIndexesDaily}">
|
||||
<div class="b3-label__text">${window.siyuan.languages.dataRepoAutoPurgeRetentionIndexesDaily}</div>
|
||||
</div>
|
||||
<div class="b3-label">
|
||||
${window.siyuan.languages.vacuumDataIndex}
|
||||
<div class="fn__hr"></div>
|
||||
<button class="b3-button b3-button--outline fn__block" id="vacuumDataIndex">
|
||||
<svg><use xlink:href="#iconRefresh"></use></svg>${window.siyuan.languages.vacuumDataIndex}
|
||||
</button>
|
||||
<div class="b3-label__text">${window.siyuan.languages.vacuumDataIndexTip}</div>
|
||||
</div>
|
||||
<div class="b3-label">
|
||||
${window.siyuan.languages.rebuildDataIndex}
|
||||
<div class="fn__hr"></div>
|
||||
<button class="b3-button b3-button--outline fn__block" id="rebuildDataIndex">
|
||||
<svg><use xlink:href="#iconRefresh"></use></svg>${window.siyuan.languages.rebuildDataIndex}
|
||||
</button>
|
||||
<div class="b3-label__text">${window.siyuan.languages.rebuildDataIndexTip}</div>
|
||||
</div>
|
||||
<div class="b3-label">
|
||||
${window.siyuan.languages.systemLog}
|
||||
<div class="fn__hr"></div>
|
||||
|
|
@ -283,6 +299,16 @@ export const initAbout = () => {
|
|||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
break;
|
||||
} else if (target.id === "vacuumDataIndex") {
|
||||
fetchPost("/api/system/vacuumDataIndex", {}, (response) => {});
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
break;
|
||||
} else if (target.id === "rebuildDataIndex") {
|
||||
fetchPost("/api/system/rebuildDataIndex", {}, (response) => {});
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
break;
|
||||
} else if (target.id === "exportLog") {
|
||||
fetchPost("/api/system/exportLog", {}, (response) => {
|
||||
openByMobile(response.data.zip);
|
||||
|
|
|
|||
|
|
@ -351,7 +351,7 @@ func addAttributeViewBlocks(c *gin.Context) {
|
|||
ignoreDefaultFill = arg["ignoreDefaultFill"].(bool)
|
||||
}
|
||||
|
||||
err := model.AddAttributeViewBlock(nil, srcs, avID, blockID, groupID, previousID, ignoreDefaultFill)
|
||||
err := model.AddAttributeViewBlock(nil, srcs, avID, blockID, groupID, previousID, ignoreDefaultFill, map[string]interface{}{})
|
||||
if err != nil {
|
||||
ret.Code = -1
|
||||
ret.Msg = err.Error()
|
||||
|
|
|
|||
|
|
@ -221,13 +221,6 @@ func removeIndexes(c *gin.Context) {
|
|||
model.RemoveIndexes(paths)
|
||||
}
|
||||
|
||||
func refreshFiletree(c *gin.Context) {
|
||||
ret := gulu.Ret.NewResult()
|
||||
defer c.JSON(http.StatusOK, ret)
|
||||
|
||||
model.FullReindex()
|
||||
}
|
||||
|
||||
func doc2Heading(c *gin.Context) {
|
||||
ret := gulu.Ret.NewResult()
|
||||
defer c.JSON(http.StatusOK, ret)
|
||||
|
|
@ -548,15 +541,26 @@ func moveDocsByID(c *gin.Context) {
|
|||
}
|
||||
fromPaths = gulu.Str.RemoveDuplicatedElem(fromPaths)
|
||||
|
||||
var box *model.Box
|
||||
toTree, err := model.LoadTreeByBlockID(toID)
|
||||
if err != nil {
|
||||
ret.Code = -1
|
||||
ret.Msg = err.Error()
|
||||
ret.Data = map[string]interface{}{"closeTimeout": 7000}
|
||||
return
|
||||
box = model.Conf.Box(toID)
|
||||
if nil == box {
|
||||
ret.Code = -1
|
||||
ret.Msg = "can't found box or tree by id [" + toID + "]"
|
||||
ret.Data = map[string]interface{}{"closeTimeout": 7000}
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
var toNotebook, toPath string
|
||||
if nil != toTree {
|
||||
toNotebook = toTree.Box
|
||||
toPath = toTree.Path
|
||||
} else if nil != box {
|
||||
toNotebook = box.ID
|
||||
toPath = "/"
|
||||
}
|
||||
toNotebook := toTree.Box
|
||||
toPath := toTree.Path
|
||||
callback := arg["callback"]
|
||||
err = model.MoveDocs(fromPaths, toNotebook, toPath, callback)
|
||||
if err != nil {
|
||||
|
|
|
|||
|
|
@ -67,6 +67,8 @@ func ServeAPI(ginServer *gin.Engine) {
|
|||
ginServer.Handle("POST", "/api/system/reloadUI", model.CheckAuth, model.CheckAdminRole, model.CheckReadonly, reloadUI) // TODO 请使用 /api/ui/reloadUI,该端点计划于 2026 年 6 月 30 日后删除 https://github.com/siyuan-note/siyuan/issues/15308#issuecomment-3077675356
|
||||
ginServer.Handle("POST", "/api/system/addMicrosoftDefenderExclusion", model.CheckAuth, model.CheckAdminRole, model.CheckReadonly, addMicrosoftDefenderExclusion)
|
||||
ginServer.Handle("POST", "/api/system/ignoreAddMicrosoftDefenderExclusion", model.CheckAuth, model.CheckAdminRole, model.CheckReadonly, ignoreAddMicrosoftDefenderExclusion)
|
||||
ginServer.Handle("POST", "/api/system/vacuumDataIndex", model.CheckAuth, model.CheckAdminRole, model.CheckReadonly, vacuumDataIndex)
|
||||
ginServer.Handle("POST", "/api/system/rebuildDataIndex", model.CheckAuth, model.CheckAdminRole, model.CheckReadonly, rebuildDataIndex)
|
||||
|
||||
ginServer.Handle("POST", "/api/storage/setLocalStorage", model.CheckAuth, model.CheckAdminRole, model.CheckReadonly, setLocalStorage)
|
||||
ginServer.Handle("POST", "/api/storage/getLocalStorage", model.CheckAuth, getLocalStorage)
|
||||
|
|
@ -121,11 +123,11 @@ func ServeAPI(ginServer *gin.Engine) {
|
|||
ginServer.Handle("POST", "/api/filetree/doc2Heading", model.CheckAuth, model.CheckAdminRole, model.CheckReadonly, doc2Heading)
|
||||
ginServer.Handle("POST", "/api/filetree/heading2Doc", model.CheckAuth, model.CheckAdminRole, model.CheckReadonly, heading2Doc)
|
||||
ginServer.Handle("POST", "/api/filetree/li2Doc", model.CheckAuth, model.CheckAdminRole, model.CheckReadonly, li2Doc)
|
||||
ginServer.Handle("POST", "/api/filetree/refreshFiletree", model.CheckAuth, model.CheckAdminRole, model.CheckReadonly, refreshFiletree)
|
||||
ginServer.Handle("POST", "/api/filetree/upsertIndexes", model.CheckAuth, model.CheckAdminRole, model.CheckReadonly, upsertIndexes)
|
||||
ginServer.Handle("POST", "/api/filetree/removeIndexes", model.CheckAuth, model.CheckAdminRole, model.CheckReadonly, removeIndexes)
|
||||
ginServer.Handle("POST", "/api/filetree/listDocTree", model.CheckAuth, model.CheckAdminRole, model.CheckReadonly, listDocTree)
|
||||
ginServer.Handle("POST", "/api/filetree/moveLocalShorthands", model.CheckAuth, model.CheckAdminRole, model.CheckReadonly, moveLocalShorthands)
|
||||
ginServer.Handle("POST", "/api/filetree/refreshFiletree ", model.CheckAuth, model.CheckAdminRole, model.CheckReadonly, rebuildDataIndex) // TODO 请使用 /api/system/rebuildDataIndex,该端点计划于 2026 年 6 月 30 日后删除 https://github.com/siyuan-note/siyuan/issues/15663#issuecomment-3219296189
|
||||
|
||||
ginServer.Handle("POST", "/api/format/autoSpace", model.CheckAuth, model.CheckAdminRole, model.CheckReadonly, autoSpace)
|
||||
ginServer.Handle("POST", "/api/format/netImg2LocalAssets", model.CheckAuth, model.CheckAdminRole, model.CheckReadonly, netImg2LocalAssets)
|
||||
|
|
|
|||
|
|
@ -35,6 +35,20 @@ import (
|
|||
"github.com/siyuan-note/siyuan/kernel/util"
|
||||
)
|
||||
|
||||
func vacuumDataIndex(c *gin.Context) {
|
||||
ret := gulu.Ret.NewResult()
|
||||
defer c.JSON(http.StatusOK, ret)
|
||||
|
||||
model.VacuumDataIndex()
|
||||
}
|
||||
|
||||
func rebuildDataIndex(c *gin.Context) {
|
||||
ret := gulu.Ret.NewResult()
|
||||
defer c.JSON(http.StatusOK, ret)
|
||||
|
||||
model.FullReindex()
|
||||
}
|
||||
|
||||
func addMicrosoftDefenderExclusion(c *gin.Context) {
|
||||
ret := gulu.Ret.NewResult()
|
||||
defer c.JSON(http.StatusOK, ret)
|
||||
|
|
|
|||
|
|
@ -2958,14 +2958,18 @@ func setAttributeViewColumnCalc(operation *Operation) (err error) {
|
|||
}
|
||||
|
||||
func (tx *Transaction) doInsertAttrViewBlock(operation *Operation) (ret *TxErr) {
|
||||
err := AddAttributeViewBlock(tx, operation.Srcs, operation.AvID, operation.BlockID, operation.GroupID, operation.PreviousID, operation.IgnoreDefaultFill)
|
||||
if nil == operation.Context {
|
||||
operation.Context = map[string]interface{}{}
|
||||
}
|
||||
|
||||
err := AddAttributeViewBlock(tx, operation.Srcs, operation.AvID, operation.BlockID, operation.GroupID, operation.PreviousID, operation.IgnoreDefaultFill, operation.Context)
|
||||
if err != nil {
|
||||
return &TxErr{code: TxErrHandleAttributeView, id: operation.AvID, msg: err.Error()}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func AddAttributeViewBlock(tx *Transaction, srcs []map[string]interface{}, avID, dbBlockID, groupID, previousItemID string, ignoreDefaultFill bool) (err error) {
|
||||
func AddAttributeViewBlock(tx *Transaction, srcs []map[string]interface{}, avID, dbBlockID, groupID, previousItemID string, ignoreDefaultFill bool, context map[string]interface{}) (err error) {
|
||||
slices.Reverse(srcs) // https://github.com/siyuan-note/siyuan/issues/11286
|
||||
|
||||
now := time.Now().UnixMilli()
|
||||
|
|
@ -3000,14 +3004,14 @@ func AddAttributeViewBlock(tx *Transaction, srcs []map[string]interface{}, avID,
|
|||
if nil != src["content"] {
|
||||
srcContent = src["content"].(string)
|
||||
}
|
||||
if avErr := addAttributeViewBlock(now, avID, dbBlockID, groupID, previousItemID, srcItemID, boundBlockID, srcContent, isDetached, ignoreDefaultFill, tree, tx); nil != avErr {
|
||||
if avErr := addAttributeViewBlock(now, avID, dbBlockID, groupID, previousItemID, srcItemID, boundBlockID, srcContent, isDetached, ignoreDefaultFill, tree, tx, context); nil != avErr {
|
||||
return avErr
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func addAttributeViewBlock(now int64, avID, dbBlockID, groupID, previousItemID, addingItemID, addingBoundBlockID, addingBlockContent string, isDetached, ignoreDefaultFill bool, tree *parse.Tree, tx *Transaction) (err error) {
|
||||
func addAttributeViewBlock(now int64, avID, dbBlockID, groupID, previousItemID, addingItemID, addingBoundBlockID, addingBlockContent string, isDetached, ignoreDefaultFill bool, tree *parse.Tree, tx *Transaction, context map[string]interface{}) (err error) {
|
||||
var node *ast.Node
|
||||
if !isDetached {
|
||||
node = treenode.GetNodeInTree(tree, addingBoundBlockID)
|
||||
|
|
@ -3051,6 +3055,9 @@ func addAttributeViewBlock(now int64, avID, dbBlockID, groupID, previousItemID,
|
|||
blockValue.UpdatedAt = now
|
||||
err = av.SaveAttributeView(attrView)
|
||||
}
|
||||
|
||||
msg := fmt.Sprintf(Conf.language(269), getAttrViewName(attrView))
|
||||
util.PushMsg(msg, 5000)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -663,6 +663,49 @@ func normalizeTree(tree *parse.Tree) (yfmRootID, yfmTitle, yfmUpdated string) {
|
|||
return
|
||||
}
|
||||
|
||||
func VacuumDataIndex() {
|
||||
util.PushEndlessProgress(Conf.language(270))
|
||||
defer util.PushClearProgress()
|
||||
|
||||
var oldsyDbSize, newSyDbSize, oldHistoryDbSize, newHistoryDbSize, oldAssetContentDbSize, newAssetContentDbSize int64
|
||||
info, _ := os.Stat(util.DBPath)
|
||||
if nil != info {
|
||||
oldsyDbSize = info.Size()
|
||||
}
|
||||
info, _ = os.Stat(util.HistoryDBPath)
|
||||
if nil != info {
|
||||
oldHistoryDbSize = info.Size()
|
||||
}
|
||||
info, _ = os.Stat(util.AssetContentDBPath)
|
||||
if nil != info {
|
||||
oldAssetContentDbSize = info.Size()
|
||||
}
|
||||
|
||||
sql.Vacuum()
|
||||
|
||||
info, _ = os.Stat(util.DBPath)
|
||||
if nil != info {
|
||||
newSyDbSize = info.Size()
|
||||
}
|
||||
info, _ = os.Stat(util.HistoryDBPath)
|
||||
if nil != info {
|
||||
newHistoryDbSize = info.Size()
|
||||
}
|
||||
info, _ = os.Stat(util.AssetContentDBPath)
|
||||
if nil != info {
|
||||
newAssetContentDbSize = info.Size()
|
||||
}
|
||||
|
||||
logging.LogInfof("vacuum database [siyuan.db: %s -> %s, history.db: %s -> %s, asset_content.db: %s -> %s]",
|
||||
humanize.BytesCustomCeil(uint64(oldsyDbSize), 2), humanize.BytesCustomCeil(uint64(newSyDbSize), 2),
|
||||
humanize.BytesCustomCeil(uint64(oldHistoryDbSize), 2), humanize.BytesCustomCeil(uint64(newHistoryDbSize), 2),
|
||||
humanize.BytesCustomCeil(uint64(oldAssetContentDbSize), 2), humanize.BytesCustomCeil(uint64(newAssetContentDbSize), 2))
|
||||
|
||||
releaseSize := (oldsyDbSize - newSyDbSize) + (oldHistoryDbSize - newHistoryDbSize) + (oldAssetContentDbSize - newAssetContentDbSize)
|
||||
msg := fmt.Sprintf(Conf.language(271), humanize.BytesCustomCeil(uint64(releaseSize), 2))
|
||||
util.PushMsg(msg, 7000)
|
||||
}
|
||||
|
||||
func FullReindex() {
|
||||
task.AppendTask(task.DatabaseIndexFull, fullReindex)
|
||||
task.AppendTask(task.DatabaseIndexRef, IndexRefs)
|
||||
|
|
|
|||
|
|
@ -991,7 +991,7 @@ func DuplicateDoc(tree *parse.Tree) {
|
|||
AddAttributeViewBlock(nil, []map[string]interface{}{{
|
||||
"id": n.ID,
|
||||
"isDetached": false,
|
||||
}}, avID, "", "", "", false)
|
||||
}}, avID, "", "", "", false, map[string]interface{}{})
|
||||
ReloadAttrView(avID)
|
||||
}
|
||||
return ast.WalkContinue
|
||||
|
|
|
|||
|
|
@ -1099,7 +1099,7 @@ func (tx *Transaction) doLargeInsert(previousID string) (ret *TxErr) {
|
|||
AddAttributeViewBlock(tx, []map[string]interface{}{{
|
||||
"id": insertedNode.ID,
|
||||
"isDetached": false,
|
||||
}}, avID, "", "", previousID, false)
|
||||
}}, avID, "", "", previousID, false, map[string]interface{}{})
|
||||
ReloadAttrView(avID)
|
||||
}
|
||||
|
||||
|
|
@ -1284,7 +1284,7 @@ func (tx *Transaction) doInsert(operation *Operation) (ret *TxErr) {
|
|||
AddAttributeViewBlock(tx, []map[string]interface{}{{
|
||||
"id": insertedNode.ID,
|
||||
"isDetached": false,
|
||||
}}, avID, "", "", previousID, false)
|
||||
}}, avID, "", "", previousID, false, map[string]interface{}{})
|
||||
ReloadAttrView(avID)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1533,3 +1533,22 @@ func SQLTemplateFuncs(templateFuncMap *template.FuncMap) {
|
|||
return
|
||||
}
|
||||
}
|
||||
|
||||
func Vacuum() {
|
||||
if nil != db {
|
||||
if _, err := db.Exec("VACUUM"); nil != err {
|
||||
logging.LogErrorf("vacuum database failed: %s", err)
|
||||
}
|
||||
}
|
||||
if nil != historyDB {
|
||||
if _, err := historyDB.Exec("VACUUM"); nil != err {
|
||||
logging.LogErrorf("vacuum history database failed: %s", err)
|
||||
}
|
||||
}
|
||||
if nil != assetContentDB {
|
||||
if _, err := assetContentDB.Exec("VACUUM"); nil != err {
|
||||
logging.LogErrorf("vacuum asset content database failed: %s", err)
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue