Skip to content

Commit

Permalink
ZooCheckDb update
Browse files Browse the repository at this point in the history
  • Loading branch information
tzaeschke committed May 23, 2020
1 parent 90c972b commit 8ca117e
Show file tree
Hide file tree
Showing 2 changed files with 182 additions and 57 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
CHANGELOG
=========

2020-May-23
===========
- T. Zaeschke
- Improved ZooCheckDb tool to print out schema and index information

2020-May-09
===========
- T. Zaeschke
Expand Down
234 changes: 177 additions & 57 deletions src/org/zoodb/tools/ZooCheckDb.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;

import javax.jdo.JDOHelper;
import javax.jdo.PersistenceManager;
Expand All @@ -25,71 +26,190 @@
import org.zoodb.internal.Session;
import org.zoodb.internal.server.FileHeader;
import org.zoodb.internal.server.SessionFactory;
import org.zoodb.internal.util.FormattedStringBuilder;
import org.zoodb.jdo.ZooJdoHelper;
import org.zoodb.jdo.ZooJdoProperties;
import org.zoodb.schema.ZooClass;
import org.zoodb.schema.ZooField;
import org.zoodb.tools.internal.ZooCommandLineTool;

public class ZooCheckDb extends ZooCommandLineTool {

private static final String DB_NAME = "TestDb";
//private static final String DB_NAME = "RandomRegularGraph-n1000-d20";
//private static final String DB_NAME = "zoodb";
//private static final String DB_NAME = "D:\\data\\SEDD-12-08\\stackoverflow2.zdb";
//private static final String DB_NAME = "StackBicycles";
//private static final String DB_NAME = "StackServerFault";

public static void main(String ... args) {
String dbName;
if (args.length == 0) {
dbName = DB_NAME;
} else {
dbName = args[0];
}

if (!ZooHelper.getDataStoreManager().dbExists(dbName)) {
err.println("ERROR Database not found: " + dbName);
return;
}

//read header
out.println("Database file info: " + dbName);
Path path = Paths.get(ZooHelper.getDataStoreManager().getDbPath(dbName));
FileHeader header = SessionFactory.readHeader(path);
if (!header.successfulRead()) {
out.println("ERROR reading file: " + header.errorMsg());
}
out.println("magic number: " + Integer.toHexString(header.getFileID()));
out.println("format version: " + header.getVersionMajor() + "." + header.getVersionMinor());
out.println("page size: " + header.getPageSize());
out.print("root page IDs: ");
for (int id : header.getRootPages()) {
out.print(id + ", ");
}
private static final String DB_NAME = "TestDb.zdb";

private static final String RULE = "================================";

private static boolean longNames = false;

public static void main(String... args) {
String dbName;
boolean listSchema = true;
boolean listIndexes = true;

if (Arrays.binarySearch(args, "--help") >= 0 || Arrays.binarySearch(args, "-help") >= 0) {
out.println("Usage: ZooCheckDb <options> databaseFileName");
out.println(" This tools performs a basic sanity check of the database and prints ");
out.println(" out database statistics. Print out of additional information can be ");
out.println(" controlled by <options>.");
out.println("Options:");
out.println(" --help: Print help");
out.println(" --list-indexes: List all database indexes");
out.println(" --list-schema: List all schemata");
out.println(" --long-names: Print fully qualified class and type names");
return;
}

if (args.length == 0) {
dbName = DB_NAME;
} else {
dbName = args[args.length - 1];
listSchema = Arrays.binarySearch(args, "--list-schema") >= 0;
listIndexes = Arrays.binarySearch(args, "--list-indexes") >= 0;
longNames = Arrays.binarySearch(args, "--long-names") >= 0;
}

if (!ZooHelper.getDataStoreManager().dbExists(dbName)) {
err.println("ERROR Database not found: " + dbName);
return;
}

//read header
out.println("Database file info: " + dbName);
Path path = Paths.get(ZooHelper.getDataStoreManager().getDbPath(dbName));
FileHeader header = SessionFactory.readHeader(path);
if (!header.successfulRead()) {
out.println("ERROR reading file: " + header.errorMsg());
}
out.println("magic number: " + Integer.toHexString(header.getFileID()));
out.println("format version: " + header.getVersionMajor() + "." + header.getVersionMinor());
out.println("page size: " + header.getPageSize());
out.print("root page IDs: ");
for (int id : header.getRootPages()) {
out.print(id + ", ");
}
out.println();
out.println();

if (!header.successfulRead()) {
out.println("Aborting due to error.");
return;
}


out.println("Checking database: " + dbName);

ZooJdoProperties props = new ZooJdoProperties(dbName);
PersistenceManagerFactory pmf = JDOHelper.getPersistenceManagerFactory(props);
PersistenceManager pm = pmf.getPersistenceManager();
Session s = (Session) pm.getDataStoreConnection().getNativeConnection();
String report = s.getPrimaryNode().checkDb();
out.println();
out.println("Report");
out.println("======");

out.println(report);

out.println("======");
pm.close();
pmf.close();
out.println("Checking database done.");
}
out.println("Aborting due to error.");
return;
}


ZooJdoProperties props = new ZooJdoProperties(dbName);
PersistenceManagerFactory pmf = JDOHelper.getPersistenceManagerFactory(props);
PersistenceManager pm = pmf.getPersistenceManager();
Session s = (Session) pm.getDataStoreConnection().getNativeConnection();
String report = s.getPrimaryNode().checkDb();
out.println();
out.println("Check / Statistics");
out.println(RULE);
out.print(report);
out.println(RULE);
pm.close();
pmf.close();
out.println();

if (listSchema) {
listSchema(dbName);
}

if (listIndexes) {
listIndexes(dbName);
}

out.println("Checking database done.");
}

private static void listIndexes(String dbName) {
out.println("Index Report");
out.println(RULE);

ZooJdoProperties props = new ZooJdoProperties(dbName);
PersistenceManagerFactory pmf = JDOHelper.getPersistenceManagerFactory(props);
PersistenceManager pm = pmf.getPersistenceManager();
pm.currentTransaction().begin();
FormattedStringBuilder s = new FormattedStringBuilder();
int nIndexes = 0;
for (ZooClass cls : ZooJdoHelper.schema(pm).getAllClasses()) {
for (ZooField f : cls.getAllFields()) {
if (f.hasIndex()) {
nIndexes++;
if (f.isIndexUnique()) {
s.append(" unique index: ");
} else {
s.append(" non-unique index: ");
}
s.append(className(cls.getName()));
s.appendln(".", f.getName());
s.appendln(" ", className(f.getTypeName()));
}
}
}
s.appendln("Indexes found: " + nIndexes);
s.appendln(RULE);
s.appendln();
out.print(s);
pm.currentTransaction().rollback();
pm.close();
pmf.close();
}

private static void listSchema(String dbName) {
out.println("Schema Report");
out.println(RULE);

ZooJdoProperties props = new ZooJdoProperties(dbName);
PersistenceManagerFactory pmf = JDOHelper.getPersistenceManagerFactory(props);
PersistenceManager pm = pmf.getPersistenceManager();
pm.currentTransaction().begin();
FormattedStringBuilder s = new FormattedStringBuilder();
int nIndexes = 0;
int nClasses = 0;
int nFields = 0;
for (ZooClass cls : ZooJdoHelper.schema(pm).getAllClasses()) {
nClasses++;
s.append(className(cls.getName()));
if (cls.getSuperClass() != null &&
!cls.getSuperClass().getName().startsWith("org.zoodb")) {
s.append(" : ");
s.append(className(cls.getSuperClass().getName()));
}
s.appendln(" {");
for (ZooField f : cls.getAllFields()) {
nFields++;
s.append(" " + className(f.getTypeName()) + " " + f.getName());
if (f.hasIndex()) {
nIndexes++;
s.append(" indexed");
if (f.isIndexUnique()) {
s.append(" unique");
}
}
s.appendln();
}
s.appendln("}");
}
s.appendln("Classes found: " + nClasses);
s.appendln("Fields found: " + nFields);
s.appendln("Indexes found: " + nIndexes);
s.appendln(RULE);
s.appendln();
out.print(s);
pm.currentTransaction().rollback();
pm.close();
pmf.close();
}

private static String className(String name) {
if (longNames) {
return name;
}
int pos = name.lastIndexOf('.');
if (pos >= 0) {
return name.substring(pos + 1);
}
return name;
}

}

0 comments on commit 8ca117e

Please sign in to comment.