mirror of
https://github.com/openeggbert/bit-backup.git
synced 2025-03-25 15:37:53 +01:00
Renamed to Bit Backup
This commit is contained in:
parent
ef26009a09
commit
af0c107d6a
4
CREDITS
4
CREDITS
@ -1,5 +1,5 @@
|
|||||||
This file partially lists people, that have contributed to
|
This file partially lists people, that have contributed to
|
||||||
the "Bit Inspector" project. They are sorted by name.
|
the "Bit Backup" project. They are sorted by name.
|
||||||
The fields are: name (N), e-mail (E), web-address (W),
|
The fields are: name (N), e-mail (E), web-address (W),
|
||||||
PGP key ID and fingerprint (P), description (D) and
|
PGP key ID and fingerprint (P), description (D) and
|
||||||
snail-mail address (S).
|
snail-mail address (S).
|
||||||
@ -9,7 +9,7 @@
|
|||||||
----------
|
----------
|
||||||
|
|
||||||
N: Robert Vokac
|
N: Robert Vokac
|
||||||
E: robertvokac@nanoboot.org
|
E: mail@robertvokac.com
|
||||||
W: https://nanoboot.org
|
W: https://nanoboot.org
|
||||||
P: 4096R/E3329055 322B D109 0AA8 C324 EA9C 72F5 693D 30BE E332 9055
|
P: 4096R/E3329055 322B D109 0AA8 C324 EA9C 72F5 693D 30BE E332 9055
|
||||||
D: Founder
|
D: Founder
|
||||||
|
2
Jenkinsfile
vendored
2
Jenkinsfile
vendored
@ -1,6 +1,6 @@
|
|||||||
pipeline
|
pipeline
|
||||||
/*
|
/*
|
||||||
Bit Inspector
|
Bit Backup
|
||||||
|
|
||||||
Requirements:
|
Requirements:
|
||||||
|
|
||||||
|
142
README.md
142
README.md
@ -1,27 +1,27 @@
|
|||||||
# bit-inspector
|
# bit-backup
|
||||||
|
|
||||||
"Bit Inspector" (Bir) is a tool to manage files.
|
"Bit Backup" (Bib) is a tool to manage files.
|
||||||
|
|
||||||
## How to run
|
## How to run
|
||||||
|
|
||||||
Requirements to run "Bit Inspector":
|
Requirements to run "Bit Backup":
|
||||||
* Java 21
|
* Java 21
|
||||||
|
|
||||||
### How to setup your environment on Linux
|
### How to setup your environment on Linux
|
||||||
|
|
||||||
Add to your .bashrc:
|
Add to your .bashrc:
|
||||||
|
|
||||||
alias bir='java -jar {path to bit-inspector jar with dependencies file}/bit-inspector-0.0.0-SNAPSHOT-jar-with-dependencies.jar'
|
alias bib='java -jar {path to bit-backup jar with dependencies file}/bit-backup-0.0.0-SNAPSHOT-jar-with-dependencies.jar'
|
||||||
|
|
||||||
## How to build
|
## How to build
|
||||||
|
|
||||||
Requirements to build "Bit Inspector:
|
Requirements to build "Bit Backup:
|
||||||
* Java 21
|
* Java 21
|
||||||
* Maven
|
* Maven
|
||||||
|
|
||||||
```
|
```
|
||||||
git clone https://code.nanoboot.org/nanoboot/bit-inspector
|
git clone https://code.nanoboot.org/nanoboot/bit-backup
|
||||||
cd bit-inspector
|
cd bit-backup
|
||||||
mvn clean install
|
mvn clean install
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -40,21 +40,21 @@ Inspired by:
|
|||||||
* https://github.com/ambv/bitrot
|
* https://github.com/ambv/bitrot
|
||||||
* https://github.com/laktak/chkbit-py
|
* https://github.com/laktak/chkbit-py
|
||||||
|
|
||||||
#### File .birignore
|
#### File .bibignore
|
||||||
|
|
||||||
You can create file .birignore containing the names of the files/directories you wish to ignore
|
You can create file .bibignore containing the names of the files/directories you wish to ignore
|
||||||
* .birignore is similar to Git file .gitignore
|
* .bibignore is similar to Git file .gitignore
|
||||||
* each line should contain exactly one name
|
* each line should contain exactly one name
|
||||||
* lines starting with # are skipped
|
* lines starting with # are skipped
|
||||||
* you may use Unix shell-style wildcards
|
* you may use Unix shell-style wildcards
|
||||||
|
|
||||||
#### File .bir.sqlite3
|
#### File .bib.sqlite3
|
||||||
|
|
||||||
An SQLite database created and managed automatically by bit-inspector.
|
An SQLite database created and managed automatically by bit-backup.
|
||||||
|
|
||||||
#### File .bir.sqlite3.sha512
|
#### File .bib.sqlite3.sha512
|
||||||
|
|
||||||
Last calculated hash sum of file ".bir.sqlite3"
|
Last calculated hash sum of file ".bib.sqlite3"
|
||||||
|
|
||||||
### Feature 2 : Backup of files
|
### Feature 2 : Backup of files
|
||||||
|
|
||||||
@ -62,9 +62,9 @@ Inspired by Git, but goals are slightly different.
|
|||||||
* https://github.com/joshnh/Git-Commands
|
* https://github.com/joshnh/Git-Commands
|
||||||
* https://git-scm.com/docs
|
* https://git-scm.com/docs
|
||||||
|
|
||||||
#### File .birbackup
|
#### File .bibbackup
|
||||||
|
|
||||||
File .birbackup is stored in local directory, which you are going to backup.
|
File .bibbackup is stored in local directory, which you are going to backup.
|
||||||
|
|
||||||
Content:
|
Content:
|
||||||
|
|
||||||
@ -74,45 +74,45 @@ remotes=remote1,remote2,remote3
|
|||||||
|
|
||||||
#### Features
|
#### Features
|
||||||
|
|
||||||
* Backing up directory to another location like: local, FTP(S), SFTP, HTTP(S), S3, Bir server and others
|
* Backing up directory to another location like: local, FTP(S), SFTP, HTTP(S), S3, Bib server and others
|
||||||
* Optionally you can set a password to protect your files (if a not trusted external location like FTP or S3 is used)
|
* Optionally you can set a password to protect your files (if a not trusted external location like FTP or S3 is used)
|
||||||
|
|
||||||
* Files are handled in a "Bir repository"
|
* Files are handled in a "Bib repository"
|
||||||
|
|
||||||
#### What is not supported
|
#### What is not supported
|
||||||
|
|
||||||
* Conflict resolution is not supported. (If you wish something not yet supported to be added, please, let's start a discussion here or at forum.nanoboot.org)
|
* Conflict resolution is not supported. (If you wish something not yet supported to be added, please, let's start a discussion here or at forum.nanoboot.org)
|
||||||
* "Bir" is not intended to be used by many read/write users.
|
* "Bib" is not intended to be used by many read/write users.
|
||||||
* Several people changing one Bir repository must be avoided.
|
* Several people changing one Bib repository must be avoided.
|
||||||
* "Bir" is not intended to be used by many read users and only one read/write user.
|
* "Bib" is not intended to be used by many read users and only one read/write user.
|
||||||
* One Bir repository can be used by more users, but only one user can change it.
|
* One Bib repository can be used by more users, but only one user can change it.
|
||||||
* Branches are not supported
|
* Branches are not supported
|
||||||
|
|
||||||
## Bir repository
|
## Bib repository
|
||||||
|
|
||||||
* Your files are versioned. You can travel in history and return to an older version of the whole repo or only a changed/deleted directory or file.
|
* Your files are versioned. You can travel in history and return to an older version of the whole repo or only a changed/deleted directory or file.
|
||||||
|
|
||||||
You can:
|
You can:
|
||||||
* clone a remote Bir repository
|
* clone a remote Bib repository
|
||||||
* or use an existing local Bir repository
|
* or use an existing local Bib repository
|
||||||
* or create a new empty Bir repository
|
* or create a new empty Bib repository
|
||||||
* or create a new Bir repository using an existing directory
|
* or create a new Bib repository using an existing directory
|
||||||
* or save your local repository to a remote repository.
|
* or save your local repository to a remote repository.
|
||||||
|
|
||||||
### Structure
|
### Structure
|
||||||
|
|
||||||
#### Directory .bir/objects
|
#### Directory .bib/objects
|
||||||
|
|
||||||
.bir/objects/{??}/{?????...}
|
.bib/objects/{??}/{?????...}
|
||||||
|
|
||||||
#### Directory .bir/pack
|
#### Directory .bib/pack
|
||||||
.bir/pack/pack-{sha-512}.pack
|
.bib/pack/pack-{sha-512}.pack
|
||||||
|
|
||||||
{sha-512}::::{length in bytes}::::{sha-512}::::{length in bytes}::::{sha-512}::::{length in bytes}::::{sha-512}::::{length in bytes}::::{sha-512}::::{length in bytes}::::::::{bytes -base}{bytes-incremental}{bytes-incremental}{bytes-incremental}{bytes-incremental}{bytes-incremental}
|
{sha-512}::::{length in bytes}::::{sha-512}::::{length in bytes}::::{sha-512}::::{length in bytes}::::{sha-512}::::{length in bytes}::::{sha-512}::::{length in bytes}::::::::{bytes -base}{bytes-incremental}{bytes-incremental}{bytes-incremental}{bytes-incremental}{bytes-incremental}
|
||||||
|
|
||||||
binary diffs
|
binary diffs
|
||||||
|
|
||||||
#### File .bir/birindex.{number}
|
#### File .bib/bibindex.{number}
|
||||||
|
|
||||||
https://stackabuse.com/linux-display-file-properties-via-terminal/
|
https://stackabuse.com/linux-display-file-properties-via-terminal/
|
||||||
|
|
||||||
@ -151,9 +151,9 @@ no permission - 0
|
|||||||
```
|
```
|
||||||
|
|
||||||
```
|
```
|
||||||
Creates local .birindex
|
Creates local .bibindex
|
||||||
|
|
||||||
Downloads remote .birindex – if does not exist, empty file will be returned.
|
Downloads remote .bibindex – if does not exist, empty file will be returned.
|
||||||
|
|
||||||
Compares these indexes, uploads new blobs to object addressed system (SHA-512) – packaged to 7z archives (compression=ultra + other settings)
|
Compares these indexes, uploads new blobs to object addressed system (SHA-512) – packaged to 7z archives (compression=ultra + other settings)
|
||||||
|
|
||||||
@ -162,13 +162,13 @@ The most reliable way would be to make md5 hashes of all the local files you car
|
|||||||
Using file sizes isn't reliable for the obvious reason - a file could change but have the same size. I'm not a fan of using the archive bit or modified date because either of those could be confused if you backup or restore your local directory with another backup program.
|
Using file sizes isn't reliable for the obvious reason - a file could change but have the same size. I'm not a fan of using the archive bit or modified date because either of those could be confused if you backup or restore your local directory with another backup program.
|
||||||
```
|
```
|
||||||
|
|
||||||
#### File .bir/birlog
|
#### File .bib/biblog
|
||||||
|
|
||||||
Contains index number of last bir index.
|
Contains index number of last bib index.
|
||||||
|
|
||||||
#### file .bir/description
|
#### file .bib/description
|
||||||
|
|
||||||
#### File .bir/config
|
#### File .bib/config
|
||||||
|
|
||||||
```
|
```
|
||||||
pack-file.files-until-size.mb=100
|
pack-file.files-until-size.mb=100
|
||||||
@ -177,11 +177,11 @@ pack-file.max-size.mb=1000
|
|||||||
|
|
||||||
## Commands
|
## Commands
|
||||||
|
|
||||||
bir {command} [{arg1} {arg2} {argn}]
|
bib {command} [{arg1} {arg2} {argn}]
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
```
|
```
|
||||||
bir clone path=/home/johndoe/mydir url={local path or s3 bucket or FTP server or website url}
|
bib clone path=/home/johndoe/mydir url={local path or s3 bucket or FTP server or website url}
|
||||||
```
|
```
|
||||||
Arguments
|
Arguments
|
||||||
|
|
||||||
@ -196,49 +196,49 @@ Checks for bitrots in current directory
|
|||||||
### clone : Cloning a remote repo
|
### clone : Cloning a remote repo
|
||||||
|
|
||||||
```
|
```
|
||||||
bir clone {url} [[--bare]] [[revision number|tag]]
|
bib clone {url} [[--bare]] [[revision number|tag]]
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Local
|
#### Local
|
||||||
|
|
||||||
```
|
```
|
||||||
bir clone {path to another local Bir repository - path to directory}
|
bib clone {path to another local Bib repository - path to directory}
|
||||||
```
|
```
|
||||||
|
|
||||||
#### S3
|
#### S3
|
||||||
```
|
```
|
||||||
bir clone s3://http[s]://{endpoint url}/{bucket name}
|
bib clone s3://http[s]://{endpoint url}/{bucket name}
|
||||||
```
|
```
|
||||||
Then you will be asked for access key and secret key.
|
Then you will be asked for access key and secret key.
|
||||||
|
|
||||||
#### FTP/FTPS/SFTP
|
#### FTP/FTPS/SFTP
|
||||||
|
|
||||||
```
|
```
|
||||||
bir clone {protocol}://[{user}:{password}]@{host url}:{port}/{directory}
|
bib clone {protocol}://[{user}:{password}]@{host url}:{port}/{directory}
|
||||||
```
|
```
|
||||||
|
|
||||||
#### HTTP/HTTPS
|
#### HTTP/HTTPS
|
||||||
|
|
||||||
```
|
```
|
||||||
bir clone http[s]://[{user}:{password}]@{host url}:{port}/{directory}
|
bib clone http[s]://[{user}:{password}]@{host url}:{port}/{directory}
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Bir server (via Rest api)
|
#### Bib server (via Rest api)
|
||||||
|
|
||||||
```
|
```
|
||||||
bir clone bir:://[{user}:{password}]@{host url}:{port}/[path to repository/]{repository name}
|
bib clone bib:://[{user}:{password}]@{host url}:{port}/[path to repository/]{repository name}
|
||||||
```
|
```
|
||||||
|
|
||||||
### init
|
### init
|
||||||
|
|
||||||
Init commands creates new directory .bir with its structure
|
Init commands creates new directory .bib with its structure
|
||||||
|
|
||||||
```
|
```
|
||||||
bir init [[--bare]]
|
bib init [[--bare]]
|
||||||
```
|
```
|
||||||
|
|
||||||
* Creating a new empty Bir repository
|
* Creating a new empty Bib repository
|
||||||
* Creating a Bir repository using an existing directory
|
* Creating a Bib repository using an existing directory
|
||||||
|
|
||||||
### help
|
### help
|
||||||
|
|
||||||
@ -257,7 +257,7 @@ bir init [[--bare]]
|
|||||||
### blame
|
### blame
|
||||||
|
|
||||||
```
|
```
|
||||||
bir blame {file} {remote}
|
bib blame {file} {remote}
|
||||||
```
|
```
|
||||||
|
|
||||||
### clean
|
### clean
|
||||||
@ -265,7 +265,7 @@ bir blame {file} {remote}
|
|||||||
### gc
|
### gc
|
||||||
|
|
||||||
```
|
```
|
||||||
bir gc abc
|
bib gc abc
|
||||||
```
|
```
|
||||||
|
|
||||||
### fsck
|
### fsck
|
||||||
@ -277,13 +277,13 @@ bir gc abc
|
|||||||
### remote add {remote name}
|
### remote add {remote name}
|
||||||
|
|
||||||
```
|
```
|
||||||
bir remote add {remote name}
|
bib remote add {remote name}
|
||||||
```
|
```
|
||||||
|
|
||||||
```
|
```
|
||||||
bir remote add abc protocol://user:pw|{}@host:port/directory[::password=encryption_password|{}::duplicate_count=1::exclude=::include=::]
|
bib remote add abc protocol://user:pw|{}@host:port/directory[::password=encryption_password|{}::duplicate_count=1::exclude=::include=::]
|
||||||
bir remote add wedos_disk_100gb_backup user:pw@host:port/directory::password=123::duplicate_count=2
|
bib remote add wedos_disk_100gb_backup user:pw@host:port/directory::password=123::duplicate_count=2
|
||||||
bir remote add abc user:pw|{}@host:port/directory::password=encryption_password|{}::duplicate_count={1, 0 is default}::compression_level={0-9,5 is default}
|
bib remote add abc user:pw|{}@host:port/directory::password=encryption_password|{}::duplicate_count={1, 0 is default}::compression_level={0-9,5 is default}
|
||||||
```
|
```
|
||||||
|
|
||||||
{} placeholders means, that user will be asked in console (to avoid the password to be in console history)
|
{} placeholders means, that user will be asked in console (to avoid the password to be in console history)
|
||||||
@ -291,41 +291,41 @@ bir remote add abc user:pw|{}@host:port/directory::password=encryption_password|
|
|||||||
### remote remove {remote name}
|
### remote remove {remote name}
|
||||||
|
|
||||||
```
|
```
|
||||||
bir remote remove abc
|
bib remote remove abc
|
||||||
```
|
```
|
||||||
|
|
||||||
### bir commit
|
### bib commit
|
||||||
|
|
||||||
```
|
```
|
||||||
bir commit [-m "{message}"]
|
bib commit [-m "{message}"]
|
||||||
```
|
```
|
||||||
|
|
||||||
### bir mirror {remote name}
|
### bib mirror {remote name}
|
||||||
|
|
||||||
```
|
```
|
||||||
bir mirror abc def ghi [-m message -t TAG]
|
bib mirror abc def ghi [-m message -t TAG]
|
||||||
bir mirror @all
|
bib mirror @all
|
||||||
```
|
```
|
||||||
|
|
||||||
### bir fetch
|
### bib fetch
|
||||||
|
|
||||||
### bir pull
|
### bib pull
|
||||||
|
|
||||||
### bir log
|
### bib log
|
||||||
|
|
||||||
### bir diff
|
### bib diff
|
||||||
|
|
||||||
### bir prune
|
### bib prune
|
||||||
|
|
||||||
```
|
```
|
||||||
bir prune origin --since 2021-10-04
|
bib prune origin --since 2021-10-04
|
||||||
bir prune abc --since "2 months ago" | 10 … does not delete anything, only marks objects to be deleted
|
bib prune abc --since "2 months ago" | 10 … does not delete anything, only marks objects to be deleted
|
||||||
```
|
```
|
||||||
|
|
||||||
### verify
|
### verify
|
||||||
|
|
||||||
```
|
```
|
||||||
bir verify abc
|
bib verify abc
|
||||||
```
|
```
|
||||||
|
|
||||||
### repack
|
### repack
|
||||||
|
14
pom.xml
14
pom.xml
@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!--
|
<!--
|
||||||
bit-inspector: Tool detecting bit rots in files.
|
bit-backup: Tool detecting bit rots in files.
|
||||||
Copyright (C) 2016-2022 the original author or authors.
|
Copyright (C) 2016-2022 the original author or authors.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or
|
This program is free software; you can redistribute it and/or
|
||||||
@ -25,15 +25,15 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.nanoboot.essential</groupId>
|
<groupId>org.nanoboot.essential</groupId>
|
||||||
<artifactId>nanoboot-parent</artifactId>
|
<artifactId>nanoboot-parent</artifactId>
|
||||||
<version>0.1.1</version>
|
<version>0.1.1-SNAPSHOT</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<groupId>org.nanoboot.tools</groupId>
|
<groupId>org.nanoboot.tools</groupId>
|
||||||
<artifactId>bit-inspector</artifactId>
|
<artifactId>bit-backup</artifactId>
|
||||||
<version>0.0.0-SNAPSHOT</version>
|
<version>0.0.0-SNAPSHOT</version>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
<name>Bit Inspector</name>
|
<name>Bit Backup</name>
|
||||||
<description>Tool detecting bit rots in files.</description>
|
<description>Tool detecting bit rots in files.</description>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
@ -81,7 +81,7 @@
|
|||||||
<configuration>
|
<configuration>
|
||||||
<archive>
|
<archive>
|
||||||
<manifest>
|
<manifest>
|
||||||
<mainClass>org.nanoboot.bitinspector.core.Main</mainClass>
|
<mainClass>org.nanoboot.bitbackup.core.Main</mainClass>
|
||||||
</manifest>
|
</manifest>
|
||||||
</archive>
|
</archive>
|
||||||
<descriptorRefs>
|
<descriptorRefs>
|
||||||
@ -121,8 +121,8 @@
|
|||||||
<configuration>
|
<configuration>
|
||||||
<resources>
|
<resources>
|
||||||
<resource>
|
<resource>
|
||||||
<directory>src/main/resources/db_migrations/sqlite/bitinspector</directory>
|
<directory>src/main/resources/db_migrations/sqlite/bitbackup</directory>
|
||||||
<targetPath>db_migrations/sqlite/bitinspector</targetPath>
|
<targetPath>db_migrations/sqlite/bitbackup</targetPath>
|
||||||
<includes>
|
<includes>
|
||||||
<include>*.sql</include>
|
<include>*.sql</include>
|
||||||
</includes>
|
</includes>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// bit-inspector: Tool detecting bit rots in files.
|
// bit-backup: Tool detecting bit rots in files.
|
||||||
// Copyright (C) 2016-2022 the original author or authors.
|
// Copyright (C) 2016-2022 the original author or authors.
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
@ -17,7 +17,7 @@
|
|||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
module bitinspector {
|
module bitbackup {
|
||||||
requires org.apache.commons.io;
|
requires org.apache.commons.io;
|
||||||
requires lombok;
|
requires lombok;
|
||||||
requires org.apache.logging.log4j;
|
requires org.apache.logging.log4j;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// bit-inspector: Tool detecting bit rots in files.
|
// bit-backup: Tool detecting bit rots in files.
|
||||||
// Copyright (C) 2023-2023 the original author or authors.
|
// Copyright (C) 2023-2023 the original author or authors.
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
@ -16,36 +16,37 @@
|
|||||||
// along with this program; if not, write to the Free Software
|
// along with this program; if not, write to the Free Software
|
||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
package org.nanoboot.bitinspector.commands;
|
package org.nanoboot.bitbackup.commands;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
import org.nanoboot.bitinspector.core.Utils;
|
import org.nanoboot.bitbackup.core.Utils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author <a href="mailto:robertvokac@nanoboot.org">Robert Vokac</a>
|
* @author <a href="mailto:mail@robertvokac.com">Robert Vokac</a>
|
||||||
*/
|
*/
|
||||||
public class BirIgnoreRegex implements Predicate<String> {
|
public class BibIgnoreRegex implements Predicate<String> {
|
||||||
|
|
||||||
private final List<String> patterns = new ArrayList<>();
|
private final List<String> patterns = new ArrayList<>();
|
||||||
|
|
||||||
public BirIgnoreRegex(File birIgnoreFile) {
|
public BibIgnoreRegex(File bibIgnoreFile) {
|
||||||
|
|
||||||
patterns.add(convertUnixRegexToJavaRegex("*.birreport.csv"));
|
patterns.add(convertUnixRegexToJavaRegex("*.birreport.csv"));
|
||||||
addBirIgnoreFile(birIgnoreFile);
|
patterns.add(convertUnixRegexToJavaRegex("*.bibreport.csv"));
|
||||||
|
this.addBibIgnoreFile(bibIgnoreFile);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void addBirIgnoreFile(File birIgnoreFile) {
|
public final void addBibIgnoreFile(File bibIgnoreFile) {
|
||||||
addBirIgnoreFile(birIgnoreFile, null);
|
addBibIgnoreFile(bibIgnoreFile, null);
|
||||||
}
|
}
|
||||||
public final void addBirIgnoreFile(File birIgnoreFile, File workingDir) {
|
public final void addBibIgnoreFile(File bibIgnoreFile, File workingDir) {
|
||||||
String[] lines = birIgnoreFile.exists() ? Utils.readTextFromFile(birIgnoreFile).split("\\R") : new String[]{};
|
String[] lines = bibIgnoreFile.exists() ? Utils.readTextFromFile(bibIgnoreFile).split("\\R") : new String[]{};
|
||||||
String addPrefix = workingDir == null ? "" : birIgnoreFile.getParentFile().getAbsolutePath().replace(workingDir.getAbsolutePath() + "/", "");
|
String addPrefix = workingDir == null ? "" : bibIgnoreFile.getParentFile().getAbsolutePath().replace(workingDir.getAbsolutePath() + "/", "");
|
||||||
|
|
||||||
for (String l : lines) {
|
for (String l : lines) {
|
||||||
if (l.isBlank() || l.trim().startsWith("#")) {
|
if (l.isBlank() || l.trim().startsWith("#")) {
|
@ -1,5 +1,5 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// bit-inspector: Tool detecting bit rots in files.
|
// bit-backup: Tool detecting bit rots in files.
|
||||||
// Copyright (C) 2023-2023 the original author or authors.
|
// Copyright (C) 2023-2023 the original author or authors.
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
@ -16,7 +16,7 @@
|
|||||||
// along with this program; if not, write to the Free Software
|
// along with this program; if not, write to the Free Software
|
||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
package org.nanoboot.bitinspector.commands;
|
package org.nanoboot.bitbackup.commands;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -26,17 +26,18 @@ import java.util.UUID;
|
|||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.LogManager;
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
import org.nanoboot.bitinspector.core.BirContext;
|
import org.nanoboot.bitbackup.core.BibContext;
|
||||||
import org.nanoboot.bitinspector.core.Command;
|
import org.nanoboot.bitbackup.core.Command;
|
||||||
import org.nanoboot.bitinspector.core.BirArgs;
|
import org.nanoboot.bitbackup.core.BibArgs;
|
||||||
import org.nanoboot.bitinspector.core.BitInspectorException;
|
import org.nanoboot.bitbackup.core.BitBackupException;
|
||||||
import org.nanoboot.bitinspector.core.BirFiles;
|
import org.nanoboot.bitbackup.core.BibFiles;
|
||||||
import org.nanoboot.bitinspector.core.ListSet;
|
import org.nanoboot.bitbackup.core.Constants;
|
||||||
import org.nanoboot.bitinspector.core.Utils;
|
import org.nanoboot.bitbackup.core.ListSet;
|
||||||
import org.nanoboot.bitinspector.entity.FsFile;
|
import org.nanoboot.bitbackup.core.Utils;
|
||||||
import org.nanoboot.bitinspector.entity.SystemItem;
|
import org.nanoboot.bitbackup.entity.FsFile;
|
||||||
import org.nanoboot.bitinspector.persistence.api.FileRepository;
|
import org.nanoboot.bitbackup.entity.SystemItem;
|
||||||
import org.nanoboot.bitinspector.persistence.impl.sqlite.SqliteDatabaseMigration;
|
import org.nanoboot.bitbackup.persistence.api.FileRepository;
|
||||||
|
import org.nanoboot.bitbackup.persistence.impl.sqlite.SqliteDatabaseMigration;
|
||||||
import org.nanoboot.dbmigration.core.main.MigrationResult;
|
import org.nanoboot.dbmigration.core.main.MigrationResult;
|
||||||
import org.nanoboot.powerframework.time.duration.Duration;
|
import org.nanoboot.powerframework.time.duration.Duration;
|
||||||
import org.nanoboot.powerframework.time.moment.LocalDateTime;
|
import org.nanoboot.powerframework.time.moment.LocalDateTime;
|
||||||
@ -87,31 +88,31 @@ public class CheckCommand implements Command {
|
|||||||
static int iStatic = 0;
|
static int iStatic = 0;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String run(BirArgs birArgs) {
|
public String run(BibArgs bibArgs) {
|
||||||
BirFiles birFiles = new BirFiles(birArgs);
|
BibFiles bibFiles = new BibFiles(bibArgs);
|
||||||
BirContext birContext = new BirContext(birFiles.getWorkingDirAbsolutePath());
|
BibContext bibContext = new BibContext(bibFiles.getWorkingDirAbsolutePath());
|
||||||
//
|
//
|
||||||
//part 1:
|
//part 1:
|
||||||
part1CheckDbHasExpectedHashSum(birFiles);
|
part1CheckDbHasExpectedHashSum(bibFiles);
|
||||||
//part 2:
|
//part 2:
|
||||||
boolean part2Result = part2MigrateDbSchemaIfNeeded(birFiles);
|
boolean part2Result = part2MigrateDbSchemaIfNeeded(bibFiles);
|
||||||
if(!part2Result) {
|
if (!part2Result) {
|
||||||
return "part 2 failed";
|
return "part 2 failed";
|
||||||
}
|
}
|
||||||
//part 3:
|
//part 3:
|
||||||
part3UpdateVersionInDbIfNeeded(birContext);
|
part3UpdateVersionInDbIfNeeded(bibContext);
|
||||||
|
|
||||||
ListSet<File> filesInFileSystem = part4FoundFilesInFileSystem(birFiles, birArgs);
|
ListSet<File> filesInFileSystem = part4FoundFilesInFileSystem(bibFiles, bibArgs);
|
||||||
ListSet<FsFile> filesInDb = part5FoundFilesInDb(birContext.getFileRepository(), birArgs);
|
ListSet<FsFile> filesInDb = part5FoundFilesInDb(bibContext.getFileRepository(), bibArgs);
|
||||||
|
|
||||||
LocalDateTime now = part6AddNewFilesToDb(filesInFileSystem, birFiles, filesInDb, birContext);
|
LocalDateTime now = part6AddNewFilesToDb(filesInFileSystem, bibFiles, filesInDb, bibContext);
|
||||||
|
|
||||||
List<FsFile> filesToBeRemovedFromDb = part7RemoveDeletedFilesFromDb(filesInDb, filesInFileSystem, birContext);
|
List<FsFile> filesToBeRemovedFromDb = part7RemoveDeletedFilesFromDb(filesInDb, filesInFileSystem, bibContext);
|
||||||
|
|
||||||
List<FsFile> filesWithBitRot = part8CompareContentAndLastModificationDate(filesInDb, filesToBeRemovedFromDb, birContext, now);
|
List<FsFile> filesWithBitRot = part8CompareContentAndLastModificationDate(filesInDb, filesToBeRemovedFromDb, bibContext, now);
|
||||||
|
|
||||||
part9CreateReportCsvIfNeeded(birArgs, birFiles, filesWithBitRot);
|
part9CreateReportCsvIfNeeded(bibArgs, bibFiles, filesWithBitRot);
|
||||||
part10CalculateCurrentHashSumOfDbFile(birFiles);
|
part10CalculateCurrentHashSumOfDbFile(bibFiles);
|
||||||
|
|
||||||
LOG.info("==========");
|
LOG.info("==========");
|
||||||
LOG.info("Summary");
|
LOG.info("Summary");
|
||||||
@ -134,17 +135,32 @@ public class CheckCommand implements Command {
|
|||||||
/**
|
/**
|
||||||
* Checks, if SQLite DB file has the expected SHA-512 hash sum
|
* Checks, if SQLite DB file has the expected SHA-512 hash sum
|
||||||
*
|
*
|
||||||
* @param birSQLite3File
|
* @param bibSQLite3File
|
||||||
* @param birSQLite3FileSha512
|
* @param bibSQLite3FileSha512
|
||||||
* @throws BitInspectorException - if this check fails.
|
* @throws BitBackupException - if this check fails.
|
||||||
*/
|
*/
|
||||||
private void part1CheckDbHasExpectedHashSum(BirFiles birInspectorFiles) throws BitInspectorException {
|
private void part1CheckDbHasExpectedHashSum(BibFiles bitBackupFiles) throws BitBackupException {
|
||||||
LOG.info("** Part {}: Checking DB, if has expected check sum.", CheckCommandPart.CHECK_OLD_DB_CHECKSUM.number);
|
LOG.info("** Part {}: Checking DB, if has expected check sum.", CheckCommandPart.CHECK_OLD_DB_CHECKSUM.number);
|
||||||
final boolean dbExists = birInspectorFiles.getBirSQLite3File().exists();
|
final File bibSQLite3File = bitBackupFiles.getBibSQLite3File();
|
||||||
final boolean checkSumExists = birInspectorFiles.getBirSQLite3FileSha512().exists();
|
final File birSQLite3File = bitBackupFiles.getBirSQLite3File();
|
||||||
|
final File bibSQLite3FileSha512 = bitBackupFiles.getBibSQLite3FileSha512();
|
||||||
|
final File birSQLite3FileSha512 = bitBackupFiles.getBirSQLite3FileSha512();
|
||||||
|
if (Constants.MIGRATE_FROM_BIT_INSPECTOR_TO_BIT_BACKUP_IF_NEEDED && !bibSQLite3File.exists() && birSQLite3File.exists()) {
|
||||||
|
//apply for migration to Bit Backup
|
||||||
|
birSQLite3File.renameTo(bibSQLite3File);
|
||||||
|
|
||||||
|
if (!bibSQLite3FileSha512.exists() && birSQLite3FileSha512.exists()) {
|
||||||
|
//apply for migration to Bit Backup
|
||||||
|
birSQLite3FileSha512.renameTo(bibSQLite3FileSha512);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final boolean dbExists = bitBackupFiles.getBibSQLite3File().exists();
|
||||||
|
final boolean checkSumExists = bitBackupFiles.getBibSQLite3FileSha512().exists();
|
||||||
|
|
||||||
if (dbExists && checkSumExists) {
|
if (dbExists && checkSumExists) {
|
||||||
String expectedHash = Utils.readTextFromFile(birInspectorFiles.getBirSQLite3FileSha512());
|
|
||||||
String returnedHash = Utils.calculateSHA512Hash(birInspectorFiles.getBirSQLite3File());
|
String expectedHash = Utils.readTextFromFile(bibSQLite3FileSha512);
|
||||||
|
String returnedHash = Utils.calculateSHA512Hash(bitBackupFiles.getBibSQLite3File());
|
||||||
if (!returnedHash.equals(expectedHash)) {
|
if (!returnedHash.equals(expectedHash)) {
|
||||||
String msg
|
String msg
|
||||||
= "Part {}: KO. "
|
= "Part {}: KO. "
|
||||||
@ -153,10 +169,10 @@ public class CheckCommand implements Command {
|
|||||||
+ ". Expected SHA-512 hash sum was: "
|
+ ". Expected SHA-512 hash sum was: "
|
||||||
+ expectedHash
|
+ expectedHash
|
||||||
+ " for file "
|
+ " for file "
|
||||||
+ birInspectorFiles.getBirSQLite3File().getAbsolutePath();
|
+ bitBackupFiles.getBibSQLite3File().getAbsolutePath();
|
||||||
LOG.error(msg, CheckCommandPart.CHECK_OLD_DB_CHECKSUM.number);
|
LOG.error(msg, CheckCommandPart.CHECK_OLD_DB_CHECKSUM.number);
|
||||||
LOG.info("Exiting because of the previous error.");
|
LOG.info("Exiting because of the previous error.");
|
||||||
throw new BitInspectorException(msg);
|
throw new BitBackupException(msg);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
LOG.info("Part {}: OK. Nothing to do: {}",
|
LOG.info("Part {}: OK. Nothing to do: {}",
|
||||||
@ -165,11 +181,11 @@ public class CheckCommand implements Command {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean part2MigrateDbSchemaIfNeeded(BirFiles birFiles) {
|
private boolean part2MigrateDbSchemaIfNeeded(BibFiles bibFiles) {
|
||||||
LOG.info("** Part {}: Migrating schema, if needed.", CheckCommandPart.MIGRATE_DB_SCHEMA_IF_NEEDED.number);
|
LOG.info("** Part {}: Migrating schema, if needed.", CheckCommandPart.MIGRATE_DB_SCHEMA_IF_NEEDED.number);
|
||||||
try {
|
try {
|
||||||
|
|
||||||
MigrationResult migrationResult = SqliteDatabaseMigration.getInstance().migrate(birFiles.getWorkingDirAbsolutePath());
|
MigrationResult migrationResult = SqliteDatabaseMigration.getInstance().migrate(bibFiles.getWorkingDirAbsolutePath());
|
||||||
if (migrationResult == MigrationResult.SUCCESS) {
|
if (migrationResult == MigrationResult.SUCCESS) {
|
||||||
LOG.info("Part {}: OK. Success.", CheckCommandPart.MIGRATE_DB_SCHEMA_IF_NEEDED.number);
|
LOG.info("Part {}: OK. Success.", CheckCommandPart.MIGRATE_DB_SCHEMA_IF_NEEDED.number);
|
||||||
return true;
|
return true;
|
||||||
@ -183,29 +199,39 @@ public class CheckCommand implements Command {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void part3UpdateVersionInDbIfNeeded(BirContext birContext) {
|
private void part3UpdateVersionInDbIfNeeded(BibContext bibContext) {
|
||||||
LOG.info("** Part {}: Updating version, if needed.", CheckCommandPart.UPDATE_VERSION.number);
|
LOG.info("** Part {}: Updating version, if needed.", CheckCommandPart.UPDATE_VERSION.number);
|
||||||
String version = birContext.getSystemItemRepository().read("bir.version").getValue();
|
|
||||||
System.out.println("Before: bir.version=" + version);
|
if(Constants.MIGRATE_FROM_BIT_INSPECTOR_TO_BIT_BACKUP_IF_NEEDED){
|
||||||
if (version == null) {
|
//Migrating from bit-inspector to bit-backup:
|
||||||
birContext.getSystemItemRepository().create(new SystemItem("bir.version", "0.0.0-SNAPSHOT"));
|
String birVersion = bibContext.getSystemItemRepository().read("bir.version").getValue();
|
||||||
|
if (birVersion != null) {
|
||||||
|
bibContext.getSystemItemRepository().remove(BIRVERSION);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
String bibVersion = bibContext.getSystemItemRepository().read(BIBVERSION).getValue();
|
||||||
|
System.out.println("Before: bib.version=" + bibVersion);
|
||||||
|
if (bibVersion == null) {
|
||||||
|
bibContext.getSystemItemRepository().create(new SystemItem("bib.version", "0.0.0-SNAPSHOT"));
|
||||||
}
|
}
|
||||||
System.out.println("Updating version in DB.");
|
System.out.println("Updating version in DB.");
|
||||||
version = birContext.getSystemItemRepository().read("bir.version").getValue();
|
bibVersion = bibContext.getSystemItemRepository().read("bib.version").getValue();
|
||||||
System.out.println("After: bir.version=" + version);
|
System.out.println("After: bib.version=" + bibVersion);
|
||||||
LOG.info("Part {}: OK.", CheckCommandPart.UPDATE_VERSION.number);
|
LOG.info("Part {}: OK.", CheckCommandPart.UPDATE_VERSION.number);
|
||||||
}
|
}
|
||||||
|
public static final String BIBVERSION = "bib.version";
|
||||||
|
public static final String BIRVERSION = "bir.version";
|
||||||
|
|
||||||
private ListSet<File> part4FoundFilesInFileSystem(BirFiles birFiles, BirArgs birArgs) {
|
private ListSet<File> part4FoundFilesInFileSystem(BibFiles bibFiles, BibArgs bibArgs) {
|
||||||
LOG.info("** Part {}: Loading files in filesystem", CheckCommandPart.FOUND_FILES_IN_FILESYSTEM.number);
|
LOG.info("** Part {}: Loading files in filesystem", CheckCommandPart.FOUND_FILES_IN_FILESYSTEM.number);
|
||||||
String workingDir = birFiles.getWorkingDirAbsolutePath();
|
String workingDir = bibFiles.getWorkingDirAbsolutePath();
|
||||||
List<File> filesAlreadyFound = new ArrayList<>();
|
List<File> filesAlreadyFound = new ArrayList<>();
|
||||||
List<File> filesInDirList = foundFilesInCurrentDir(birFiles.getWorkingDir(), filesAlreadyFound, birFiles);
|
List<File> filesInDirList = foundFilesInCurrentDir(bibFiles.getWorkingDir(), filesAlreadyFound, bibFiles);
|
||||||
|
|
||||||
ListSet<File> listSet = new ListSet<>(filesInDirList, f -> loadPathButOnlyTheNeededPart(birFiles.getWorkingDir(), f));
|
ListSet<File> listSet = new ListSet<>(filesInDirList, f -> loadPathButOnlyTheNeededPart(bibFiles.getWorkingDir(), f));
|
||||||
|
|
||||||
LOG.info("Part {}: Found {} files.", CheckCommandPart.FOUND_FILES_IN_FILESYSTEM.number, listSet.size());
|
LOG.info("Part {}: Found {} files.", CheckCommandPart.FOUND_FILES_IN_FILESYSTEM.number, listSet.size());
|
||||||
if (birArgs.isVerboseLoggingEnabled()) {
|
if (bibArgs.isVerboseLoggingEnabled()) {
|
||||||
filesInDirList.stream().forEach((f -> LOG.info("#" + (++iStatic) + " " + f.getAbsolutePath().substring(workingDir.length() + 1))));
|
filesInDirList.stream().forEach((f -> LOG.info("#" + (++iStatic) + " " + f.getAbsolutePath().substring(workingDir.length() + 1))));
|
||||||
}
|
}
|
||||||
return listSet;
|
return listSet;
|
||||||
@ -219,28 +245,40 @@ public class CheckCommand implements Command {
|
|||||||
private int foundFiles;
|
private int foundFiles;
|
||||||
private int foundDirs;
|
private int foundDirs;
|
||||||
|
|
||||||
private List<File> foundFilesInCurrentDir(File currentDir, List<File> filesAlreadyFound, BirFiles birFiles) {
|
private List<File> foundFilesInCurrentDir(File currentDir, List<File> filesAlreadyFound, BibFiles bibFiles) {
|
||||||
|
|
||||||
for (File f : currentDir.listFiles()) {
|
for (File f : currentDir.listFiles()) {
|
||||||
boolean isAlsoBirIgnore =f.getName().equals(birFiles.getBirIgnore().getName());
|
|
||||||
if(isAlsoBirIgnore && !f.getAbsolutePath().equals(birFiles.getBirIgnore().getAbsoluteFile())) {
|
if(Constants.MIGRATE_FROM_BIT_INSPECTOR_TO_BIT_BACKUP_IF_NEEDED) {
|
||||||
birFiles.getBirIgnoreRegex().addBirIgnoreFile(f, birFiles.getWorkingDir());
|
//Migrating from bit-inspector to bit-backup:
|
||||||
|
boolean isAlsoBirIgnore = f.getName().equals(bibFiles.getBirIgnore().getName());
|
||||||
|
if(isAlsoBirIgnore) {
|
||||||
|
File bibIgnoreFile = new File(f.getParentFile(), bibFiles.getBibIgnore().getName());
|
||||||
|
if(!bibIgnoreFile.exists()) {
|
||||||
|
f.renameTo(bibIgnoreFile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
boolean isAlsoBibIgnore = f.getName().equals(bibFiles.getBibIgnore().getName());
|
||||||
|
if (isAlsoBibIgnore && !f.getAbsolutePath().equals(bibFiles.getBibIgnore().getAbsoluteFile())) {
|
||||||
|
bibFiles.getBibIgnoreRegex().addBibIgnoreFile(f, bibFiles.getWorkingDir());
|
||||||
}
|
}
|
||||||
if (f.isDirectory()) {
|
if (f.isDirectory()) {
|
||||||
++foundDirs;
|
++foundDirs;
|
||||||
foundFilesInCurrentDir(f, filesAlreadyFound, birFiles);
|
foundFilesInCurrentDir(f, filesAlreadyFound, bibFiles);
|
||||||
} else {
|
} else {
|
||||||
++foundFiles;
|
++foundFiles;
|
||||||
if (f.getAbsolutePath().equals(birFiles.getBirSQLite3File().getAbsolutePath())) {
|
if (f.getAbsolutePath().equals(bibFiles.getBirSQLite3File().getAbsolutePath())) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (f.getAbsolutePath().equals(birFiles.getBirSQLite3FileSha512().getAbsolutePath())) {
|
if (f.getAbsolutePath().equals(bibFiles.getBirSQLite3FileSha512().getAbsolutePath())) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
++iii;
|
++iii;
|
||||||
//System.out.println("Testing file: " + iii + "#" + " " + loadPathButOnlyTheNeededPart(currentDirRoot, f));
|
//System.out.println("Testing file: " + iii + "#" + " " + loadPathButOnlyTheNeededPart(currentDirRoot, f));
|
||||||
if (birFiles.getBirIgnoreRegex().test(loadPathButOnlyTheNeededPart(birFiles.getWorkingDir(), f))) {
|
if (bibFiles.getBibIgnoreRegex().test(loadPathButOnlyTheNeededPart(bibFiles.getWorkingDir(), f))) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
filesAlreadyFound.add(f);
|
filesAlreadyFound.add(f);
|
||||||
@ -249,20 +287,20 @@ public class CheckCommand implements Command {
|
|||||||
return filesAlreadyFound;
|
return filesAlreadyFound;
|
||||||
}
|
}
|
||||||
|
|
||||||
private ListSet<FsFile> part5FoundFilesInDb(FileRepository fileRepository, BirArgs birArgs) {
|
private ListSet<FsFile> part5FoundFilesInDb(FileRepository fileRepository, BibArgs bibArgs) {
|
||||||
LOG.info("** Part {}: Loading files in DB", CheckCommandPart.FOUND_FILES_IN_DB.number);
|
LOG.info("** Part {}: Loading files in DB", CheckCommandPart.FOUND_FILES_IN_DB.number);
|
||||||
List<FsFile> filesInDb = fileRepository.list();
|
List<FsFile> filesInDb = fileRepository.list();
|
||||||
|
|
||||||
ListSet<FsFile> listSet = new ListSet<>(filesInDb, f -> f.getAbsolutePath());
|
ListSet<FsFile> listSet = new ListSet<>(filesInDb, f -> f.getAbsolutePath());
|
||||||
LOG.info("Part {}: Found {} files.", CheckCommandPart.FOUND_FILES_IN_DB.number, listSet.size());
|
LOG.info("Part {}: Found {} files.", CheckCommandPart.FOUND_FILES_IN_DB.number, listSet.size());
|
||||||
iStatic = 0;
|
iStatic = 0;
|
||||||
if (birArgs.isVerboseLoggingEnabled()) {
|
if (bibArgs.isVerboseLoggingEnabled()) {
|
||||||
filesInDb.stream().forEach((f -> System.out.println("#" + (++iStatic) + " " + f.toString())));
|
filesInDb.stream().forEach((f -> System.out.println("#" + (++iStatic) + " " + f.toString())));
|
||||||
}
|
}
|
||||||
return listSet;
|
return listSet;
|
||||||
}
|
}
|
||||||
|
|
||||||
private LocalDateTime part6AddNewFilesToDb(ListSet<File> filesInFileSystem, BirFiles birFiles, ListSet<FsFile> filesInDb, BirContext birContext) {
|
private LocalDateTime part6AddNewFilesToDb(ListSet<File> filesInFileSystem, BibFiles bibFiles, ListSet<FsFile> filesInDb, BibContext bibContext) {
|
||||||
LOG.info("** Part {}: Adding new files to DB", CheckCommandPart.ADD_NEW_FILES_TO_DB.number);
|
LOG.info("** Part {}: Adding new files to DB", CheckCommandPart.ADD_NEW_FILES_TO_DB.number);
|
||||||
Date lastChecked = new Date();
|
Date lastChecked = new Date();
|
||||||
org.nanoboot.powerframework.time.moment.LocalDateTime now = org.nanoboot.powerframework.time.moment.LocalDateTime.convertJavaUtilDateToPowerLocalDateTime(lastChecked);
|
org.nanoboot.powerframework.time.moment.LocalDateTime now = org.nanoboot.powerframework.time.moment.LocalDateTime.convertJavaUtilDateToPowerLocalDateTime(lastChecked);
|
||||||
@ -279,7 +317,7 @@ public class CheckCommand implements Command {
|
|||||||
String.format("%,.2f", progress));
|
String.format("%,.2f", progress));
|
||||||
}
|
}
|
||||||
|
|
||||||
String absolutePathOfFileInDir = loadPathButOnlyTheNeededPart(birFiles.getWorkingDir(), fileInDir);
|
String absolutePathOfFileInDir = loadPathButOnlyTheNeededPart(bibFiles.getWorkingDir(), fileInDir);
|
||||||
if (!filesInDb.doesSetContains(absolutePathOfFileInDir)) {
|
if (!filesInDb.doesSetContains(absolutePathOfFileInDir)) {
|
||||||
Date lastModified = new Date(fileInDir.lastModified());
|
Date lastModified = new Date(fileInDir.lastModified());
|
||||||
org.nanoboot.powerframework.time.moment.LocalDateTime ldt = org.nanoboot.powerframework.time.moment.LocalDateTime.convertJavaUtilDateToPowerLocalDateTime(lastModified);
|
org.nanoboot.powerframework.time.moment.LocalDateTime ldt = org.nanoboot.powerframework.time.moment.LocalDateTime.convertJavaUtilDateToPowerLocalDateTime(lastModified);
|
||||||
@ -300,11 +338,11 @@ public class CheckCommand implements Command {
|
|||||||
|
|
||||||
}
|
}
|
||||||
LOG.info("Adding new files: {}", filesMissingInDb.size());
|
LOG.info("Adding new files: {}", filesMissingInDb.size());
|
||||||
birContext.getFileRepository().create(filesMissingInDb);
|
bibContext.getFileRepository().create(filesMissingInDb);
|
||||||
return now;
|
return now;
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<FsFile> part7RemoveDeletedFilesFromDb(ListSet<FsFile> filesInDb, ListSet<File> filesInFileSystem, BirContext birContext) {
|
private List<FsFile> part7RemoveDeletedFilesFromDb(ListSet<FsFile> filesInDb, ListSet<File> filesInFileSystem, BibContext bibContext) {
|
||||||
LOG.info("** Part {}: Removing deleted files from DB", CheckCommandPart.REMOVE_DELETED_FILES_FROM_DB.number);
|
LOG.info("** Part {}: Removing deleted files from DB", CheckCommandPart.REMOVE_DELETED_FILES_FROM_DB.number);
|
||||||
List<FsFile> filesToBeRemovedFromDb = new ArrayList<>();
|
List<FsFile> filesToBeRemovedFromDb = new ArrayList<>();
|
||||||
int processedCount = 0;
|
int processedCount = 0;
|
||||||
@ -333,13 +371,13 @@ public class CheckCommand implements Command {
|
|||||||
CheckCommandPart.REMOVE_DELETED_FILES_FROM_DB.number,
|
CheckCommandPart.REMOVE_DELETED_FILES_FROM_DB.number,
|
||||||
filesToBeRemovedFromDb.size());
|
filesToBeRemovedFromDb.size());
|
||||||
for (FsFile f : filesToBeRemovedFromDb) {
|
for (FsFile f : filesToBeRemovedFromDb) {
|
||||||
birContext.getFileRepository().remove(f);
|
bibContext.getFileRepository().remove(f);
|
||||||
}
|
}
|
||||||
return filesToBeRemovedFromDb;
|
return filesToBeRemovedFromDb;
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<FsFile> part8CompareContentAndLastModificationDate(
|
private List<FsFile> part8CompareContentAndLastModificationDate(
|
||||||
ListSet<FsFile> filesInDb, List<FsFile> filesToBeRemovedFromDb, BirContext birContext, LocalDateTime now) {
|
ListSet<FsFile> filesInDb, List<FsFile> filesToBeRemovedFromDb, BibContext bibContext, LocalDateTime now) {
|
||||||
LOG.info("** Part {}: Comparing Content and last modification date", CheckCommandPart.COMPARE_CONTENT_AND_LAST_MODTIME.number);
|
LOG.info("** Part {}: Comparing Content and last modification date", CheckCommandPart.COMPARE_CONTENT_AND_LAST_MODTIME.number);
|
||||||
double countOfFilesToCalculateHashSum = filesInDb.size() - filesToBeRemovedFromDb.size();
|
double countOfFilesToCalculateHashSum = filesInDb.size() - filesToBeRemovedFromDb.size();
|
||||||
int processedCount = 0;
|
int processedCount = 0;
|
||||||
@ -368,13 +406,12 @@ public class CheckCommand implements Command {
|
|||||||
Date lastModified = new Date(file.lastModified());
|
Date lastModified = new Date(file.lastModified());
|
||||||
org.nanoboot.powerframework.time.moment.LocalDateTime ldt = org.nanoboot.powerframework.time.moment.LocalDateTime.convertJavaUtilDateToPowerLocalDateTime(lastModified);
|
org.nanoboot.powerframework.time.moment.LocalDateTime ldt = org.nanoboot.powerframework.time.moment.LocalDateTime.convertJavaUtilDateToPowerLocalDateTime(lastModified);
|
||||||
|
|
||||||
|
|
||||||
String calculatedHash = Utils.calculateSHA512Hash(file);
|
String calculatedHash = Utils.calculateSHA512Hash(file);
|
||||||
if (ldt.toString().equals(fileInDb.getLastModificationDate()) && !calculatedHash.equals(fileInDb.getHashSumValue())) {
|
if (ldt.toString().equals(fileInDb.getLastModificationDate()) && !calculatedHash.equals(fileInDb.getHashSumValue())) {
|
||||||
filesWithBitRot.add(fileInDb);
|
filesWithBitRot.add(fileInDb);
|
||||||
fileInDb.setLastCheckDate(now.toString());
|
fileInDb.setLastCheckDate(now.toString());
|
||||||
fileInDb.setLastCheckResult("KO");
|
fileInDb.setLastCheckResult("KO");
|
||||||
birContext.getFileRepository().updateFile(fileInDb);
|
bibContext.getFileRepository().updateFile(fileInDb);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!ldt.toString().equals(fileInDb.getLastModificationDate())) {
|
if (!ldt.toString().equals(fileInDb.getLastModificationDate())) {
|
||||||
@ -384,7 +421,7 @@ public class CheckCommand implements Command {
|
|||||||
fileInDb.setHashSumAlgorithm("SHA-512");
|
fileInDb.setHashSumAlgorithm("SHA-512");
|
||||||
fileInDb.setSize(file.length());
|
fileInDb.setSize(file.length());
|
||||||
fileInDb.setLastCheckResult("OK");
|
fileInDb.setLastCheckResult("OK");
|
||||||
birContext.getFileRepository().updateFile(fileInDb);
|
bibContext.getFileRepository().updateFile(fileInDb);
|
||||||
//System.out.println(fileInDb.toString());
|
//System.out.println(fileInDb.toString());
|
||||||
contentAndModTimeWereChanged++;
|
contentAndModTimeWereChanged++;
|
||||||
continue;
|
continue;
|
||||||
@ -394,7 +431,7 @@ public class CheckCommand implements Command {
|
|||||||
|
|
||||||
if (fileInDb.getSize() == 0) {
|
if (fileInDb.getSize() == 0) {
|
||||||
fileInDb.setSize(file.length());
|
fileInDb.setSize(file.length());
|
||||||
birContext.getFileRepository().updateFile(fileInDb);
|
bibContext.getFileRepository().updateFile(fileInDb);
|
||||||
} else {
|
} else {
|
||||||
filesToUpdateLastCheckDate.add(fileInDb);
|
filesToUpdateLastCheckDate.add(fileInDb);
|
||||||
}
|
}
|
||||||
@ -411,30 +448,30 @@ public class CheckCommand implements Command {
|
|||||||
LOG.info("Part {}: Updating files - content and last modification date were not changed): {}",
|
LOG.info("Part {}: Updating files - content and last modification date were not changed): {}",
|
||||||
CheckCommandPart.COMPARE_CONTENT_AND_LAST_MODTIME.number,
|
CheckCommandPart.COMPARE_CONTENT_AND_LAST_MODTIME.number,
|
||||||
filesToUpdateLastCheckDate.size());
|
filesToUpdateLastCheckDate.size());
|
||||||
birContext.getFileRepository().updateLastCheckDate(now.toString(), filesToUpdateLastCheckDate);
|
bibContext.getFileRepository().updateLastCheckDate(now.toString(), filesToUpdateLastCheckDate);
|
||||||
|
|
||||||
return filesWithBitRot;
|
return filesWithBitRot;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void part9CreateReportCsvIfNeeded(BirArgs birArgs, BirFiles birFiles, List<FsFile> filesWithBitRot) {
|
private void part9CreateReportCsvIfNeeded(BibArgs bibArgs, BibFiles bibFiles, List<FsFile> filesWithBitRot) {
|
||||||
LOG.info("** Part {}: Creating csv report, if needed", CheckCommandPart.CREATE_REPORT_CSV_IF_NEEDED.number);
|
LOG.info("** Part {}: Creating csv report, if needed", CheckCommandPart.CREATE_REPORT_CSV_IF_NEEDED.number);
|
||||||
if (!birArgs.hasArgument("report")) {
|
if (!bibArgs.hasArgument("report")) {
|
||||||
LOG.info(" Part {}: OK. Nothing to do. No option report was passed.", CheckCommandPart.CREATE_REPORT_CSV_IF_NEEDED.number);
|
LOG.info(" Part {}: OK. Nothing to do. No option report was passed.", CheckCommandPart.CREATE_REPORT_CSV_IF_NEEDED.number);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!birArgs.getArgument("report").equals("true")) {
|
if (!bibArgs.getArgument("report").equals("true")) {
|
||||||
LOG.info("Part {}: Nothing to do. Option report={}",
|
LOG.info("Part {}: Nothing to do. Option report={}",
|
||||||
CheckCommandPart.CREATE_REPORT_CSV_IF_NEEDED.number,
|
CheckCommandPart.CREATE_REPORT_CSV_IF_NEEDED.number,
|
||||||
birArgs.getArgument("report"));
|
bibArgs.getArgument("report"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
File birReportCsv = birFiles.getBirReportCsv();
|
File bibReportCsv = bibFiles.getBibReportCsv();
|
||||||
if (birReportCsv.exists()) {
|
if (bibReportCsv.exists()) {
|
||||||
Long nowLong = org.nanoboot.powerframework.time.moment.UniversalDateTime.now().toLong();
|
Long nowLong = org.nanoboot.powerframework.time.moment.UniversalDateTime.now().toLong();
|
||||||
|
|
||||||
File backup = new File(birReportCsv.getParentFile().getAbsolutePath() + "/" + nowLong + "." + birReportCsv.getName());
|
File backup = new File(bibReportCsv.getParentFile().getAbsolutePath() + "/" + nowLong + "." + bibReportCsv.getName());
|
||||||
birReportCsv.renameTo(backup);
|
bibReportCsv.renameTo(backup);
|
||||||
}
|
}
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
|
|
||||||
@ -449,14 +486,14 @@ public class CheckCommand implements Command {
|
|||||||
.append(Utils.calculateSHA512Hash(new File("./" + f.getAbsolutePath())))
|
.append(Utils.calculateSHA512Hash(new File("./" + f.getAbsolutePath())))
|
||||||
.append("\n")
|
.append("\n")
|
||||||
);
|
);
|
||||||
Utils.writeTextToFile(sb.toString(), birReportCsv);
|
Utils.writeTextToFile(sb.toString(), bibReportCsv);
|
||||||
LOG.info("Part {}: OK.",
|
LOG.info("Part {}: OK.",
|
||||||
CheckCommandPart.CREATE_REPORT_CSV_IF_NEEDED.number);
|
CheckCommandPart.CREATE_REPORT_CSV_IF_NEEDED.number);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void part10CalculateCurrentHashSumOfDbFile(BirFiles birFiles) {
|
private void part10CalculateCurrentHashSumOfDbFile(BibFiles bibFiles) {
|
||||||
LOG.info("** Part {}: Calculating current hash sum of DB file", CheckCommandPart.CHECK_NEW_DB_CHECKSUM.number);
|
LOG.info("** Part {}: Calculating current hash sum of DB file", CheckCommandPart.CHECK_NEW_DB_CHECKSUM.number);
|
||||||
Utils.writeTextToFile(Utils.calculateSHA512Hash(birFiles.getBirSQLite3File()), birFiles.getBirSQLite3FileSha512());
|
Utils.writeTextToFile(Utils.calculateSHA512Hash(bibFiles.getBirSQLite3File()), bibFiles.getBirSQLite3FileSha512());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -1,5 +1,5 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// bit-inspector: Tool detecting bit rots in files.
|
// bit-backup: Tool detecting bit rots in files.
|
||||||
// Copyright (C) 2023-2023 the original author or authors.
|
// Copyright (C) 2023-2023 the original author or authors.
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
@ -16,14 +16,14 @@
|
|||||||
// along with this program; if not, write to the Free Software
|
// along with this program; if not, write to the Free Software
|
||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
package org.nanoboot.bitinspector.commands;
|
package org.nanoboot.bitbackup.commands;
|
||||||
|
|
||||||
import org.nanoboot.bitinspector.core.Command;
|
import org.nanoboot.bitbackup.core.Command;
|
||||||
import org.nanoboot.bitinspector.core.BirArgs;
|
import org.nanoboot.bitbackup.core.BibArgs;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author <a href="mailto:robertvokac@nanoboot.org">Robert Vokac</a>
|
* @author <a href="mailto:mail@robertvokac.com">Robert Vokac</a>
|
||||||
*/
|
*/
|
||||||
public class HelpCommand implements Command {
|
public class HelpCommand implements Command {
|
||||||
|
|
||||||
@ -38,14 +38,14 @@ public class HelpCommand implements Command {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String run(BirArgs bitInspectorArgs) {
|
public String run(BibArgs bitInspectorArgs) {
|
||||||
String str = """
|
String str = """
|
||||||
NAME
|
NAME
|
||||||
bir - " Bit Inspector"
|
bib - " Bit Backup"
|
||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
bir [command] [options]
|
bib [command] [options]
|
||||||
If no command is provided, then the default command check is used. This means, if you run "bit-inspector", it is the same, as to run "bir check".
|
If no command is provided, then the default command check is used. This means, if you run "bit-backup", it is the same, as to run "bib check".
|
||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
Detects bit rotten files in the given directory to keep your files forever.
|
Detects bit rotten files in the given directory to keep your files forever.
|
||||||
@ -56,7 +56,7 @@ public class HelpCommand implements Command {
|
|||||||
dir={working directory to be checked for bit rot}
|
dir={working directory to be checked for bit rot}
|
||||||
Optional. Default=. (current working directory)
|
Optional. Default=. (current working directory)
|
||||||
report=true or false
|
report=true or false
|
||||||
Optional. Default= false (nothing will be reported to file .birreport.csv).
|
Optional. Default= false (nothing will be reported to file .bibreport.csv).
|
||||||
help Display help information
|
help Display help information
|
||||||
version Display version information
|
version Display version information
|
||||||
""";
|
""";
|
@ -1,5 +1,5 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// bit-inspector: Tool detecting bit rots in files.
|
// bit-backup: Tool detecting bit rots in files.
|
||||||
// Copyright (C) 2023-2023 the original author or authors.
|
// Copyright (C) 2023-2023 the original author or authors.
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
@ -17,16 +17,16 @@
|
|||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
package org.nanoboot.bitinspector.commands;
|
package org.nanoboot.bitbackup.commands;
|
||||||
|
|
||||||
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.LogManager;
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
import org.nanoboot.bitinspector.core.Command;
|
import org.nanoboot.bitbackup.core.Command;
|
||||||
import org.nanoboot.bitinspector.core.BirArgs;
|
import org.nanoboot.bitbackup.core.BibArgs;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author <a href="mailto:robertvokac@nanoboot.org">Robert Vokac</a>
|
* @author <a href="mailto:mail@robertvokac.com">Robert Vokac</a>
|
||||||
*/
|
*/
|
||||||
public class VersionCommand implements Command {
|
public class VersionCommand implements Command {
|
||||||
|
|
||||||
@ -41,8 +41,8 @@ private static final Logger LOG = LogManager.getLogger(VersionCommand.class);
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String run(BirArgs bitInspectorArgs) {
|
public String run(BibArgs bitInspectorArgs) {
|
||||||
String result = "Bit Inspector 0.0.0-SNAPSHOT";
|
String result = "Bit Backup 0.0.0-SNAPSHOT";
|
||||||
LOG.info(result);
|
LOG.info(result);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
@ -1,5 +1,5 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// bit-inspector: Tool detecting bit rots in files.
|
// bit-backup: Tool detecting bit rots in files.
|
||||||
// Copyright (C) 2023-2023 the original author or authors.
|
// Copyright (C) 2023-2023 the original author or authors.
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
@ -16,7 +16,7 @@
|
|||||||
// along with this program; if not, write to the Free Software
|
// along with this program; if not, write to the Free Software
|
||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
package org.nanoboot.bitinspector.core;
|
package org.nanoboot.bitbackup.core;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -24,9 +24,9 @@ import lombok.Getter;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author <a href="mailto:robertvokac@nanoboot.org">Robert Vokac</a>
|
* @author <a href="mailto:mail@robertvokac.com">Robert Vokac</a>
|
||||||
*/
|
*/
|
||||||
public class BirArgs {
|
public class BibArgs {
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
private final String command;
|
private final String command;
|
||||||
@ -42,15 +42,15 @@ public class BirArgs {
|
|||||||
return array;
|
return array;
|
||||||
}
|
}
|
||||||
|
|
||||||
public BirArgs(BitInspectorCommand command, Map<String, String> map) {
|
public BibArgs(BitInspectorCommand command, Map<String, String> map) {
|
||||||
this(convertToStringArray(command.name().toLowerCase(), map));
|
this(convertToStringArray(command.name().toLowerCase(), map));
|
||||||
}
|
}
|
||||||
|
|
||||||
public BirArgs(String command, Map<String, String> map) {
|
public BibArgs(String command, Map<String, String> map) {
|
||||||
this(convertToStringArray(command, map));
|
this(convertToStringArray(command, map));
|
||||||
}
|
}
|
||||||
|
|
||||||
public BirArgs(String[] args) {
|
public BibArgs(String[] args) {
|
||||||
command = args.length == 0 ? "check" : args[0];
|
command = args.length == 0 ? "check" : args[0];
|
||||||
|
|
||||||
if (args.length > 1) {
|
if (args.length > 1) {
|
@ -1,5 +1,5 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// bit-inspector: Tool detecting bit rots in files.
|
// bit-backup: Tool detecting bit rots in files.
|
||||||
// Copyright (C) 2023-2023 the original author or authors.
|
// Copyright (C) 2023-2023 the original author or authors.
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
@ -17,21 +17,21 @@
|
|||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
package org.nanoboot.bitinspector.core;
|
package org.nanoboot.bitbackup.core;
|
||||||
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import org.nanoboot.bitinspector.persistence.api.ConnectionFactory;
|
import org.nanoboot.bitbackup.persistence.api.ConnectionFactory;
|
||||||
import org.nanoboot.bitinspector.persistence.api.FileRepository;
|
import org.nanoboot.bitbackup.persistence.api.FileRepository;
|
||||||
import org.nanoboot.bitinspector.persistence.api.SystemItemRepository;
|
import org.nanoboot.bitbackup.persistence.api.SystemItemRepository;
|
||||||
import org.nanoboot.bitinspector.persistence.impl.sqlite.FileRepositoryImplSqlite;
|
import org.nanoboot.bitbackup.persistence.impl.sqlite.FileRepositoryImplSqlite;
|
||||||
import org.nanoboot.bitinspector.persistence.impl.sqlite.SqliteConnectionFactory;
|
import org.nanoboot.bitbackup.persistence.impl.sqlite.SqliteConnectionFactory;
|
||||||
import org.nanoboot.bitinspector.persistence.impl.sqlite.SystemItemRepositoryImplSqlite;
|
import org.nanoboot.bitbackup.persistence.impl.sqlite.SystemItemRepositoryImplSqlite;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author <a href="mailto:robertvokac@nanoboot.org">Robert Vokac</a>
|
* @author <a href="mailto:mail@robertvokac.com">Robert Vokac</a>
|
||||||
*/
|
*/
|
||||||
public class BirContext {
|
public class BibContext {
|
||||||
private final String directoryWhereSqliteFileIs;
|
private final String directoryWhereSqliteFileIs;
|
||||||
private ConnectionFactory connectionFactory;
|
private ConnectionFactory connectionFactory;
|
||||||
@Getter
|
@Getter
|
||||||
@ -39,7 +39,7 @@ public class BirContext {
|
|||||||
@Getter
|
@Getter
|
||||||
private FileRepository fileRepository;
|
private FileRepository fileRepository;
|
||||||
|
|
||||||
public BirContext(String directoryWhereSqliteFileIs) {
|
public BibContext(String directoryWhereSqliteFileIs) {
|
||||||
this.directoryWhereSqliteFileIs = directoryWhereSqliteFileIs;
|
this.directoryWhereSqliteFileIs = directoryWhereSqliteFileIs;
|
||||||
this.connectionFactory = new SqliteConnectionFactory(directoryWhereSqliteFileIs);
|
this.connectionFactory = new SqliteConnectionFactory(directoryWhereSqliteFileIs);
|
||||||
systemItemRepository = new SystemItemRepositoryImplSqlite((SqliteConnectionFactory) connectionFactory);
|
systemItemRepository = new SystemItemRepositoryImplSqlite((SqliteConnectionFactory) connectionFactory);
|
@ -1,5 +1,5 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// bit-inspector: Tool detecting bit rots in files.
|
// bit-backup: Tool detecting bit rots in files.
|
||||||
// Copyright (C) 2023-2023 the original author or authors.
|
// Copyright (C) 2023-2023 the original author or authors.
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
@ -16,37 +16,48 @@
|
|||||||
// along with this program; if not, write to the Free Software
|
// along with this program; if not, write to the Free Software
|
||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
package org.nanoboot.bitinspector.core;
|
package org.nanoboot.bitbackup.core;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import org.nanoboot.bitinspector.commands.BirIgnoreRegex;
|
import org.nanoboot.bitbackup.commands.BibIgnoreRegex;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author <a href="mailto:robertvokac@nanoboot.org">Robert Vokac</a>
|
* @author <a href="mailto:mail@robertvokac.com">Robert Vokac</a>
|
||||||
*/
|
*/
|
||||||
@Data
|
@Data
|
||||||
@Getter
|
@Getter
|
||||||
public class BirFiles {
|
public class BibFiles {
|
||||||
|
|
||||||
private final File workingDir;
|
private final File workingDir;
|
||||||
private final String workingDirAbsolutePath;
|
private final String workingDirAbsolutePath;
|
||||||
|
private final File bibSQLite3File;
|
||||||
|
private final File bibSQLite3FileSha512;
|
||||||
|
private final File bibIgnore;
|
||||||
|
private final BibIgnoreRegex bibIgnoreRegex;
|
||||||
|
private final File bibReportCsv;
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
private final File birSQLite3File;
|
private final File birSQLite3File;
|
||||||
|
@Deprecated
|
||||||
private final File birSQLite3FileSha512;
|
private final File birSQLite3FileSha512;
|
||||||
|
@Deprecated
|
||||||
private final File birIgnore;
|
private final File birIgnore;
|
||||||
private final BirIgnoreRegex birIgnoreRegex;
|
|
||||||
private final File birReportCsv;
|
|
||||||
|
|
||||||
|
|
||||||
public BirFiles(BirArgs bitInspectorArgs) {
|
public BibFiles(BibArgs bitInspectorArgs) {
|
||||||
workingDir = new File(bitInspectorArgs.hasArgument("dir") ? bitInspectorArgs.getArgument("dir") : ".");
|
workingDir = new File(bitInspectorArgs.hasArgument("dir") ? bitInspectorArgs.getArgument("dir") : ".");
|
||||||
workingDirAbsolutePath = workingDir.getAbsolutePath();
|
workingDirAbsolutePath = workingDir.getAbsolutePath();
|
||||||
|
bibSQLite3File = new File(workingDirAbsolutePath + "/.bib.sqlite3");
|
||||||
|
bibSQLite3FileSha512 = new File(workingDirAbsolutePath + "/.bib.sqlite3.sha512");
|
||||||
|
bibIgnore = new File(workingDirAbsolutePath + "/.bibignore");
|
||||||
|
bibIgnoreRegex = new BibIgnoreRegex(bibIgnore);
|
||||||
|
bibReportCsv = new File(workingDirAbsolutePath + "/.bibreport.csv");
|
||||||
|
//
|
||||||
birSQLite3File = new File(workingDirAbsolutePath + "/.bir.sqlite3");
|
birSQLite3File = new File(workingDirAbsolutePath + "/.bir.sqlite3");
|
||||||
birSQLite3FileSha512 = new File(workingDirAbsolutePath + "/.bir.sqlite3.sha512");
|
birSQLite3FileSha512 = new File(workingDirAbsolutePath + "/.bir.sqlite3.sha512");
|
||||||
birIgnore = new File(workingDirAbsolutePath + "/.birignore");
|
birIgnore = new File(workingDirAbsolutePath + "/.birignore");
|
||||||
birIgnoreRegex = new BirIgnoreRegex(birIgnore);
|
|
||||||
birReportCsv = new File(workingDirAbsolutePath + "/.birreport.csv");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,5 +1,5 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// bit-inspector: Tool detecting bit rots in files.
|
// bit-backup: Tool detecting bit rots in files.
|
||||||
// Copyright (C) 2023-2023 the original author or authors.
|
// Copyright (C) 2023-2023 the original author or authors.
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
@ -17,23 +17,23 @@
|
|||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
package org.nanoboot.bitinspector.core;
|
package org.nanoboot.bitbackup.core;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author <a href="mailto:robertvokac@nanoboot.org">Robert Vokac</a>
|
* @author <a href="mailto:mail@robertvokac.com">Robert Vokac</a>
|
||||||
* @since 0.0.0
|
* @since 0.0.0
|
||||||
*/
|
*/
|
||||||
public class BitInspectorException extends RuntimeException {
|
public class BitBackupException extends RuntimeException {
|
||||||
|
|
||||||
public BitInspectorException(String msg) {
|
public BitBackupException(String msg) {
|
||||||
super(msg);
|
super(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
public BitInspectorException(String msg, Exception e) {
|
public BitBackupException(String msg, Exception e) {
|
||||||
super(msg, e);
|
super(msg, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
public BitInspectorException(Exception e) {
|
public BitBackupException(Exception e) {
|
||||||
super(e);
|
super(e);
|
||||||
}
|
}
|
||||||
|
|
@ -1,5 +1,5 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// bit-inspector: Tool detecting bit rots in files.
|
// bit-backup: Tool detecting bit rots in files.
|
||||||
// Copyright (C) 2023-2023 the original author or authors.
|
// Copyright (C) 2023-2023 the original author or authors.
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
@ -17,19 +17,19 @@
|
|||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
package org.nanoboot.bitinspector.core;
|
package org.nanoboot.bitbackup.core;
|
||||||
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.LogManager;
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
import org.nanoboot.bitinspector.commands.CheckCommand;
|
import org.nanoboot.bitbackup.commands.CheckCommand;
|
||||||
import org.nanoboot.bitinspector.commands.HelpCommand;
|
import org.nanoboot.bitbackup.commands.HelpCommand;
|
||||||
import org.nanoboot.bitinspector.commands.VersionCommand;
|
import org.nanoboot.bitbackup.commands.VersionCommand;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author <a href="mailto:robertvokac@nanoboot.org">Robert Vokac</a>
|
* @author <a href="mailto:mail@robertvokac.com">Robert Vokac</a>
|
||||||
*/
|
*/
|
||||||
public class BitInspector {
|
public class BitInspector {
|
||||||
|
|
||||||
@ -44,11 +44,11 @@ public class BitInspector {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void run(String[] args) {
|
public void run(String[] args) {
|
||||||
run(new BirArgs(args));
|
run(new BibArgs(args));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void run(BirArgs bitInspectorArgs) {
|
public void run(BibArgs bitBackupArgs) {
|
||||||
String command = bitInspectorArgs.getCommand();
|
String command = bitBackupArgs.getCommand();
|
||||||
Command foundCommand = null;
|
Command foundCommand = null;
|
||||||
for(Command e:commandImplementations) {
|
for(Command e:commandImplementations) {
|
||||||
if(e.getName().equals(command)) {
|
if(e.getName().equals(command)) {
|
||||||
@ -60,10 +60,10 @@ public class BitInspector {
|
|||||||
String msg = "Command \"" + command + "\" is not supported.";
|
String msg = "Command \"" + command + "\" is not supported.";
|
||||||
LOG.error(msg);
|
LOG.error(msg);
|
||||||
|
|
||||||
new HelpCommand().run(bitInspectorArgs);
|
new HelpCommand().run(bitBackupArgs);
|
||||||
throw new BitInspectorException(msg);
|
throw new BitBackupException(msg);
|
||||||
}
|
}
|
||||||
foundCommand.run(bitInspectorArgs);
|
foundCommand.run(bitBackupArgs);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,5 +1,5 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// bit-inspector: Tool detecting bit rots in files.
|
// bit-backup: Tool detecting bit rots in files.
|
||||||
// Copyright (C) 2023-2023 the original author or authors.
|
// Copyright (C) 2023-2023 the original author or authors.
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
@ -17,11 +17,11 @@
|
|||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
package org.nanoboot.bitinspector.core;
|
package org.nanoboot.bitbackup.core;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author <a href="mailto:robertvokac@nanoboot.org">Robert Vokac</a>
|
* @author <a href="mailto:mail@robertvokac.com">Robert Vokac</a>
|
||||||
*/
|
*/
|
||||||
public enum BitInspectorCommand {
|
public enum BitInspectorCommand {
|
||||||
CHECK, HELP, VERSION;
|
CHECK, HELP, VERSION;
|
@ -1,5 +1,5 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// bit-inspector: Tool detecting bit rots in files.
|
// bit-backup: Tool detecting bit rots in files.
|
||||||
// Copyright (C) 2023-2023 the original author or authors.
|
// Copyright (C) 2023-2023 the original author or authors.
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
@ -17,16 +17,16 @@
|
|||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
package org.nanoboot.bitinspector.core;
|
package org.nanoboot.bitbackup.core;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author <a href="mailto:robertvokac@nanoboot.org">Robert Vokac</a>
|
* @author <a href="mailto:mail@robertvokac.com">Robert Vokac</a>
|
||||||
*/
|
*/
|
||||||
public interface Command {
|
public interface Command {
|
||||||
public String getName();
|
public String getName();
|
||||||
default String run(BirArgs bitInspectorArgs) {
|
default String run(BibArgs bitInspectorArgs) {
|
||||||
throw new BitInspectorException("Not yet implemented.");
|
throw new BitBackupException("Not yet implemented.");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -1,5 +1,5 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// bit-inspector: Tool detecting bit rots in files.
|
// bit-backup: Tool detecting bit rots in files.
|
||||||
// Copyright (C) 2023-2023 the original author or authors.
|
// Copyright (C) 2023-2023 the original author or authors.
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
@ -17,16 +17,17 @@
|
|||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
package org.nanoboot.bitinspector.core;
|
package org.nanoboot.bitbackup.core;
|
||||||
|
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author <a href="mailto:robertvokac@nanoboot.org">Robert Vokac</a>
|
* @author <a href="mailto:mail@robertvokac.com">Robert Vokac</a>
|
||||||
*/
|
*/
|
||||||
public class Constants {
|
public class Constants {
|
||||||
|
|
||||||
public static final SimpleDateFormat YYYYMMDDHHMMSSZ_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ssZ");
|
public static final SimpleDateFormat YYYYMMDDHHMMSSZ_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ssZ");
|
||||||
|
public static final boolean MIGRATE_FROM_BIT_INSPECTOR_TO_BIT_BACKUP_IF_NEEDED = System.getProperties().containsKey("allowBirToBibMigrationIfNeeded");
|
||||||
|
|
||||||
}
|
}
|
@ -1,5 +1,5 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// bit-inspector: Tool detecting bit rots in files.
|
// bit-backup: Tool detecting bit rots in files.
|
||||||
// Copyright (C) 2023-2023 the original author or authors.
|
// Copyright (C) 2023-2023 the original author or authors.
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
@ -17,7 +17,7 @@
|
|||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
package org.nanoboot.bitinspector.core;
|
package org.nanoboot.bitbackup.core;
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
@ -1,5 +1,5 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// bit-inspector: Tool detecting bit rots in files.
|
// bit-backup: Tool detecting bit rots in files.
|
||||||
// Copyright (C) 2023-2023 the original author or authors.
|
// Copyright (C) 2023-2023 the original author or authors.
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
@ -16,10 +16,10 @@
|
|||||||
// along with this program; if not, write to the Free Software
|
// along with this program; if not, write to the Free Software
|
||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
package org.nanoboot.bitinspector.core;
|
package org.nanoboot.bitbackup.core;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author <a href="mailto:robertvokac@nanoboot.org">Robert Vokac</a>
|
* @author <a href="mailto:mail@robertvokac.com">Robert Vokac</a>
|
||||||
* @since 0.0.0
|
* @since 0.0.0
|
||||||
*/
|
*/
|
||||||
public class Main {
|
public class Main {
|
@ -1,5 +1,5 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// bit-inspector: Tool detecting bit rots in files.
|
// bit-backup: Tool detecting bit rots in files.
|
||||||
// Copyright (C) 2023-2023 the original author or authors.
|
// Copyright (C) 2023-2023 the original author or authors.
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
@ -17,7 +17,7 @@
|
|||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
package org.nanoboot.bitinspector.core;
|
package org.nanoboot.bitbackup.core;
|
||||||
|
|
||||||
import dev.mccue.guava.hash.Hashing;
|
import dev.mccue.guava.hash.Hashing;
|
||||||
import dev.mccue.guava.io.Files;
|
import dev.mccue.guava.io.Files;
|
||||||
@ -39,7 +39,7 @@ import java.util.logging.Logger;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author <a href="mailto:robertvokac@nanoboot.org">Robert Vokac</a>
|
* @author <a href="mailto:mail@robertvokac.com">Robert Vokac</a>
|
||||||
*/
|
*/
|
||||||
public class Utils {
|
public class Utils {
|
||||||
|
|
||||||
@ -82,7 +82,7 @@ public class Utils {
|
|||||||
return files;
|
return files;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void copyFile(File originalFile, File copiedFile) throws BitInspectorException {
|
public static void copyFile(File originalFile, File copiedFile) throws BitBackupException {
|
||||||
Path originalPath = originalFile.toPath();
|
Path originalPath = originalFile.toPath();
|
||||||
Path copied = new File(copiedFile, originalFile.getName()).toPath();
|
Path copied = new File(copiedFile, originalFile.getName()).toPath();
|
||||||
|
|
||||||
@ -90,7 +90,7 @@ public class Utils {
|
|||||||
java.nio.file.Files.copy(originalPath, copied, StandardCopyOption.REPLACE_EXISTING);
|
java.nio.file.Files.copy(originalPath, copied, StandardCopyOption.REPLACE_EXISTING);
|
||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
ex.printStackTrace();
|
ex.printStackTrace();
|
||||||
throw new BitInspectorException("Copying file failed: " + originalFile.getAbsolutePath());
|
throw new BitBackupException("Copying file failed: " + originalFile.getAbsolutePath());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -100,7 +100,7 @@ public class Utils {
|
|||||||
fileWriter = new FileWriter(file);
|
fileWriter = new FileWriter(file);
|
||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
ex.printStackTrace();
|
ex.printStackTrace();
|
||||||
throw new BitInspectorException("Writing to file failed: " + file.getName(), ex);
|
throw new BitBackupException("Writing to file failed: " + file.getName(), ex);
|
||||||
}
|
}
|
||||||
PrintWriter printWriter = new PrintWriter(fileWriter);
|
PrintWriter printWriter = new PrintWriter(fileWriter);
|
||||||
printWriter.print(text);
|
printWriter.print(text);
|
||||||
@ -114,7 +114,7 @@ public class Utils {
|
|||||||
try {
|
try {
|
||||||
return new String(java.nio.file.Files.readAllBytes(Paths.get(file.getAbsolutePath())));
|
return new String(java.nio.file.Files.readAllBytes(Paths.get(file.getAbsolutePath())));
|
||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
throw new BitInspectorException("Reading file failed: " + file.getName(), ex);
|
throw new BitBackupException("Reading file failed: " + file.getName(), ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -124,7 +124,7 @@ public class Utils {
|
|||||||
InputStream inputStream = clazz.getResourceAsStream(fileName);
|
InputStream inputStream = clazz.getResourceAsStream(fileName);
|
||||||
return readFromInputStream(inputStream);
|
return readFromInputStream(inputStream);
|
||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
throw new BitInspectorException("Reading file failed: " + fileName, ex);
|
throw new BitBackupException("Reading file failed: " + fileName, ex);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -169,10 +169,10 @@ public class Utils {
|
|||||||
// return hexString;
|
// return hexString;
|
||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
Logger.getLogger(Utils.class.getName()).log(Level.SEVERE, null, ex);
|
Logger.getLogger(Utils.class.getName()).log(Level.SEVERE, null, ex);
|
||||||
throw new BitInspectorException(ex);
|
throw new BitBackupException(ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public static String createJdbcUrl(String directoryWhereSqliteFileIs) {
|
public static String createJdbcUrl(String directoryWhereSqliteFileIs) {
|
||||||
return "jdbc:sqlite:" + directoryWhereSqliteFileIs + "/" + ".bir.sqlite3?foreign_keys=on;";
|
return "jdbc:sqlite:" + directoryWhereSqliteFileIs + "/" + ".bib.sqlite3?foreign_keys=on;";
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,5 +1,5 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// bit-inspector: Tool detecting bit rots in files.
|
// bit-backup: Tool detecting bit rots in files.
|
||||||
// Copyright (C) 2023-2023 the original author or authors.
|
// Copyright (C) 2023-2023 the original author or authors.
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
@ -17,7 +17,7 @@
|
|||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
package org.nanoboot.bitinspector.entity;
|
package org.nanoboot.bitbackup.entity;
|
||||||
|
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
@ -26,7 +26,7 @@ import lombok.ToString;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author <a href="mailto:robertvokac@nanoboot.org">Robert Vokac</a>
|
* @author <a href="mailto:mail@robertvokac.com">Robert Vokac</a>
|
||||||
*/
|
*/
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
@ -1,5 +1,5 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// bit-inspector: Tool detecting bit rots in files.
|
// bit-backup: Tool detecting bit rots in files.
|
||||||
// Copyright (C) 2023-2023 the original author or authors.
|
// Copyright (C) 2023-2023 the original author or authors.
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
@ -17,7 +17,7 @@
|
|||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
package org.nanoboot.bitinspector.entity;
|
package org.nanoboot.bitbackup.entity;
|
||||||
|
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
@ -25,7 +25,7 @@ import lombok.Setter;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author <a href="mailto:robertvokac@nanoboot.org">Robert Vokac</a>
|
* @author <a href="mailto:mail@robertvokac.com">Robert Vokac</a>
|
||||||
*/
|
*/
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
@ -1,5 +1,5 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// bit-inspector: Tool detecting bit rots in files.
|
// bit-backup: Tool detecting bit rots in files.
|
||||||
// Copyright (C) 2023-2023 the original author or authors.
|
// Copyright (C) 2023-2023 the original author or authors.
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
@ -16,13 +16,13 @@
|
|||||||
// along with this program; if not, write to the Free Software
|
// along with this program; if not, write to the Free Software
|
||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
package org.nanoboot.bitinspector.persistence.api;
|
package org.nanoboot.bitbackup.persistence.api;
|
||||||
|
|
||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author <a href="mailto:robertvokac@nanoboot.org">Robert Vokac</a>
|
* @author <a href="mailto:mail@robertvokac.com">Robert Vokac</a>
|
||||||
*/
|
*/
|
||||||
public interface ConnectionFactory {
|
public interface ConnectionFactory {
|
||||||
|
|
@ -1,5 +1,5 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// bit-inspector: Tool detecting bit rots in files.
|
// bit-backup: Tool detecting bit rots in files.
|
||||||
// Copyright (C) 2023-2023 the original author or authors.
|
// Copyright (C) 2023-2023 the original author or authors.
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
@ -17,14 +17,14 @@
|
|||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
package org.nanoboot.bitinspector.persistence.api;
|
package org.nanoboot.bitbackup.persistence.api;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import org.nanoboot.bitinspector.entity.FsFile;
|
import org.nanoboot.bitbackup.entity.FsFile;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author <a href="mailto:robertvokac@nanoboot.org">Robert Vokac</a>
|
* @author <a href="mailto:mail@robertvokac.com">Robert Vokac</a>
|
||||||
*/
|
*/
|
||||||
public interface FileRepository {
|
public interface FileRepository {
|
||||||
void create(List<FsFile> files);
|
void create(List<FsFile> files);
|
@ -1,5 +1,5 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// bit-inspector: Tool detecting bit rots in files.
|
// bit-backup: Tool detecting bit rots in files.
|
||||||
// Copyright (C) 2023-2023 the original author or authors.
|
// Copyright (C) 2023-2023 the original author or authors.
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
@ -17,14 +17,14 @@
|
|||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
package org.nanoboot.bitinspector.persistence.api;
|
package org.nanoboot.bitbackup.persistence.api;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import org.nanoboot.bitinspector.entity.SystemItem;
|
import org.nanoboot.bitbackup.entity.SystemItem;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author <a href="mailto:robertvokac@nanoboot.org">Robert Vokac</a>
|
* @author <a href="mailto:mail@robertvokac.com">Robert Vokac</a>
|
||||||
*/
|
*/
|
||||||
public interface SystemItemRepository {
|
public interface SystemItemRepository {
|
||||||
String create(SystemItem systemItem);
|
String create(SystemItem systemItem);
|
@ -1,5 +1,5 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// bit-inspector: Tool detecting bit rots in files.
|
// bit-backup: Tool detecting bit rots in files.
|
||||||
// Copyright (C) 2023-2023 the original author or authors.
|
// Copyright (C) 2023-2023 the original author or authors.
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
@ -16,11 +16,11 @@
|
|||||||
// along with this program; if not, write to the Free Software
|
// along with this program; if not, write to the Free Software
|
||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
package org.nanoboot.bitinspector.persistence.impl.sqlite;
|
package org.nanoboot.bitbackup.persistence.impl.sqlite;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author <a href="mailto:robertvokac@nanoboot.org">Robert Vokac</a>
|
* @author <a href="mailto:mail@robertvokac.com">Robert Vokac</a>
|
||||||
*/
|
*/
|
||||||
public class Constants {
|
public class Constants {
|
||||||
|
|
@ -1,5 +1,5 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// bit-inspector: Tool detecting bit rots in files.
|
// bit-backup: Tool detecting bit rots in files.
|
||||||
// Copyright (C) 2023-2023 the original author or authors.
|
// Copyright (C) 2023-2023 the original author or authors.
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
@ -16,7 +16,7 @@
|
|||||||
// along with this program; if not, write to the Free Software
|
// along with this program; if not, write to the Free Software
|
||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
package org.nanoboot.bitinspector.persistence.impl.sqlite;
|
package org.nanoboot.bitbackup.persistence.impl.sqlite;
|
||||||
|
|
||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
import java.sql.PreparedStatement;
|
import java.sql.PreparedStatement;
|
||||||
@ -26,12 +26,12 @@ import java.util.ArrayList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
import org.nanoboot.bitinspector.entity.FsFile;
|
import org.nanoboot.bitbackup.entity.FsFile;
|
||||||
import org.nanoboot.bitinspector.persistence.api.FileRepository;
|
import org.nanoboot.bitbackup.persistence.api.FileRepository;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author <a href="mailto:robertvokac@nanoboot.org">Robert Vokac</a>
|
* @author <a href="mailto:mail@robertvokac.com">Robert Vokac</a>
|
||||||
*/
|
*/
|
||||||
public class FileRepositoryImplSqlite implements FileRepository {
|
public class FileRepositoryImplSqlite implements FileRepository {
|
||||||
|
|
@ -1,5 +1,5 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// bit-inspector: Tool detecting bit rots in files.
|
// bit-backup: Tool detecting bit rots in files.
|
||||||
// Copyright (C) 2023-2023 the original author or authors.
|
// Copyright (C) 2023-2023 the original author or authors.
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
@ -16,7 +16,7 @@
|
|||||||
// along with this program; if not, write to the Free Software
|
// along with this program; if not, write to the Free Software
|
||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
package org.nanoboot.bitinspector.persistence.impl.sqlite;
|
package org.nanoboot.bitbackup.persistence.impl.sqlite;
|
||||||
|
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
@ -24,7 +24,7 @@ import lombok.Setter;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author <a href="mailto:robertvokac@nanoboot.org">Robert Vokac</a>
|
* @author <a href="mailto:mail@robertvokac.com">Robert Vokac</a>
|
||||||
*/
|
*/
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
@ -1,5 +1,5 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// bit-inspector: Tool detecting bit rots in files.
|
// bit-backup: Tool detecting bit rots in files.
|
||||||
// Copyright (C) 2023-2023 the original author or authors.
|
// Copyright (C) 2023-2023 the original author or authors.
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
@ -16,17 +16,17 @@
|
|||||||
// along with this program; if not, write to the Free Software
|
// along with this program; if not, write to the Free Software
|
||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
package org.nanoboot.bitinspector.persistence.impl.sqlite;
|
package org.nanoboot.bitbackup.persistence.impl.sqlite;
|
||||||
|
|
||||||
import org.nanoboot.bitinspector.persistence.api.ConnectionFactory;
|
import org.nanoboot.bitbackup.persistence.api.ConnectionFactory;
|
||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
import java.sql.DriverManager;
|
import java.sql.DriverManager;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import org.nanoboot.bitinspector.core.Utils;
|
import org.nanoboot.bitbackup.core.Utils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author <a href="mailto:robertvokac@nanoboot.org">Robert Vokac</a>
|
* @author <a href="mailto:mail@robertvokac.com">Robert Vokac</a>
|
||||||
*/
|
*/
|
||||||
public class SqliteConnectionFactory implements ConnectionFactory {
|
public class SqliteConnectionFactory implements ConnectionFactory {
|
||||||
private final String jdbcUrl;
|
private final String jdbcUrl;
|
@ -1,5 +1,5 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// bit-inspector: Tool detecting bit rots in files.
|
// bit-backup: Tool detecting bit rots in files.
|
||||||
// Copyright (C) 2023-2023 the original author or authors.
|
// Copyright (C) 2023-2023 the original author or authors.
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
@ -16,15 +16,15 @@
|
|||||||
// along with this program; if not, write to the Free Software
|
// along with this program; if not, write to the Free Software
|
||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
package org.nanoboot.bitinspector.persistence.impl.sqlite;
|
package org.nanoboot.bitbackup.persistence.impl.sqlite;
|
||||||
|
|
||||||
import org.nanoboot.bitinspector.core.Utils;
|
import org.nanoboot.bitbackup.core.Utils;
|
||||||
import org.nanoboot.dbmigration.core.main.DBMigration;
|
import org.nanoboot.dbmigration.core.main.DBMigration;
|
||||||
import org.nanoboot.dbmigration.core.main.MigrationResult;
|
import org.nanoboot.dbmigration.core.main.MigrationResult;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author <a href="mailto:robertvokac@nanoboot.org">Robert Vokac</a>
|
* @author <a href="mailto:mail@robertvokac.com">Robert Vokac</a>
|
||||||
*/
|
*/
|
||||||
public class SqliteDatabaseMigration {
|
public class SqliteDatabaseMigration {
|
||||||
|
|
||||||
@ -54,8 +54,8 @@ public class SqliteDatabaseMigration {
|
|||||||
DBMigration dbMigration = DBMigration
|
DBMigration dbMigration = DBMigration
|
||||||
.configure()
|
.configure()
|
||||||
.dataSource(jdbcUrl)
|
.dataSource(jdbcUrl)
|
||||||
.installedBy("bitinspector-persistence-impl-sqlite")
|
.installedBy("bitbackup-persistence-impl-sqlite")
|
||||||
.name("bitinspector")
|
.name("bitbackup")
|
||||||
.sqlDialect("sqlite", "org.nanoboot.dbmigration.core.persistence.impl.sqlite.DBMigrationPersistenceSqliteImpl")
|
.sqlDialect("sqlite", "org.nanoboot.dbmigration.core.persistence.impl.sqlite.DBMigrationPersistenceSqliteImpl")
|
||||||
.sqlMigrationsClass(clazz)
|
.sqlMigrationsClass(clazz)
|
||||||
.load();
|
.load();
|
@ -1,5 +1,5 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// bit-inspector: Tool detecting bit rots in files.
|
// bit-backup: Tool detecting bit rots in files.
|
||||||
// Copyright (C) 2023-2023 the original author or authors.
|
// Copyright (C) 2023-2023 the original author or authors.
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
@ -16,7 +16,7 @@
|
|||||||
// along with this program; if not, write to the Free Software
|
// along with this program; if not, write to the Free Software
|
||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
package org.nanoboot.bitinspector.persistence.impl.sqlite;
|
package org.nanoboot.bitbackup.persistence.impl.sqlite;
|
||||||
|
|
||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
import java.sql.PreparedStatement;
|
import java.sql.PreparedStatement;
|
||||||
@ -25,12 +25,12 @@ import java.sql.SQLException;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
import org.nanoboot.bitinspector.entity.SystemItem;
|
import org.nanoboot.bitbackup.entity.SystemItem;
|
||||||
import org.nanoboot.bitinspector.persistence.api.SystemItemRepository;
|
import org.nanoboot.bitbackup.persistence.api.SystemItemRepository;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author <a href="mailto:robertvokac@nanoboot.org">Robert Vokac</a>
|
* @author <a href="mailto:mail@robertvokac.com">Robert Vokac</a>
|
||||||
*/
|
*/
|
||||||
public class SystemItemRepositoryImplSqlite implements SystemItemRepository {
|
public class SystemItemRepositoryImplSqlite implements SystemItemRepository {
|
||||||
|
|
||||||
@ -130,7 +130,30 @@ public class SystemItemRepositoryImplSqlite implements SystemItemRepository {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void remove(String key) {
|
public void remove(String key) {
|
||||||
throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
|
if (key == null) {
|
||||||
|
throw new RuntimeException("key is null");
|
||||||
|
}
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
sb
|
||||||
|
.append("DELETE FROM ")
|
||||||
|
.append(SystemItemTable.TABLE_NAME)
|
||||||
|
.append(" WHERE ")
|
||||||
|
.append(SystemItemTable.KEY)
|
||||||
|
.append("=?");
|
||||||
|
|
||||||
|
String sql = sb.toString();
|
||||||
|
try (
|
||||||
|
Connection connection = sqliteConnectionFactory.createConnection(); PreparedStatement stmt = connection.prepareStatement(sql);) {
|
||||||
|
|
||||||
|
stmt.executeQuery();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
System.out.println(e.getMessage());
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
} catch (ClassNotFoundException ex) {
|
||||||
|
Logger.getLogger(SystemItemRepositoryImplSqlite.class.getName()).log(Level.SEVERE, null, ex);
|
||||||
|
} finally {
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
@ -1,5 +1,5 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// bit-inspector: Tool detecting bit rots in files.
|
// bit-backup: Tool detecting bit rots in files.
|
||||||
// Copyright (C) 2023-2023 the original author or authors.
|
// Copyright (C) 2023-2023 the original author or authors.
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
@ -16,7 +16,7 @@
|
|||||||
// along with this program; if not, write to the Free Software
|
// along with this program; if not, write to the Free Software
|
||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
package org.nanoboot.bitinspector.persistence.impl.sqlite;
|
package org.nanoboot.bitbackup.persistence.impl.sqlite;
|
||||||
|
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
@ -24,7 +24,7 @@ import lombok.Setter;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author <a href="mailto:robertvokac@nanoboot.org">Robert Vokac</a>
|
* @author <a href="mailto:mail@robertvokac.com">Robert Vokac</a>
|
||||||
*/
|
*/
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
Loading…
x
Reference in New Issue
Block a user