mirror of
https://github.com/flynx/pWiki.git
synced 2025-10-30 10:30:08 +00:00
more work on file store...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
parent
c24af7eaee
commit
1c6cceb61b
135
pwiki2.js
135
pwiki2.js
@ -766,6 +766,7 @@ var FILESTORE_OPTIONS = {
|
|||||||
|
|
||||||
clearEmptyDir: true,
|
clearEmptyDir: true,
|
||||||
dirToFile: true,
|
dirToFile: true,
|
||||||
|
cleanBackup: true,
|
||||||
|
|
||||||
verbose: true,
|
verbose: true,
|
||||||
}
|
}
|
||||||
@ -823,14 +824,88 @@ async function(base, sub, options){
|
|||||||
return target ?
|
return target ?
|
||||||
fs.promises.readFile(target, {encoding: 'utf-8'})
|
fs.promises.readFile(target, {encoding: 'utf-8'})
|
||||||
: undefined }
|
: undefined }
|
||||||
// XXX
|
// NOTE: backing up ** will include nested backups...
|
||||||
|
// XXX add versioning...
|
||||||
var backup =
|
var backup =
|
||||||
module.backup =
|
module.backup =
|
||||||
async function(base, sub, options){
|
async function(base, sub, options){
|
||||||
var {index, backup} =
|
var {index, backup, verbose, recursive, cleanBackup} =
|
||||||
Object.assign({},
|
Object.assign({},
|
||||||
FILESTORE_OPTIONS,
|
FILESTORE_OPTIONS,
|
||||||
options ?? {})
|
options ?? {})
|
||||||
|
recursive = recursive ?? false
|
||||||
|
|
||||||
|
var _backup = backup
|
||||||
|
backup =
|
||||||
|
module.path.join(
|
||||||
|
base,
|
||||||
|
module.path.relative(sub, backup))
|
||||||
|
|
||||||
|
// ** or * -- backup each file in path...
|
||||||
|
if(/[\\\/]*\*\*?$/.test(sub)){
|
||||||
|
if(cleanBackup
|
||||||
|
&& fs.existsSync(backup)){
|
||||||
|
verbose
|
||||||
|
&& console.log('backup(..): cleaning:', backup)
|
||||||
|
await fs.promises.rm(backup, {recursive: true}) }
|
||||||
|
if(sub.endsWith('**')){
|
||||||
|
options = {
|
||||||
|
...(options ?? {}),
|
||||||
|
recursive: true,
|
||||||
|
} }
|
||||||
|
sub = sub.replace(/[\\\/]*\*\*?$/, '')
|
||||||
|
// XXX should we ignore only the first element (current) or the sub-path???
|
||||||
|
var b = module.path.split(_backup)
|
||||||
|
.filter(function(p){
|
||||||
|
return p != '' })
|
||||||
|
.shift()
|
||||||
|
return fs.promises.readdir(base +'/'+ sub)
|
||||||
|
.iter()
|
||||||
|
// skip backups...
|
||||||
|
.filter(function(file){
|
||||||
|
return !file.includes(b) })
|
||||||
|
.map(async function(file){
|
||||||
|
return await module.backup(base, sub +'/'+ file, options) })
|
||||||
|
// keep only the paths we backed up...
|
||||||
|
.filter(function(e){
|
||||||
|
return !!e })
|
||||||
|
|
||||||
|
// backup single page...
|
||||||
|
} else {
|
||||||
|
var target = module.path.join(base, sub)
|
||||||
|
var full = _backup[0] == '/'
|
||||||
|
|
||||||
|
// nothing to backup...
|
||||||
|
if(!fs.existsSync(target)){
|
||||||
|
verbose
|
||||||
|
&& console.log('backup(..): target does not exist:', target)
|
||||||
|
return }
|
||||||
|
|
||||||
|
if(!recursive){
|
||||||
|
var stat = await fs.promises.stat(target)
|
||||||
|
if(stat.isDirectory()){
|
||||||
|
sub += '/'+index
|
||||||
|
target += '/'+index
|
||||||
|
// nothing to backup...
|
||||||
|
if(!fs.existsSync(target)){
|
||||||
|
verbose
|
||||||
|
&& console.log('backup(..): nothing to backup:', target)
|
||||||
|
return } } }
|
||||||
|
|
||||||
|
var to = full ?
|
||||||
|
backup +'/'+ sub
|
||||||
|
: backup +'/'+ module.path.basename(sub)
|
||||||
|
var todir = module.path.dirname(to)
|
||||||
|
|
||||||
|
verbose
|
||||||
|
&& console.log('backup(..):', sub, '->', to)
|
||||||
|
await fs.promises.mkdir(todir, {recursive: true})
|
||||||
|
await fs.promises.cp(target, to, {force: true, recursive})
|
||||||
|
return to } }
|
||||||
|
// XXX
|
||||||
|
var restore =
|
||||||
|
module.restore =
|
||||||
|
async function(base, sub, options){
|
||||||
// XXX
|
// XXX
|
||||||
}
|
}
|
||||||
var mkdir =
|
var mkdir =
|
||||||
@ -989,18 +1064,13 @@ async function(base, options){
|
|||||||
} } }) }
|
} } }) }
|
||||||
|
|
||||||
|
|
||||||
// XXX add a lock file and prevent multiple adapters from controlling
|
// XXX add monitor API + cache + live mode (auto on when lock detected)...
|
||||||
// one path...
|
var FileStoreRO =
|
||||||
// XXX add monitor API...
|
module.FileStoreRO = {
|
||||||
// XXX backup files on write/delete...
|
|
||||||
// XXX do a r/o version...
|
|
||||||
var FileStore =
|
|
||||||
module.FileStore = {
|
|
||||||
__proto__: BaseStore,
|
__proto__: BaseStore,
|
||||||
|
|
||||||
// XXX
|
// XXX
|
||||||
__path__: 'store/fs',
|
__path__: 'store/fs',
|
||||||
__backup_path__: '/.backup',
|
|
||||||
|
|
||||||
// XXX should this be "index" or ".index"???
|
// XXX should this be "index" or ".index"???
|
||||||
__directory_text__: '.index',
|
__directory_text__: '.index',
|
||||||
@ -1032,6 +1102,25 @@ module.FileStore = {
|
|||||||
ctime: ctimeMs,
|
ctime: ctimeMs,
|
||||||
text: await module.read(p, {index: this.__directory_text__})
|
text: await module.read(p, {index: this.__directory_text__})
|
||||||
} },
|
} },
|
||||||
|
|
||||||
|
__update__: function(){},
|
||||||
|
__delete__: function(){},
|
||||||
|
}
|
||||||
|
|
||||||
|
// XXX add a lock file and prevent multiple adapters from controlling
|
||||||
|
// one path...
|
||||||
|
// XXX backup files on write/delete...
|
||||||
|
var FileStore =
|
||||||
|
module.FileStore = {
|
||||||
|
__proto__: FileStoreRO,
|
||||||
|
|
||||||
|
// XXX
|
||||||
|
__path__: 'store/fs',
|
||||||
|
__backup_path__: '/.backup',
|
||||||
|
|
||||||
|
// XXX should this be "index" or ".index"???
|
||||||
|
__directory_text__: '.index',
|
||||||
|
|
||||||
// XXX BUG: meta-store: writing to this creates a root path rather than a file...
|
// XXX BUG: meta-store: writing to this creates a root path rather than a file...
|
||||||
// XXX do we write all the data or only the .text???
|
// XXX do we write all the data or only the .text???
|
||||||
__update__: async function(path, data, mode='update'){
|
__update__: async function(path, data, mode='update'){
|
||||||
@ -1043,9 +1132,35 @@ module.FileStore = {
|
|||||||
return module.clear(
|
return module.clear(
|
||||||
this.__path__, path,
|
this.__path__, path,
|
||||||
{index: this.__directory_text__}) },
|
{index: this.__directory_text__}) },
|
||||||
|
|
||||||
|
// specific API...
|
||||||
|
cleanup: async function(options={}){
|
||||||
|
return module.cleanup(this.__path__, {
|
||||||
|
index: this.__directory_text__,
|
||||||
|
...options,
|
||||||
|
}) },
|
||||||
|
// XXX should these be generic???
|
||||||
|
// XXX add versioning...
|
||||||
|
backup: async function(path='**', options={}){
|
||||||
|
return module.backup(
|
||||||
|
this.__path__, path,
|
||||||
|
{
|
||||||
|
index: this.__directory_text__,
|
||||||
|
backup: this.__backup_path__,
|
||||||
|
...options,
|
||||||
|
}) },
|
||||||
|
restore: async function(path='**', options={}){
|
||||||
|
return module.restore(
|
||||||
|
this.__path__, path,
|
||||||
|
{
|
||||||
|
index: this.__directory_text__,
|
||||||
|
backup: this.__backup_path__,
|
||||||
|
...options,
|
||||||
|
}) },
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user