org.hsqldb.sample.FindFile Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of sqltool Show documentation
Show all versions of sqltool Show documentation
HSQLDB - Lightweight 100% Java SQL Database Engine
/*
* For work developed by the HSQL Development Group:
*
* Copyright (c) 2001-2021, The HSQL Development Group
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* Neither the name of the HSQL Development Group nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG,
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*
*
* For work originally developed by the Hypersonic SQL Group:
*
* Copyright (c) 1995-2000, The Hypersonic SQL Group.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* Neither the name of the Hypersonic SQL Group nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE HYPERSONIC SQL GROUP,
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* on behalf of the Hypersonic SQL Group.
*/
package org.hsqldb.sample;
import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* Extract a directory tree and store in an HSQLDB database.
*
* Improved in HSQLDB.
*
* @author Thomas Mueller (Hypersonic SQL Group)
* @version 1.7.0
* @since Hypersonic SQL
*/
class FindFile {
/**
* Extracts a directory tree and stores it ina HSQLDB database.
* Usage:
*
* java org.hsqldb.sample.FindFile -init .
* Re-create database from directory '.'
* java org.hsqldb.sample.FindFile name
* Find files with names containing 'name'
*
*
* @param arg arguments
*/
public static void main(String[] arg) {
// Exceptions may occur
try {
// Load the HSQLDB Database Engine JDBC driver
Class.forName("org.hsqldb.jdbc.JDBCDriver");
// Connect to the database
// The database will be created automatically if it does not exist
// 'testfiles' in the URL is the name of the database
// "SA" is the user name and "" is the (empty) password
Connection conn =
DriverManager.getConnection("jdbc:hsqldb:testfiles", "SA",
"");
// Check the command line parameters
if (arg.length == 1) {
// One parameter:
// Find and print the list of file names that contain the parameter
listFiles(conn, arg[0]);
} else if ((arg.length == 2) && arg[0].equals("-init")) {
// Command line parameters: -init pathname
// Initialise the database and fill all file names in
fillFileNames(conn, arg[1]);
} else {
// Display the usage info
System.out.println("Usage:");
System.out.println("java FindFile -init .");
System.out.println(" Re-create database from directory '.'");
System.out.println("java FindFile name");
System.out.println(" Find files like 'name'");
}
// Finally, close the connection
conn.close();
} catch (Exception e) {
// Print out the error message
System.out.println(e);
e.printStackTrace();
}
}
/**
* Search in the database and list out files LIKE the given name
*/
static void listFiles(Connection conn, String name) throws SQLException {
System.out.println("Files like '" + name + "'");
// Convert to upper case, so the search is case-insensitive
name = name.toUpperCase();
// Create a statement object
Statement stat = conn.createStatement();
// Now execute the search query
// UCASE: This is a case-insensitive search
// ESCAPE ':' is used so we can search for any characters in file names
ResultSet result = stat.executeQuery("SELECT Path FROM Files WHERE "
+ "UCASE(Path) LIKE '%" + name
+ "%' ESCAPE ':'");
// Moves to the next record until no more records
while (result.next()) {
// Print the first column of the result
// could use also getString("path")
System.out.println(result.getString(1));
}
// Close the ResultSet - not really necessary, but recommended
result.close();
}
/**
* Re-create the database and fill the file names in *
*/
static void fillFileNames(Connection conn,
String root) throws SQLException {
System.out.println("Re-creating the database...");
// Create a statement object
Statement stat = conn.createStatement();
// Try to drop the table
try {
stat.executeUpdate("DROP TABLE Files");
} catch (SQLException e) { // Ignore Exception, because the table may not yet exist
}
// The varchar size should be large enough for long paths
stat.execute("CREATE TABLE Files"
+ "(path VARCHAR(255),name VARCHAR(255))");
// Close the Statement object, it is no longer used
stat.close();
// Use a PreparedStatement because Path and Name could contain the single quote character
PreparedStatement prep =
conn.prepareCall("INSERT INTO Files (path,name) VALUES (?,?)");
// Start with the 'root' directory and recurse all subdirectories
fillPath(root, "", prep);
// Close the PreparedStatement
prep.close();
System.out.println("Finished");
}
/**
* Fill the file names, using the PreparedStatement
*/
static void fillPath(String path, String name,
PreparedStatement prep) throws SQLException {
File f = new File(path);
if (f.isFile()) {
// Clear all Parameters of the PreparedStatement
prep.clearParameters();
// Fill the first parameter: Path
prep.setString(1, path);
// Fill the second parameter: Name
prep.setString(2, name);
// Its a file: add it to the table
prep.execute();
} else if (f.isDirectory()) {
if (!path.endsWith(File.separator)) {
path += File.separator;
}
String[] list = f.list();
// Process all files recursivly
for (int i = 0; (list != null) && (i < list.length); i++) {
fillPath(path + list[i], list[i], prep);
}
}
}
}