This is an automated email from the git hooks/post-receive script. hmmr-guest pushed a commit to branch master in repository aghermann.
commit 2360ab787f91a89516a0068aed2966379d4a9de1 Author: Andrei Zavada <[email protected]> Date: Fri Sep 13 02:06:40 2013 +0300 new class CSstorablePPack (part 2/3) --- upstream/src/aghermann/expdesign/dirlevel.cc | 98 +++++++++++++++++++++- upstream/src/aghermann/expdesign/dirlevel.hh | 35 +++++++- upstream/src/aghermann/expdesign/expdesign.cc | 44 +++++++++- upstream/src/aghermann/expdesign/expdesign.hh | 29 ++++--- upstream/src/aghermann/expdesign/loadsave.cc | 2 - upstream/src/aghermann/expdesign/tree-scanner.cc | 22 +---- upstream/src/aghermann/patterns/patterns.hh | 28 +------ upstream/src/aghermann/rk1968/rk1968-profiles.cc | 66 +++------------ upstream/src/aghermann/rk1968/rk1968.cc | 9 +- upstream/src/aghermann/rk1968/rk1968.hh | 9 +- upstream/src/common/subject_id.hh | 10 +-- upstream/src/libsigfile/typed-source.cc | 22 +++++ upstream/src/libsigfile/typed-source.hh | 3 + 13 files changed, 239 insertions(+), 138 deletions(-) diff --git a/upstream/src/aghermann/expdesign/dirlevel.cc b/upstream/src/aghermann/expdesign/dirlevel.cc index 0e49339..ffee6fd 100644 --- a/upstream/src/aghermann/expdesign/dirlevel.cc +++ b/upstream/src/aghermann/expdesign/dirlevel.cc @@ -10,9 +10,12 @@ */ -#include <stdarg.h> +#include <errno.h> #include <string> +#include "common/string.hh" +#include "common/fs.hh" +#include "expdesign.hh" #include "dirlevel.hh" using namespace std; @@ -24,7 +27,9 @@ exp_dir_level_s( TExpDirLevel x) { switch (x) { case TExpDirLevel::transient: return "~"; - case TExpDirLevel::subject: return "[S]"; + case TExpDirLevel::session: return "[D]"; + case TExpDirLevel::subject: return "[J]"; + case TExpDirLevel::group: return "[G]"; case TExpDirLevel::experiment: return "[E]"; case TExpDirLevel::user: return "[U]"; case TExpDirLevel::system: return "<S>"; @@ -33,6 +38,95 @@ exp_dir_level_s( TExpDirLevel x) } + + +string +CStorablePPack:: +path() const +{ + string append = string("/") + subdir + "/" + name; + switch (level) { + case TExpDirLevel::transient: + return move(string("/tmp") + append); + + case TExpDirLevel::session: + case TExpDirLevel::subject: + case TExpDirLevel::group: + case TExpDirLevel::experiment: + return move(ED.make_dirname( level, level_id) + append); + + case TExpDirLevel::user: + return move(str::sasprintf( "%s/.local/share/aghermann%s", getenv("HOME"), append.c_str())); + + case TExpDirLevel::system: + return move(str::sasprintf( "%s/%s", PACKAGE_DATADIR, append.c_str())); + } + + throw invalid_argument ("bad TExpDirLevel"); +} + +int +CStorablePPack:: +load() +{ + libconfig::Config conf; + + try { + conf.readFile( path().c_str()); + + using namespace confval; + get( config_keys_d, conf); + get( config_keys_z, conf); + get( config_keys_g, conf); + get( config_keys_b, conf); + get( config_keys_s, conf); + + saved = true; + + return 0; + + } catch (...) { + return -1; + } +} + + +int +CStorablePPack:: +save() +{ + if ( saved || level == TExpDirLevel::transient || level == TExpDirLevel::system ) + return 0; + + string p = path(); + if ( fs::mkdir_with_parents( fs::dirname(p)) ) { + fprintf( stderr, "CStorablePPack::save(\"%s\"): mkdir failed: %s\n", p.c_str(), strerror(errno)); + return -1; + } + + try { + libconfig::Config conf; + + using namespace confval; + put( config_keys_d, conf); + put( config_keys_g, conf); + put( config_keys_b, conf); + put( config_keys_s, conf); + put( config_keys_z, conf); + + conf.writeFile( p.c_str()); + + saved = true; + + return 0; + + } catch (...) { + return -1; + } +} + + + // Local Variables: // Mode: c++ // indent-tabs-mode: nil diff --git a/upstream/src/aghermann/expdesign/dirlevel.hh b/upstream/src/aghermann/expdesign/dirlevel.hh index 33ceb19..7458255 100644 --- a/upstream/src/aghermann/expdesign/dirlevel.hh +++ b/upstream/src/aghermann/expdesign/dirlevel.hh @@ -19,6 +19,7 @@ #include <forward_list> #include "common/config-validate.hh" +#include "forward-decls.hh" #if HAVE_CONFIG_H && !defined(VERSION) # include "config.h" @@ -31,25 +32,51 @@ using namespace std; enum class TExpDirLevel { transient, + session, subject, + group, experiment, user, system, }; +struct SExpDirLevelId { + string g, j, d; +}; + const char* exp_dir_level_s( agh::TExpDirLevel); class CStorablePPack { public: - TExpDirLevel level; + CStorablePPack (const string& subdir_, const string& name_, TExpDirLevel level_, + CExpDesign& ED_, const SExpDirLevelId& level_id_) + : subdir (subdir_), + name (name_), + level (level_), + level_id (level_id_), + ED (ED_), + saved (false) + {} + string subdir, - path; + name; + TExpDirLevel + level; + + SExpDirLevelId + level_id; + CExpDesign& + ED; bool saved; - virtual int load() = 0; - virtual int save() = 0; + string path() const; + + virtual int load(); + virtual int save(); + void touch() + { saved = false; } forward_list<confval::SValidator<double>> config_keys_g; forward_list<confval::SValidator<int>> config_keys_d; diff --git a/upstream/src/aghermann/expdesign/expdesign.cc b/upstream/src/aghermann/expdesign/expdesign.cc index fd57bc1..0ef1d7f 100644 --- a/upstream/src/aghermann/expdesign/expdesign.cc +++ b/upstream/src/aghermann/expdesign/expdesign.cc @@ -23,8 +23,7 @@ using namespace std; - -using agh::confval::SValidator; +using namespace agh; const char @@ -42,6 +41,7 @@ double }; +using agh::confval::SValidator; agh::CExpDesign:: CExpDesign (const string& session_dir_, @@ -199,6 +199,46 @@ for_all_subjects( const TSubjectOpFun& F, const TSubjectReportFun& report, const } + +string +CExpDesign:: +make_dirname( TExpDirLevel level, const SExpDirLevelId& level_id) const +{ + switch (level) { + case TExpDirLevel::session: + { + TJGroups::const_iterator Gi; + const CSubject& J = subject_by_x(level_id.j, &Gi); + if ( level_id.g != Gi->first || !J.have_session(level_id.d) ) + throw invalid_argument ("bad group/subject/session"); + return str::sasprintf( "%s/%s/%s/%s", _session_dir.c_str(), Gi->first.c_str(), J.id.c_str(), level_id.d.c_str()); + } + + case TExpDirLevel::subject: + { + TJGroups::const_iterator Gi; + const CSubject& J = subject_by_x(level_id.j, &Gi); + if ( level_id.g != Gi->first ) + throw invalid_argument ("bad group/subject"); + return str::sasprintf( "%s/%s/%s", _session_dir.c_str(), Gi->first.c_str(), J.id.c_str()); + } + + case TExpDirLevel::group: + if ( not have_group( level_id.g) ) + throw invalid_argument ("bad group"); + return str::sasprintf( "%s/%s", _session_dir.c_str(), level_id.g.c_str()); + + case TExpDirLevel::experiment: + return make_dirname(); + + default: + throw invalid_argument ("level not appropriate"); + } +} + + + + void agh::CExpDesign:: for_all_episodes( const TEpisodeOpFun& F, const TEpisodeReportFun& report, const TEpisodeFilterFun& filter) diff --git a/upstream/src/aghermann/expdesign/expdesign.hh b/upstream/src/aghermann/expdesign/expdesign.hh index b32054c..0e2d50d 100644 --- a/upstream/src/aghermann/expdesign/expdesign.hh +++ b/upstream/src/aghermann/expdesign/expdesign.hh @@ -28,6 +28,7 @@ #include "forward-decls.hh" #include "subject.hh" +#include "dirlevel.hh" #if HAVE_CONFIG_H && !defined(VERSION) # include "config.h" @@ -77,7 +78,7 @@ class CExpDesign { string name() const // dirname - { return _session_dir.substr( _session_dir.rfind( '/')); } + { return move(_session_dir.substr( _session_dir.rfind( '/'))); } // error log enum class TLogEntryStyle { plain, bold, italic }; @@ -111,17 +112,12 @@ class CExpDesign { // add subject to group; if he exists in another group, remove him therefrom first; // if he is already there, update his record - int add_subject( const char *name, CSubject::TGender gender, int age, + int add_subject( const char *name, CSubject::TGender, int age, const char *group, const char *comment = ""); template <class T> - string subject_dir( const T& j) const - { - map<string, CJGroup>::const_iterator G; - const CSubject& J = subject_by_x(j, &G); - return _session_dir + '/' + G->first + '/' + J.SSubjectId::id; - } + string subject_dir( const T& j) const; // scan tree: build all structures static TMsmtCollectProgressIndicatorFun progress_fun_stdout; @@ -130,10 +126,9 @@ class CExpDesign { void compute_profiles(); public: - // edf sources + // sources int register_intree_source( sigfile::CTypedSource&&, const char **reason_if_failed_p = nullptr); - static bool is_supported_source( sigfile::CTypedSource&); // model runs int setup_modrun( const string& j, const string& d, const string& h, @@ -208,6 +203,11 @@ class CExpDesign { void for_all_modruns( const TModelRunOpFun&, const TModelRunReportFun&, const TModelRunFilterFun&); + // dir-level access + string make_dirname() const + { return _session_dir; } + string make_dirname( TExpDirLevel, const SExpDirLevelId&) const; + // inventory size_t num_threads; metrics::psd::SPPack @@ -256,6 +256,7 @@ class CExpDesign { _error_log; sid_t _id_pool; + // load/save forward_list<confval::SValidator<double>> config_keys_g; forward_list<confval::SValidator<int>> config_keys_d; @@ -273,6 +274,14 @@ bool CExpDesign::have_group( const T& g) const } template <class T> +string CExpDesign::subject_dir( const T& j) const +{ + map<string, CJGroup>::const_iterator G; + const CSubject& J = subject_by_x(j, &G); + return _session_dir + '/' + G->first + '/' + J.SSubjectId::id; +} + +template <class T> CSubject& CExpDesign::subject_by_x( const T& jid) { for ( auto &G : groups ) { diff --git a/upstream/src/aghermann/expdesign/loadsave.cc b/upstream/src/aghermann/expdesign/loadsave.cc index 3c942ab..df184d5 100644 --- a/upstream/src/aghermann/expdesign/loadsave.cc +++ b/upstream/src/aghermann/expdesign/loadsave.cc @@ -26,8 +26,6 @@ load_settings() { libconfig::Config conf; - // Load the XML file into the property tree. If reading fails - // (cannot open file, parse error), an exception is thrown. try { conf.readFile( EXPD_FILENAME); diff --git a/upstream/src/aghermann/expdesign/tree-scanner.cc b/upstream/src/aghermann/expdesign/tree-scanner.cc index c4b2a38..d0f3511 100644 --- a/upstream/src/aghermann/expdesign/tree-scanner.cc +++ b/upstream/src/aghermann/expdesign/tree-scanner.cc @@ -251,26 +251,6 @@ register_intree_source( sigfile::CTypedSource&& F, -bool -CExpDesign:: -is_supported_source( sigfile::CTypedSource& F) -{ - using namespace sigfile; - union { - CEDFFile::TSubtype e; - CTSVFile::TSubtype t; - } u; - return (F.type() == CTypedSource::TType::edf && - (u.e = F.obj<CEDFFile>().subtype(), - (u.e == CEDFFile::TSubtype::edf || - u.e == CEDFFile::TSubtype::edfplus_c))) - || - (F.type() == CTypedSource::TType::ascii && - (u.t = F.obj<CTSVFile>().subtype(), - (u.t == CTSVFile::TSubtype::csv || - u.t == CTSVFile::TSubtype::tsv))); -} - namespace { size_t current_sigfile_source; @@ -300,7 +280,7 @@ supported_sigfile_processor( const char *fname, const struct stat*, int flag, st only_expdesign->log_message( "%s", st.c_str()); } - if ( CExpDesign::is_supported_source(F) ) + if ( sigfile::is_supported_source(F) ) only_expdesign -> register_intree_source( move(F)); else only_expdesign -> log_message( "File %s: unsupported format", fname); diff --git a/upstream/src/aghermann/patterns/patterns.hh b/upstream/src/aghermann/patterns/patterns.hh index 6615e48..9085c0d 100644 --- a/upstream/src/aghermann/patterns/patterns.hh +++ b/upstream/src/aghermann/patterns/patterns.hh @@ -298,33 +298,7 @@ struct SPattern { template <typename T> list<SPattern<T>> -load_patterns_from_location( const string&, TExpDirLevel); - - -inline string -make_system_location() -{ - return PACKAGE_DATADIR "/patterns"; -} - -inline string -make_user_location() -{ - return move(agh::str::sasprintf( "%s/.local/share/aghermann/patterns", getenv("HOME"))); -} - -inline string -make_experiment_location( const agh::CExpDesign& ED) -{ - return move(agh::str::sasprintf( "%s/.patterns", ED.session_dir())); -} - -inline string -make_subject_location( const agh::CExpDesign& ED, const agh::CSubject& J) -{ - return move(agh::str::sasprintf( "%s/.patterns", ED.subject_dir( J).c_str())); -} - +load_patterns_from_location( agh::TExpDirLevel level, agh::CExpDesign& ED, const agh::SExpDirLevelId& level_id); #include "patterns.ii" diff --git a/upstream/src/aghermann/rk1968/rk1968-profiles.cc b/upstream/src/aghermann/rk1968/rk1968-profiles.cc index ead52b9..58d3b5d 100644 --- a/upstream/src/aghermann/rk1968/rk1968-profiles.cc +++ b/upstream/src/aghermann/rk1968/rk1968-profiles.cc @@ -14,6 +14,7 @@ #include <sys/stat.h> #include "common/fs.hh" +#include "common/config-validate.hh" #include "aghermann/expdesign/subject.hh" #include "aghermann/expdesign/expdesign.hh" @@ -24,63 +25,13 @@ using namespace std; using namespace agh::rk1968; -string -make_system_profiles_location() -{ - return PACKAGE_DATADIR "/rk1968_profiles"; -} - -string -make_user_profiles_location() -{ - return agh::str::sasprintf( "%s/.local/share/aghermann/rk1968_profiles", getenv("HOME")); -} - -string -make_experiment_profiles_location( const agh::CExpDesign& ED) -{ - return agh::str::sasprintf( "%s/.rk1968_profiles", ED.session_dir()); -} - -string -make_subject_profiles_location( const agh::CExpDesign& ED, const agh::CSubject& J) -{ - return agh::str::sasprintf( "%s/.rk1968_profiles", ED.subject_dir( J).c_str()); -} - int CScoreAssistant:: -load() -{ - - return 0; -} - - -int -CScoreAssistant:: -save() -{ - if ( saved || origin == agh::TExpDirLevel::transient || origin == agh::TExpDirLevel::system ) - return 0; - - if ( agh::fs::mkdir_with_parents( agh::fs::dirname(path)) ) { - fprintf( stderr, "save_profile(\"%s\"): mkdir failed\n", path.c_str()); - return -1; - } - - - saved = true; - return 0; -} - -int -CScoreAssistant:: delete_file() { - return unlink( path.c_str()); + return unlink( path().c_str()); } @@ -94,19 +45,24 @@ scandir_filter( const struct dirent *e) } list<CScoreAssistant> -load_profiles_from_location( const string& loc, agh::TExpDirLevel origin) +load_profiles_from_location( agh::TExpDirLevel level, agh::CExpDesign& ED, const agh::SExpDirLevelId& level_id) { list<CScoreAssistant> ret; + string location = ED.make_dirname( level, level_id); + struct dirent **eps; - int total = scandir( loc.c_str(), &eps, scandir_filter, alphasort); + int total = scandir( location.c_str(), &eps, scandir_filter, alphasort); if ( total != -1 ) { for ( int i = 0; i < total; ++i ) { try { - ret.emplace_back( loc + '/' + eps[i]->d_name); - ret.back().origin = origin; + ret.emplace_back( + SScoreAssistantPPack(), + eps[i]->d_name, + level, ED, level_id); + ret.back().load(); } catch (invalid_argument& ex) { ; } diff --git a/upstream/src/aghermann/rk1968/rk1968.cc b/upstream/src/aghermann/rk1968/rk1968.cc index 0604cf3..ddaa69a 100644 --- a/upstream/src/aghermann/rk1968/rk1968.cc +++ b/upstream/src/aghermann/rk1968/rk1968.cc @@ -27,14 +27,15 @@ using namespace agh::rk1968; CScoreAssistant:: -CScoreAssistant (const string& fname) - : CStorablePPack () +CScoreAssistant (const SScoreAssistantPPack& Pp_, + const string& name_, + agh::TExpDirLevel level_, agh::CExpDesign& ED_, const agh::SExpDirLevelId& level_id_) + : CStorablePPack (".rk1968", name_, level_, ED_, level_id_), + Pp (Pp_) { - } - int CScoreAssistant:: score( agh::SEpisode& E) diff --git a/upstream/src/aghermann/rk1968/rk1968.hh b/upstream/src/aghermann/rk1968/rk1968.hh index a0a0daa..7fa52e6 100644 --- a/upstream/src/aghermann/rk1968/rk1968.hh +++ b/upstream/src/aghermann/rk1968/rk1968.hh @@ -13,7 +13,6 @@ #define AGH_AGHERMANN_RK1968_H_ #include <string> -#include <list> #include "aghermann/expdesign/dirlevel.hh" using namespace std; @@ -34,16 +33,14 @@ class CScoreAssistant : public CStorablePPack { public: - CScoreAssistant (const string& fname); + CScoreAssistant (const SScoreAssistantPPack&, + const string& name_, + TExpDirLevel, CExpDesign&, const SExpDirLevelId&); int score( agh::SEpisode&); - int save(); - int load(); int delete_file(); - string name; - SScoreAssistantPPack Pp; }; diff --git a/upstream/src/common/subject_id.hh b/upstream/src/common/subject_id.hh index 2f77b4e..1bd1dd4 100644 --- a/upstream/src/common/subject_id.hh +++ b/upstream/src/common/subject_id.hh @@ -9,8 +9,8 @@ * License: GPL */ -#ifndef _AGH_SUBJECT_ID -#define _AGH_SUBJECT_ID +#ifndef AGH_COMMON_SUBJECT_ID_H_ +#define AGH_COMMON_SUBJECT_ID_H_ #include <ctime> @@ -28,13 +28,13 @@ namespace agh { // follow http://www.edfplus.info/specs/edfplus.html#datarecords, section 2.1.3.3 struct SSubjectId { - string id, + string id, name; - time_t dob; + time_t dob; enum class TGender : char { unknown = 'X', male = 'M', female = 'F' }; - TGender gender; + TGender gender; SSubjectId (const string& id_ = "", const string& name_ = "", time_t dob_ = (time_t)0, diff --git a/upstream/src/libsigfile/typed-source.cc b/upstream/src/libsigfile/typed-source.cc index a178b1e..964919f 100644 --- a/upstream/src/libsigfile/typed-source.cc +++ b/upstream/src/libsigfile/typed-source.cc @@ -23,6 +23,28 @@ using sigfile::CEDFFile; +bool +sigfile:: +is_supported_source( CTypedSource& F) +{ + using namespace sigfile; + union { + CEDFFile::TSubtype e; + CTSVFile::TSubtype t; + } u; + return (F.type() == CTypedSource::TType::edf && + (u.e = F.obj<CEDFFile>().subtype(), + (u.e == CEDFFile::TSubtype::edf || + u.e == CEDFFile::TSubtype::edfplus_c))) + || + (F.type() == CTypedSource::TType::ascii && + (u.t = F.obj<CTSVFile>().subtype(), + (u.t == CTSVFile::TSubtype::csv || + u.t == CTSVFile::TSubtype::tsv))); +} + + + CTypedSource:: CTypedSource (const string& fname, const size_t pagesize, diff --git a/upstream/src/libsigfile/typed-source.hh b/upstream/src/libsigfile/typed-source.hh index a62e6e3..3e81f6e 100644 --- a/upstream/src/libsigfile/typed-source.hh +++ b/upstream/src/libsigfile/typed-source.hh @@ -96,6 +96,9 @@ struct SNamedChannel { +bool is_supported_source( sigfile::CTypedSource&); + + } // namespace sigfile #endif -- Alioth's /git/debian-med/git-commit-notice on /srv/git.debian.org/git/debian-med/aghermann.git _______________________________________________ debian-med-commit mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/debian-med-commit
