public FileDatabase(bool readOnly)
        {
            this.readOnly = readOnly;
            this.dbConnector = new DBConnector(Constants.selectProgramAppDataFolder(Constants.DbFileName), Constants.FileNodesDefinition);

            // Connect to metadata regardless so it can be switched on whilst running
            string mdbPath = Constants.selectProgramAppDataFolder(Constants.MetadataFileName);
            this.metaDataDbConnector = new DBConnector(
                mdbPath,
                Constants.MetadataDefinition,
                false
            );

            this.dbConnector.ExecuteNonQuery(@"ATTACH DATABASE '" + mdbPath + "' AS mdb;");
        }
        public DataRow getImageById(long id, long offset, string sortByColumn, SortOrder sortByDirection)
        {
            string        tableName = this.filterReady();
            SQLiteCommand command;
            DataRow       dr;

            if (offset == 0)
            {
                command = new SQLiteCommand("SELECT * FROM `" + tableName + "` WHERE (id = @id) LIMIT 1;", this.dbConnector.connection);
                command.Parameters.AddWithValue("@id", id);
                dr = DBConnector.executeReaderFirstDataRow(command);
                if (dr == null)
                {
                    return(this.getFirstImage(sortByColumn, sortByDirection));
                }
            }
            else
            {
                if (sortByColumn == null)
                {
                    sortByColumn = "path";
                }
                if (sortByDirection == null)
                {
                    sortByDirection = new SortOrder(SortOrder.Direction.ASC);
                }
                string than = "<";

                if (sortByDirection.isDESC())
                {
                    offset *= -1;
                }
                if (offset < 0)
                {
                    than = "<";
                    sortByDirection.setDESC();
                }
                else
                {
                    than = ">";
                    sortByDirection.setASC();
                }

                string sqlValue = "(SELECT " + sortByColumn + " FROM `" + tableName + "` WHERE `" + tableName + "`.id = @id)";

                string sql = "FROM `" + tableName + "` WHERE (" + sortByColumn + " " + than + " " + sqlValue + ") " +
                             " OR ((" + sortByColumn + " = " + sqlValue + " AND id " + than + " @id)) " +
                             "ORDER BY " + sortByColumn + " " + sortByDirection.ToString() + ", id " + sortByDirection.ToString();

                command = new SQLiteCommand(@"SELECT * " + sql + " LIMIT 1 OFFSET " + (Math.Abs(offset) - 1) + ";", this.dbConnector.connection);
                command.Parameters.AddWithValue("@id", id);
                dr = DBConnector.executeReaderFirstDataRow(command);
                if (dr == null)
                {
                    command = new SQLiteCommand(@"SELECT COUNT(`" + tableName + "`.id) " + sql, this.dbConnector.connection);
                    command.Parameters.AddWithValue("@id", id);
                    dr = DBConnector.executeReaderFirstDataRow(command);
                    if (dr != null)
                    {
                        if (offset < 0)
                        {
                            offset += Convert.ToInt32(dr[0]) + 1;
                        }
                        else
                        {
                            offset -= Convert.ToInt32(dr[0]) + 1;
                        }
                        if (this.nrImagesFilter() > 0)
                        {
                            offset = offset % this.nrImagesFilter();
                        }
                        dr = getFirstImage(sortByColumn, sortByDirection, offset);
                    }
                }
            }
            return(dr);
        }
        public DataRow nextMetadataLessImage()
        {
            SQLiteCommand command = new SQLiteCommand("SELECT * FROM `FileNodes` WHERE metainfoindexed = 0 LIMIT 1;", this.dbConnector.connection);

            return(DBConnector.executeReaderFirstDataRow(command));
        }
 public SQLiteConnection connectToDB()
 {
     this.dbConnector = new DBConnector(Constants.selectProgramAppDataFolder(Constants.PersistantConfigFileName), Constants.SettingsDefinition, false);
     //return new SQLiteConnection("Data Source=" + path + ";Version=3;");
     return this.dbConnector.connection;
 }