mirror of
https://github.com/KingDuckZ/dindexer.git
synced 2025-08-08 13:49:47 +00:00
Add column 'type' to sets and take its value on command line.
This commit is contained in:
parent
585c7f45b7
commit
911da3bb00
9 changed files with 78 additions and 25 deletions
45
dindexer.sql
45
dindexer.sql
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
-- Dumped from database version 9.4.5
|
-- Dumped from database version 9.4.5
|
||||||
-- Dumped by pg_dump version 9.4.5
|
-- Dumped by pg_dump version 9.4.5
|
||||||
-- Started on 2015-11-11 13:26:58 GMT
|
-- Started on 2015-11-11 20:03:40 GMT
|
||||||
|
|
||||||
SET statement_timeout = 0;
|
SET statement_timeout = 0;
|
||||||
SET lock_timeout = 0;
|
SET lock_timeout = 0;
|
||||||
|
@ -22,7 +22,7 @@ CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- TOC entry 2035 (class 0 OID 0)
|
-- TOC entry 2037 (class 0 OID 0)
|
||||||
-- Dependencies: 178
|
-- Dependencies: 178
|
||||||
-- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner:
|
-- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner:
|
||||||
--
|
--
|
||||||
|
@ -90,7 +90,7 @@ CREATE SEQUENCE files_id_seq
|
||||||
ALTER TABLE files_id_seq OWNER TO @USERNAME@;
|
ALTER TABLE files_id_seq OWNER TO @USERNAME@;
|
||||||
|
|
||||||
--
|
--
|
||||||
-- TOC entry 2036 (class 0 OID 0)
|
-- TOC entry 2038 (class 0 OID 0)
|
||||||
-- Dependencies: 174
|
-- Dependencies: 174
|
||||||
-- Name: files_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: @USERNAME@
|
-- Name: files_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: @USERNAME@
|
||||||
--
|
--
|
||||||
|
@ -106,12 +106,29 @@ ALTER SEQUENCE files_id_seq OWNED BY files.id;
|
||||||
CREATE TABLE sets (
|
CREATE TABLE sets (
|
||||||
id integer NOT NULL,
|
id integer NOT NULL,
|
||||||
"desc" text NOT NULL,
|
"desc" text NOT NULL,
|
||||||
creation time with time zone DEFAULT now() NOT NULL
|
creation time with time zone DEFAULT now() NOT NULL,
|
||||||
|
type character(1) DEFAULT 'D'::bpchar NOT NULL,
|
||||||
|
CONSTRAINT chk_sets_type CHECK ((((((((type = 'D'::bpchar) OR (type = 'V'::bpchar)) OR (type = 'B'::bpchar)) OR (type = 'F'::bpchar)) OR (type = 'H'::bpchar)) OR (type = 'Z'::bpchar)) OR (type = 'O'::bpchar)))
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
ALTER TABLE sets OWNER TO @USERNAME@;
|
ALTER TABLE sets OWNER TO @USERNAME@;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- TOC entry 2039 (class 0 OID 0)
|
||||||
|
-- Dependencies: 177
|
||||||
|
-- Name: COLUMN sets.type; Type: COMMENT; Schema: public; Owner: @USERNAME@
|
||||||
|
--
|
||||||
|
|
||||||
|
COMMENT ON COLUMN sets.type IS 'D = directory
|
||||||
|
V = DVD
|
||||||
|
B = BluRay
|
||||||
|
F = Floppy Disk
|
||||||
|
H = Hard Disk
|
||||||
|
Z = Iomega Zip
|
||||||
|
O = Other';
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- TOC entry 176 (class 1259 OID 31409)
|
-- TOC entry 176 (class 1259 OID 31409)
|
||||||
-- Name: sets_id_seq; Type: SEQUENCE; Schema: public; Owner: @USERNAME@
|
-- Name: sets_id_seq; Type: SEQUENCE; Schema: public; Owner: @USERNAME@
|
||||||
|
@ -128,7 +145,7 @@ CREATE SEQUENCE sets_id_seq
|
||||||
ALTER TABLE sets_id_seq OWNER TO @USERNAME@;
|
ALTER TABLE sets_id_seq OWNER TO @USERNAME@;
|
||||||
|
|
||||||
--
|
--
|
||||||
-- TOC entry 2037 (class 0 OID 0)
|
-- TOC entry 2040 (class 0 OID 0)
|
||||||
-- Dependencies: 176
|
-- Dependencies: 176
|
||||||
-- Name: sets_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: @USERNAME@
|
-- Name: sets_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: @USERNAME@
|
||||||
--
|
--
|
||||||
|
@ -153,7 +170,7 @@ ALTER TABLE ONLY sets ALTER COLUMN id SET DEFAULT nextval('sets_id_seq'::regclas
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- TOC entry 1912 (class 2606 OID 31289)
|
-- TOC entry 1914 (class 2606 OID 31289)
|
||||||
-- Name: pk_files_id; Type: CONSTRAINT; Schema: public; Owner: @USERNAME@; Tablespace:
|
-- Name: pk_files_id; Type: CONSTRAINT; Schema: public; Owner: @USERNAME@; Tablespace:
|
||||||
--
|
--
|
||||||
|
|
||||||
|
@ -162,7 +179,7 @@ ALTER TABLE ONLY files
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- TOC entry 1916 (class 2606 OID 31420)
|
-- TOC entry 1918 (class 2606 OID 31420)
|
||||||
-- Name: pk_sets_id; Type: CONSTRAINT; Schema: public; Owner: @USERNAME@; Tablespace:
|
-- Name: pk_sets_id; Type: CONSTRAINT; Schema: public; Owner: @USERNAME@; Tablespace:
|
||||||
--
|
--
|
||||||
|
|
||||||
|
@ -171,7 +188,7 @@ ALTER TABLE ONLY sets
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- TOC entry 1914 (class 2606 OID 31294)
|
-- TOC entry 1916 (class 2606 OID 31294)
|
||||||
-- Name: uniq_item; Type: CONSTRAINT; Schema: public; Owner: @USERNAME@; Tablespace:
|
-- Name: uniq_item; Type: CONSTRAINT; Schema: public; Owner: @USERNAME@; Tablespace:
|
||||||
--
|
--
|
||||||
|
|
||||||
|
@ -180,7 +197,7 @@ ALTER TABLE ONLY files
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- TOC entry 1909 (class 1259 OID 31426)
|
-- TOC entry 1911 (class 1259 OID 31426)
|
||||||
-- Name: fki_files_sets; Type: INDEX; Schema: public; Owner: @USERNAME@; Tablespace:
|
-- Name: fki_files_sets; Type: INDEX; Schema: public; Owner: @USERNAME@; Tablespace:
|
||||||
--
|
--
|
||||||
|
|
||||||
|
@ -188,7 +205,7 @@ CREATE INDEX fki_files_sets ON files USING btree (group_id);
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- TOC entry 1910 (class 1259 OID 31292)
|
-- TOC entry 1912 (class 1259 OID 31292)
|
||||||
-- Name: idx_paths; Type: INDEX; Schema: public; Owner: @USERNAME@; Tablespace:
|
-- Name: idx_paths; Type: INDEX; Schema: public; Owner: @USERNAME@; Tablespace:
|
||||||
--
|
--
|
||||||
|
|
||||||
|
@ -196,7 +213,7 @@ CREATE INDEX idx_paths ON files USING btree (path);
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- TOC entry 1918 (class 2620 OID 31291)
|
-- TOC entry 1920 (class 2620 OID 31291)
|
||||||
-- Name: triggerupcasehash; Type: TRIGGER; Schema: public; Owner: @USERNAME@
|
-- Name: triggerupcasehash; Type: TRIGGER; Schema: public; Owner: @USERNAME@
|
||||||
--
|
--
|
||||||
|
|
||||||
|
@ -204,7 +221,7 @@ CREATE TRIGGER triggerupcasehash BEFORE INSERT OR UPDATE ON files FOR EACH ROW E
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- TOC entry 1917 (class 2606 OID 31421)
|
-- TOC entry 1919 (class 2606 OID 31421)
|
||||||
-- Name: fk_files_sets; Type: FK CONSTRAINT; Schema: public; Owner: @USERNAME@
|
-- Name: fk_files_sets; Type: FK CONSTRAINT; Schema: public; Owner: @USERNAME@
|
||||||
--
|
--
|
||||||
|
|
||||||
|
@ -213,7 +230,7 @@ ALTER TABLE ONLY files
|
||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- TOC entry 2034 (class 0 OID 0)
|
-- TOC entry 2036 (class 0 OID 0)
|
||||||
-- Dependencies: 8
|
-- Dependencies: 8
|
||||||
-- Name: public; Type: ACL; Schema: -; Owner: postgres
|
-- Name: public; Type: ACL; Schema: -; Owner: postgres
|
||||||
--
|
--
|
||||||
|
@ -224,7 +241,7 @@ GRANT ALL ON SCHEMA public TO postgres;
|
||||||
GRANT ALL ON SCHEMA public TO PUBLIC;
|
GRANT ALL ON SCHEMA public TO PUBLIC;
|
||||||
|
|
||||||
|
|
||||||
-- Completed on 2015-11-11 13:27:00 GMT
|
-- Completed on 2015-11-11 20:03:45 GMT
|
||||||
|
|
||||||
--
|
--
|
||||||
-- PostgreSQL database dump complete
|
-- PostgreSQL database dump complete
|
||||||
|
|
|
@ -19,14 +19,30 @@
|
||||||
#include "dindexerConfig.h"
|
#include "dindexerConfig.h"
|
||||||
#include <boost/program_options.hpp>
|
#include <boost/program_options.hpp>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
#define STRINGIZE_IMPL(s) #s
|
#define STRINGIZE_IMPL(s) #s
|
||||||
#define STRINGIZE(s) STRINGIZE_IMPL(s)
|
#define STRINGIZE(s) STRINGIZE_IMPL(s)
|
||||||
|
|
||||||
|
#if defined(lengthof)
|
||||||
|
# undef lengthof
|
||||||
|
#endif
|
||||||
|
//http://stackoverflow.com/questions/4415524/common-array-length-macro-for-c#4415646
|
||||||
|
#define lengthof(x) ((sizeof(x)/sizeof(0[x])) / ((std::size_t)(!(sizeof(x) % sizeof(0[x])))))
|
||||||
|
|
||||||
namespace po = boost::program_options;
|
namespace po = boost::program_options;
|
||||||
|
|
||||||
namespace din {
|
namespace din {
|
||||||
namespace {
|
namespace {
|
||||||
|
const char g_allowed_types[] = {
|
||||||
|
'D', //Directory
|
||||||
|
'V', //DVD
|
||||||
|
'B', //BluRay
|
||||||
|
'F', //Floppy Disk
|
||||||
|
'H', //Hard Disk
|
||||||
|
'Z', //Iomega Zip
|
||||||
|
'O' //Other
|
||||||
|
};
|
||||||
const char* const g_version_string =
|
const char* const g_version_string =
|
||||||
PROGRAM_NAME " v"
|
PROGRAM_NAME " v"
|
||||||
STRINGIZE(VERSION_MAJOR) "."
|
STRINGIZE(VERSION_MAJOR) "."
|
||||||
|
@ -48,6 +64,7 @@ namespace din {
|
||||||
po::options_description set_options("Set options");
|
po::options_description set_options("Set options");
|
||||||
set_options.add_options()
|
set_options.add_options()
|
||||||
("setname,n", po::value<std::string>()->default_value("New set"), "Name to be given to the new set being scanned.")
|
("setname,n", po::value<std::string>()->default_value("New set"), "Name to be given to the new set being scanned.")
|
||||||
|
("type,t", po::value<char>()->default_value('V'), "Default set type. Valid values are B, D, F, H, O, V, Z.")
|
||||||
;
|
;
|
||||||
po::options_description positional_options("Positional options");
|
po::options_description positional_options("Positional options");
|
||||||
positional_options.add_options()
|
positional_options.add_options()
|
||||||
|
@ -92,6 +109,9 @@ namespace din {
|
||||||
if (parVarMap.count("search-path") == 0) {
|
if (parVarMap.count("search-path") == 0) {
|
||||||
throw std::invalid_argument("No search path specified");
|
throw std::invalid_argument("No search path specified");
|
||||||
}
|
}
|
||||||
|
if (g_allowed_types + lengthof(g_allowed_types) == std::find(g_allowed_types, g_allowed_types + lengthof(g_allowed_types), parVarMap["type"].as<char>())) {
|
||||||
|
throw std::invalid_argument("Invalid value for parameter \"type\"");
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} //namespace din
|
} //namespace din
|
||||||
|
|
|
@ -26,16 +26,17 @@ namespace din {
|
||||||
namespace {
|
namespace {
|
||||||
const std::size_t g_batch_size = 100;
|
const std::size_t g_batch_size = 100;
|
||||||
|
|
||||||
std::string make_set_insert_query (pq::Connection& parConn, const std::string& parSetName) {
|
std::string make_set_insert_query (pq::Connection& parConn, const SetRecordData& parSetData) {
|
||||||
std::ostringstream oss;
|
std::ostringstream oss;
|
||||||
oss << "INSERT INTO \"sets\" (\"desc\") VALUES ("
|
oss << "INSERT INTO \"sets\" (\"desc\",\"type\") VALUES ("
|
||||||
<< parConn.escaped_literal(parSetName)
|
<< parConn.escaped_literal(parSetData.name) << ','
|
||||||
|
<< '\'' << parSetData.type << '\''
|
||||||
<< ");";
|
<< ");";
|
||||||
return oss.str();
|
return oss.str();
|
||||||
}
|
}
|
||||||
} //unnamed namespace
|
} //unnamed namespace
|
||||||
|
|
||||||
void write_to_db (const DinDBSettings& parDB, const std::vector<FileRecordData>& parData, const std::string& parSetName) {
|
void write_to_db (const DinDBSettings& parDB, const std::vector<FileRecordData>& parData, const SetRecordData& parSetData) {
|
||||||
if (parData.empty()) {
|
if (parData.empty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -44,7 +45,7 @@ namespace din {
|
||||||
conn.connect();
|
conn.connect();
|
||||||
|
|
||||||
conn.query_void("BEGIN;");
|
conn.query_void("BEGIN;");
|
||||||
conn.query_void(make_set_insert_query(conn, parSetName));
|
conn.query_void(make_set_insert_query(conn, parSetData));
|
||||||
//TODO: use COPY instead of INSERT INTO
|
//TODO: use COPY instead of INSERT INTO
|
||||||
for (std::size_t z = 0; z < parData.size(); z += g_batch_size) {
|
for (std::size_t z = 0; z < parData.size(); z += g_batch_size) {
|
||||||
std::ostringstream query;
|
std::ostringstream query;
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
#include <boost/utility/string_ref.hpp>
|
||||||
|
|
||||||
namespace din {
|
namespace din {
|
||||||
struct DinDBSettings;
|
struct DinDBSettings;
|
||||||
|
@ -34,7 +35,12 @@ namespace din {
|
||||||
const bool is_symlink;
|
const bool is_symlink;
|
||||||
};
|
};
|
||||||
|
|
||||||
void write_to_db ( const DinDBSettings& parDB, const std::vector<FileRecordData>& parData, const std::string& parSetName );
|
struct SetRecordData {
|
||||||
|
const boost::string_ref name;
|
||||||
|
const char type;
|
||||||
|
};
|
||||||
|
|
||||||
|
void write_to_db ( const DinDBSettings& parDB, const std::vector<FileRecordData>& parData, const SetRecordData& parSetData );
|
||||||
} //namespace din
|
} //namespace din
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -235,7 +235,8 @@ namespace din {
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void Indexer::add_to_db (const std::string& parSetName) const {
|
void Indexer::add_to_db (const std::string& parSetName, char parType) const {
|
||||||
|
assert(m_local_data->done_count == m_local_data->paths.size());
|
||||||
PathName base_path(m_local_data->paths.front().path);
|
PathName base_path(m_local_data->paths.front().path);
|
||||||
std::vector<FileRecordData> data;
|
std::vector<FileRecordData> data;
|
||||||
data.reserve(m_local_data->paths.size());
|
data.reserve(m_local_data->paths.size());
|
||||||
|
@ -249,7 +250,9 @@ namespace din {
|
||||||
itm.is_symlink
|
itm.is_symlink
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
write_to_db(m_local_data->db_settings, data, parSetName);
|
|
||||||
|
SetRecordData set_data {parSetName, parType};
|
||||||
|
write_to_db(m_local_data->db_settings, data, set_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Indexer::add_path (const char* parPath, int parLevel, bool parIsDir, bool parIsSymLink) {
|
bool Indexer::add_path (const char* parPath, int parLevel, bool parIsDir, bool parIsSymLink) {
|
||||||
|
|
|
@ -38,7 +38,7 @@ namespace din {
|
||||||
std::size_t total_items ( void ) const;
|
std::size_t total_items ( void ) const;
|
||||||
std::size_t processed_items ( void ) const;
|
std::size_t processed_items ( void ) const;
|
||||||
void calculate_hash ( void );
|
void calculate_hash ( void );
|
||||||
void add_to_db ( const std::string& parSetName ) const;
|
void add_to_db ( const std::string& parSetName, char parType ) const;
|
||||||
bool empty ( void ) const;
|
bool empty ( void ) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -63,7 +63,7 @@ int main (int parArgc, char* parArgv[]) {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
indexer.calculate_hash();
|
indexer.calculate_hash();
|
||||||
indexer.add_to_db(vm["setname"].as<std::string>());
|
indexer.add_to_db(vm["setname"].as<std::string>(), vm["type"].as<char>());
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -125,9 +125,13 @@ namespace pq {
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string Connection::escaped_literal (const std::string& parString) {
|
std::string Connection::escaped_literal (const std::string& parString) {
|
||||||
|
return this->escaped_literal(boost::string_ref(parString));
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string Connection::escaped_literal (boost::string_ref parString) {
|
||||||
typedef std::unique_ptr<char[], void(*)(void*)> PQArrayType;
|
typedef std::unique_ptr<char[], void(*)(void*)> PQArrayType;
|
||||||
|
|
||||||
PQArrayType clean_str(PQescapeLiteral(m_localData->connection, parString.c_str(), parString.size()), &PQfreemem);
|
PQArrayType clean_str(PQescapeLiteral(m_localData->connection, parString.data(), parString.size()), &PQfreemem);
|
||||||
return std::string(clean_str.get());
|
return std::string(clean_str.get());
|
||||||
}
|
}
|
||||||
} //namespace pq
|
} //namespace pq
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <boost/utility/string_ref.hpp>
|
||||||
|
|
||||||
namespace pq {
|
namespace pq {
|
||||||
class Connection {
|
class Connection {
|
||||||
|
@ -37,6 +38,7 @@ namespace pq {
|
||||||
ResultSet query ( const std::string& parQuery );
|
ResultSet query ( const std::string& parQuery );
|
||||||
|
|
||||||
std::string escaped_literal ( const std::string& parString );
|
std::string escaped_literal ( const std::string& parString );
|
||||||
|
std::string escaped_literal ( boost::string_ref parString );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct LocalData;
|
struct LocalData;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue