mirror of
https://github.com/GothenburgBitFactory/timewarrior.git
synced 2025-07-07 20:06:39 +02:00
Connect database and tag-info database
This commit is contained in:
parent
b32237cfb8
commit
a7da0438ca
2 changed files with 49 additions and 3 deletions
|
@ -1,6 +1,6 @@
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// Copyright 2015 - 2016, Paul Beckingham, Federico Hernandez.
|
// Copyright 2015 - 2018, Thomas Lauf, Paul Beckingham, Federico Hernandez.
|
||||||
//
|
//
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
// of this software and associated documentation files (the "Software"), to deal
|
// of this software and associated documentation files (the "Software"), to deal
|
||||||
|
@ -29,11 +29,15 @@
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
#include <TransactionsFactory.h>
|
#include <TransactionsFactory.h>
|
||||||
|
#include <JSON.h>
|
||||||
|
#include <iostream>
|
||||||
|
#include <timew.h>
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
void Database::initialize (const std::string& location)
|
void Database::initialize (const std::string& location)
|
||||||
{
|
{
|
||||||
_location = location;
|
_location = location;
|
||||||
|
initializeTagDatabase ();
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -41,6 +45,8 @@ void Database::commit ()
|
||||||
{
|
{
|
||||||
for (auto& file : _files)
|
for (auto& file : _files)
|
||||||
file.commit ();
|
file.commit ();
|
||||||
|
|
||||||
|
File::write (_location + "/tags.data", _tagInfoDatabase.toJson ());
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -92,6 +98,16 @@ std::vector <std::string> Database::allLines ()
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
void Database::addInterval (const Interval& interval)
|
void Database::addInterval (const Interval& interval)
|
||||||
{
|
{
|
||||||
|
auto tags = interval.tags ();
|
||||||
|
|
||||||
|
for (auto& tag : tags)
|
||||||
|
{
|
||||||
|
if (_tagInfoDatabase.incrementTag (tag) == -1)
|
||||||
|
{
|
||||||
|
std::cout << "Note: '" << quoteIfNeeded (tag) << "' is a new tag." << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (interval.range.is_open ())
|
if (interval.range.is_open ())
|
||||||
{
|
{
|
||||||
// Get the index into _files for the appropriate Datafile, which may be
|
// Get the index into _files for the appropriate Datafile, which may be
|
||||||
|
@ -125,6 +141,13 @@ void Database::addInterval (const Interval& interval)
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
void Database::deleteInterval (const Interval& interval)
|
void Database::deleteInterval (const Interval& interval)
|
||||||
{
|
{
|
||||||
|
auto tags = interval.tags ();
|
||||||
|
|
||||||
|
for (auto& tag : tags)
|
||||||
|
{
|
||||||
|
_tagInfoDatabase.decrementTag (tag);
|
||||||
|
}
|
||||||
|
|
||||||
auto intervalRange = interval.range;
|
auto intervalRange = interval.range;
|
||||||
for (auto& segment : segmentRange (intervalRange))
|
for (auto& segment : segmentRange (intervalRange))
|
||||||
{
|
{
|
||||||
|
@ -357,6 +380,28 @@ std::vector <Range> Database::segmentRange (const Range& range)
|
||||||
return segments;
|
return segments;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
void Database::initializeTagDatabase ()
|
||||||
|
{
|
||||||
|
std::string content;
|
||||||
|
|
||||||
|
if (!File::read (_location + "/tags.data", content))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto* json = (json::object*) json::parse (content);
|
||||||
|
|
||||||
|
for (auto& pair : json->_data)
|
||||||
|
{
|
||||||
|
auto key = pair.first;
|
||||||
|
auto* value = (json::object*) pair.second;
|
||||||
|
auto* number = (json::number*) value->_data["count"];
|
||||||
|
|
||||||
|
_tagInfoDatabase.add (key, TagInfo {(unsigned int) number->_dvalue});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
void Database::initializeDatafiles ()
|
void Database::initializeDatafiles ()
|
||||||
{
|
{
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
#include <Transaction.h>
|
#include <Transaction.h>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <TagInfoDatabase.h>
|
||||||
|
|
||||||
class Database
|
class Database
|
||||||
{
|
{
|
||||||
|
@ -62,14 +63,14 @@ private:
|
||||||
unsigned int getDatafile (int, int);
|
unsigned int getDatafile (int, int);
|
||||||
std::vector <Range> segmentRange (const Range&);
|
std::vector <Range> segmentRange (const Range&);
|
||||||
void initializeDatafiles ();
|
void initializeDatafiles ();
|
||||||
|
void initializeTagDatabase ();
|
||||||
|
|
||||||
void recordUndoAction (const std::string &, const std::string &, const std::string &);
|
void recordUndoAction (const std::string &, const std::string &, const std::string &);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::string _location {"~/.timewarrior/data"};
|
std::string _location {"~/.timewarrior/data"};
|
||||||
std::vector <Datafile> _files {};
|
std::vector <Datafile> _files {};
|
||||||
int _txn {0};
|
TagInfoDatabase _tagInfoDatabase {};
|
||||||
|
|
||||||
std::shared_ptr <Transaction> _currentTransaction = nullptr;
|
std::shared_ptr <Transaction> _currentTransaction = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue