Compare commits

..

No commits in common. "1.17" and "1.11" have entirely different histories.
1.17 ... 1.11

58 changed files with 117 additions and 146 deletions

View file

@ -2,26 +2,23 @@
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="test"/>
<classpathentry kind="lib" path="lib/commons-codec-1.8.jar" sourcepath="lib/commons-codec-1.8-sources.jar"/>
<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
<classpathentry kind="lib" path="lib/mysql-jdbc-5.0.8.jar"/>
<classpathentry kind="lib" path="lib/Logs/log4j-1.2.17.jar" sourcepath="lib/Logs/log4j-1.2.17-source.zip"/>
<classpathentry kind="lib" path="lib/UnitTesting/hamcrest-core-1.3.jar" sourcepath="lib/UnitTesting/hamcrest-core-1.3-sources.jar"/>
<classpathentry kind="lib" path="lib/hsqldb-2.3.0.jar"/>
<classpathentry kind="lib" path="lib/Logs/slf4j-api-1.7.25.jar" sourcepath="lib/Logs/slf4j-api-1.7.25-sources.jar"/>
<classpathentry kind="lib" path="lib/Logs/slf4j-log4j12-1.7.25.jar" sourcepath="lib/Logs/slf4j-log4j12-1.7.25-sources.jar"/>
<classpathentry kind="lib" path="lib/UnitTesting/junit-4.12.jar" sourcepath="lib/UnitTesting/junit-4.12-sources.jar"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-17">
<classpathentry kind="lib" path="lib/commons-io-2.6.jar" sourcepath="lib/commons-io-2.6-sources.jar"/>
<classpathentry kind="lib" path="lib/commons-lang3-3.7.jar" sourcepath="lib/commons-lang3-3.7-sources.jar"/>
<classpathentry kind="lib" path="lib/devinsy-strings-0.8.2.jar" sourcepath="lib/devinsy-strings-0.8.2-sources.zip"/>
<classpathentry kind="lib" path="lib/devinsy-xml-0.8.2.jar" sourcepath="lib/devinsy-xml-0.8.2-sources.zip"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11">
<attributes>
<attribute name="module" value="true"/>
<attribute name="owner.project.facets" value="java"/>
</attributes>
</classpathentry>
<classpathentry kind="lib" path="lib/commons-io-2.16.1.jar" sourcepath="lib/commons-io-2.16.1-sources.jar"/>
<classpathentry kind="lib" path="lib/commons-lang3-3.13.0.jar" sourcepath="lib/commons-lang3-3.13.0-sources.jar"/>
<classpathentry kind="lib" path="lib/devinsy-strings-0.17.0.jar" sourcepath="lib/devinsy-strings-0.17.0-sources.zip"/>
<classpathentry kind="lib" path="lib/devinsy-xml-0.17.0.jar" sourcepath="lib/devinsy-xml-0.17.0-sources.zip"/>
<classpathentry kind="lib" path="lib/commons-codec-1.17.1.jar" sourcepath="lib/commons-codec-1.17.1-sources.jar"/>
<classpathentry kind="lib" path="lib/mariadb-java-client-3.4.1.jar"/>
<classpathentry kind="lib" path="lib/hsqldb-2.7.3.jar"/>
<classpathentry kind="lib" path="lib/Logs/log4j-api-2.23.1.jar"/>
<classpathentry kind="lib" path="lib/Logs/log4j-core-2.23.1.jar"/>
<classpathentry kind="lib" path="lib/Logs/log4j-slf4j2-impl-2.23.1.jar"/>
<classpathentry kind="lib" path="lib/Logs/slf4j-api-2.0.16.jar"/>
<classpathentry kind="lib" path="lib/commons-text-1.12.0.jar" sourcepath="lib/commons-text-1.12.0-sources.jar"/>
<classpathentry kind="output" path="bin"/>
</classpath>

View file

@ -1,2 +0,0 @@
eclipse.preferences.version=1
encoding/<project>=UTF-8

View file

@ -1,8 +1,8 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=17
org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
org.eclipse.jdt.core.compiler.compliance=17
org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@ -11,7 +11,7 @@ org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.release=enabled
org.eclipse.jdt.core.compiler.source=17
org.eclipse.jdt.core.compiler.source=11
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16

View file

@ -3,5 +3,5 @@
<fixed facet="java"/>
<fixed facet="jst.utility"/>
<installed facet="jst.utility" version="1.0"/>
<installed facet="java" version="17"/>
<installed facet="java" version="11"/>
</faceted-project>

View file

@ -1,3 +1,3 @@
#Build Number for ANT. Do not edit!
#Fri Aug 23 12:19:51 CEST 2024
build.number=1
#Wed Feb 28 19:03:09 CET 2018
build.number=0

View file

@ -1,3 +1,3 @@
product.name=sikevadb
product.revision.major=1
product.revision.minor=17
product.revision.minor=8

Binary file not shown.

BIN
lib/Logs/log4j-1.2.17.jar Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
lib/commons-codec-1.8.jar Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
lib/commons-io-2.6.jar Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
lib/commons-lang3-3.7.jar Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
lib/devinsy-xml-0.8.2.jar Normal file

Binary file not shown.

BIN
lib/hsqldb-2.3.0.jar Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
lib/mysql-jdbc-5.0.8.jar Normal file

Binary file not shown.

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2013-2024 Christian Pierre MOMON <christian.momon@devinsy.fr>
* Copyright (C) 2013-2017 Christian Pierre MOMON <christian.momon@devinsy.fr>
*
* This file is part of SikevaDB, simple key value database.
*
@ -21,8 +21,8 @@ package fr.devinsy.sikevadb;
import java.io.File;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.logging.log4j.core.config.Configurator;
import org.apache.logging.log4j.core.config.DefaultConfiguration;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.PropertyConfigurator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -55,13 +55,13 @@ public final class SikevaDBLauncher
File loggerConfig = new File("log4j.properties");
if (loggerConfig.exists())
{
Configurator.initialize(null, loggerConfig.getAbsolutePath());
PropertyConfigurator.configure(loggerConfig.getAbsolutePath());
logger.info("Dedicated log configuration done.");
logger.info("Configuration file was found in [{}].", loggerConfig.getAbsoluteFile());
}
else
{
Configurator.initialize(new DefaultConfiguration());
BasicConfigurator.configure();
logger.info("Basic log configuration done.");
logger.info("Configuration file was not found in [{}].", loggerConfig.getAbsoluteFile());
}

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2013-2024 Christian Pierre MOMON <christian.momon@devinsy.fr>
* Copyright (C) 2013-2018 Christian Pierre MOMON <christian.momon@devinsy.fr>
*
* This file is part of SikevaDB, simple key value database.
*
@ -22,8 +22,8 @@ package fr.devinsy.sikevadb.cli;
import java.io.File;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.core.config.Configurator;
import org.apache.logging.log4j.core.config.DefaultConfiguration;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.PropertyConfigurator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -76,13 +76,13 @@ public final class SikevaDBCLI
File loggerConfig = new File("log4j.properties");
if (loggerConfig.exists())
{
Configurator.initialize(null, loggerConfig.getAbsolutePath());
PropertyConfigurator.configure(loggerConfig.getAbsolutePath());
logger.info("Dedicated log configuration done.");
logger.info("Configuration file was found in [{}].", loggerConfig.getAbsoluteFile());
}
else
{
Configurator.initialize(new DefaultConfiguration());
BasicConfigurator.configure();
logger.info("Basic log configuration done.");
logger.info("Configuration file was not found in [{}].", loggerConfig.getAbsoluteFile());
}

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2013-2024 Christian Pierre MOMON <christian.momon@devinsy.fr>
* Copyright (C) 2013-2017 Christian Pierre MOMON <christian.momon@devinsy.fr>
*
* This file is part of SikevaDB, simple key value database.
*
@ -20,6 +20,8 @@ package fr.devinsy.sikevadb.core;
/**
* The Interface Archiver.
*
* @author Christian Pierre MOMON
*/
public interface Archiver
{
@ -29,50 +31,17 @@ public interface Archiver
SUSPENDED
}
/**
* Activate.
*/
void activate();
/**
* Archive.
*
* @param element
* the element
* @throws SikevaDBException
* the sikeva DB exception
*/
void archive(Element element) throws SikevaDBException;
/**
* Clear.
*
* @throws SikevaDBException
* the sikeva DB exception
*/
void clear() throws SikevaDBException;
/**
* Close.
*/
void close();
/**
* Checks if is activated.
*
* @return true, if is activated
*/
boolean isActivated();
/**
* Checks if is suspended.
*
* @return true, if is suspended
*/
boolean isSuspended();
/**
* Suspend.
*/
void suspend();
}

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2024 Christian Pierre MOMON <christian.momon@devinsy.fr>
* Copyright (C) 2018 Christian Pierre MOMON <christian.momon@devinsy.fr>
*
* This file is part of SikevaDB, simple key value database.
*
@ -19,14 +19,15 @@
package fr.devinsy.sikevadb.core;
/**
* The Class ClosedDatabaseException.
*
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
*/
public class ClosedDatabaseException extends SikevaDBException
{
private static final long serialVersionUID = 8364599416669077052L;
/**
* Instantiates a new closed database exception.
*
*/
public ClosedDatabaseException()
{
@ -34,10 +35,8 @@ public class ClosedDatabaseException extends SikevaDBException
}
/**
* Instantiates a new closed database exception.
*
* @param message
* the message
*/
public ClosedDatabaseException(final String message)
{
@ -45,12 +44,9 @@ public class ClosedDatabaseException extends SikevaDBException
}
/**
* Instantiates a new closed database exception.
*
* @param message
* the message
* @param cause
* the cause
*/
public ClosedDatabaseException(final String message, final Throwable cause)
{
@ -58,10 +54,8 @@ public class ClosedDatabaseException extends SikevaDBException
}
/**
* Instantiates a new closed database exception.
*
* @param cause
* the cause
*/
public ClosedDatabaseException(final Throwable cause)
{

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2024 Christian Pierre MOMON <christian.momon@devinsy.fr>
* Copyright (C) 2018 Christian Pierre MOMON <christian.momon@devinsy.fr>
*
* This file is part of SikevaDB, simple key value database.
*
@ -19,14 +19,15 @@
package fr.devinsy.sikevadb.core;
/**
* The Class OpenedDatabaseException.
*
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
*/
public class OpenedDatabaseException extends SikevaDBException
{
private static final long serialVersionUID = 8364599416669077052L;
/**
* Instantiates a new opened database exception.
*
*/
public OpenedDatabaseException()
{
@ -34,10 +35,8 @@ public class OpenedDatabaseException extends SikevaDBException
}
/**
* Instantiates a new opened database exception.
*
* @param message
* the message
*/
public OpenedDatabaseException(final String message)
{
@ -45,12 +44,9 @@ public class OpenedDatabaseException extends SikevaDBException
}
/**
* Instantiates a new opened database exception.
*
* @param message
* the message
* @param cause
* the cause
*/
public OpenedDatabaseException(final String message, final Throwable cause)
{
@ -58,10 +54,8 @@ public class OpenedDatabaseException extends SikevaDBException
}
/**
* Instantiates a new opened database exception.
*
* @param cause
* the cause
*/
public OpenedDatabaseException(final Throwable cause)
{

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2013-2024 Christian Pierre MOMON <christian.momon@devinsy.fr>
* Copyright (C) 2013-2018 Christian Pierre MOMON <christian.momon@devinsy.fr>
*
* This file is part of SikevaDB, simple key value database.
*
@ -284,28 +284,18 @@ public interface SikevaDB
public String getValue(String key, String subkey) throws SikevaDBException;
/**
* Gets the values.
* Gets the values of a key.
*
* @param key
* the key
* @return the values
* @throws SikevaDBException
* the sikeva DB exception
* the SikevaDB exception
*/
public StringList getValues(String key) throws SikevaDBException;
/**
* Checks if is archive activated.
*
* @return true, if is archive activated
*/
boolean isArchiveActivated();
/**
* Checks if is archive suspended.
*
* @return true, if is archive suspended
*/
boolean isArchiveSuspended();
/**

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2013-2024 Christian Pierre MOMON <christian.momon@devinsy.fr>
* Copyright (C) 2013-2018 Christian Pierre MOMON <christian.momon@devinsy.fr>
*
* This file is part of SikevaDB, simple key value database.
*
@ -41,20 +41,22 @@ import fr.devinsy.xml.XMLZipWriter;
/**
* The Class XMLSikevaDB represents a XML persister.
*
* @author Christian Pierre MOMON (christian.momon@devinsy.fr)
*/
public class XMLSikevaDB
{
private static final Logger logger = LoggerFactory.getLogger(XMLSikevaDB.class);
/**
* Export.
* Export in XML a database in a file.
*
* @param out
* the out
* @param source
* the source
* @throws SikevaDBException
* the sikeva DB exception
* the SikevaDB exception
* @throws FileNotFoundException
* the file not found exception
*/
@ -150,6 +152,9 @@ public class XMLSikevaDB
* the database
* @param file
* the file
*
* @throws Exception
* the exception
*/
public static void importData(final SikevaDB database, final File file)
{
@ -173,7 +178,6 @@ public class XMLSikevaDB
* the in
* @return the element
* @throws SikevaDBException
* the sikeva DB exception
*/
public static Element readElement(final XMLReader in) throws SikevaDBException
{
@ -244,8 +248,12 @@ public class XMLSikevaDB
* the target
* @param in
* the in
* @throws XMLBadFormatException
* @throws XMLStreamException
* @throws SikevaDBException
* the sikeva DB exception
*
* @throws Exception
* the exception
*/
public static void readElements(final SikevaDB target, final XMLReader in) throws SikevaDBException
{
@ -334,15 +342,17 @@ public class XMLSikevaDB
}
/**
* Write in an XML writer the elements of a database, sorting by keys and
* sub keys.
* Write in an XML writer the elements of a database, sorting by keys and sub
* keys.
*
* @param out
* the out
* @param source
* the source
* @throws SikevaDBException
* the sikeva DB exception
*
* @throws Exception
* the exception
*/
public static void write(final XMLWriter out, final SikevaDB source) throws SikevaDBException
{

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2013-2024 Christian Pierre MOMON <christian.momon@devinsy.fr>
* Copyright (C) 2013-2018 Christian Pierre MOMON <christian.momon@devinsy.fr>
*
* This file is part of SikevaDB, simple key value database.
*
@ -22,8 +22,8 @@ package fr.devinsy.sikevadb.demo;
import java.io.File;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.core.config.Configurator;
import org.apache.logging.log4j.core.config.DefaultConfiguration;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.PropertyConfigurator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -171,13 +171,13 @@ public final class SikevaDBDemo
File loggerConfig = new File("log4j.properties");
if (loggerConfig.exists())
{
Configurator.initialize(null, loggerConfig.getAbsolutePath());
PropertyConfigurator.configure(loggerConfig.getAbsolutePath());
logger.info("Dedicated log configuration done.");
logger.info("Configuration file was found in [{}].", loggerConfig.getAbsoluteFile());
}
else
{
Configurator.initialize(new DefaultConfiguration());
BasicConfigurator.configure();
logger.info("Basic log configuration done.");
logger.info("Configuration file was not found in [{}].", loggerConfig.getAbsoluteFile());
}

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2013-2024 Christian Pierre MOMON <christian.momon@devinsy.fr>
* Copyright (C) 2013-2017 Christian Pierre MOMON <christian.momon@devinsy.fr>
*
* This file is part of SikevaDB, simple key value database.
*
@ -27,7 +27,10 @@ import fr.devinsy.sikevadb.core.SikevaDBException;
/**
* The Class SQLArchiver.
*
* @author Christian Pierre MOMON
*/
public class SQLArchiver implements Archiver
{
private static final Logger logger = LoggerFactory.getLogger(SQLArchiver.class);;

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2013-2024 Christian Pierre MOMON <christian.momon@devinsy.fr>
* Copyright (C) 2013-2018 Christian Pierre MOMON <christian.momon@devinsy.fr>
*
* This file is part of SikevaDB, simple key value database.
*
@ -20,7 +20,6 @@ package fr.devinsy.sikevadb.sql;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
@ -133,7 +132,6 @@ public class SQLSikevaDB implements SikevaDB
* Activate archiver.
*
* @throws ClosedDatabaseException
* the closed database exception
*/
public void activateArchiver() throws ClosedDatabaseException
{
@ -1810,7 +1808,7 @@ public class SQLSikevaDB implements SikevaDB
//
if (this.url != null)
{
Class.forName(this.driverClassname).getDeclaredConstructor().newInstance();
Class.forName(this.driverClassname).newInstance();
this.singleConnection = DriverManager.getConnection(this.url, this.login, this.password);
logger.info("Single connection opened with [{}].", this.url);
this.status = Status.OPENED;
@ -1830,8 +1828,27 @@ public class SQLSikevaDB implements SikevaDB
throw new IllegalArgumentException("Undefined source.");
}
}
catch (IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException | NamingException | SQLException | InstantiationException | IllegalAccessException
| ClassNotFoundException exception)
catch (InstantiationException exception)
{
logger.error("Error opening database.", exception);
throw new SikevaDBException("Error opening database.");
}
catch (IllegalAccessException exception)
{
logger.error("Error opening database.", exception);
throw new SikevaDBException("Error opening database.");
}
catch (ClassNotFoundException exception)
{
logger.error("Error opening database.", exception);
throw new SikevaDBException("Error opening database.");
}
catch (SQLException exception)
{
logger.error("Error opening database.", exception);
throw new SikevaDBException("Error opening database.");
}
catch (NamingException exception)
{
logger.error("Error opening database.", exception);
throw new SikevaDBException("Error opening database.");

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2013-2024 Christian Pierre MOMON <christian.momon@devinsy.fr>
* Copyright (C) 2013-2017 Christian Pierre MOMON <christian.momon@devinsy.fr>
*
* This file is part of SikevaDB, simple key value database.
*
@ -22,7 +22,6 @@ import java.io.BufferedReader;
import java.io.IOException;
import java.io.StringReader;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.Date;
@ -56,7 +55,7 @@ public class SQLSikevaDBTools
{
StringList result;
String script = IOUtils.toString(source, StandardCharsets.UTF_8);
String script = IOUtils.toString(source);
result = splitSQLCommands(script);

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2013-2024 Christian Pierre MOMON, DEVINSY
* Copyright (C) 2013-2018 Christian Pierre MOMON, DEVINSY
*
* This file is part of SikevaDB, simple key value database.
*
@ -23,9 +23,9 @@ import java.time.LocalDateTime;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.config.Configurator;
import org.apache.logging.log4j.core.config.DefaultConfiguration;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
@ -717,8 +717,8 @@ public class TreeFileSikevaDBTest
@BeforeClass
public static void beforeClass() throws SikevaDBException
{
Configurator.initialize(new DefaultConfiguration());
Configurator.setRootLevel(Level.DEBUG);
BasicConfigurator.configure();
Logger.getRootLogger().setLevel(Level.DEBUG);
// Add ?profileSQL=true to generate huge logs.

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2013-2024 Christian Pierre MOMON, DEVINSY
* Copyright (C) 2013-2018 Christian Pierre MOMON, DEVINSY
*
* This file is part of SikevaDB, simple key value database.
*
@ -22,9 +22,9 @@ import java.time.LocalDateTime;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.core.config.Configurator;
import org.apache.logging.log4j.core.config.DefaultConfiguration;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
@ -692,8 +692,8 @@ public class SQLSikevaDBTest
@BeforeClass
public static void beforeClass() throws SikevaDBException
{
Configurator.initialize(new DefaultConfiguration());
Configurator.setRootLevel(Level.DEBUG);
BasicConfigurator.configure();
Logger.getRootLogger().setLevel(Level.ERROR);
// Add ?profileSQL=true to generate huge logs.