more code
This commit is contained in:
parent
177e8d018f
commit
d091272cea
@ -48,6 +48,12 @@ gchar const *ed_journal_entry_get_string(EDJournalEntry *self,
|
|||||||
|
|
||||||
gchar const *ed_journal_entry_get_event(EDJournalEntry *self);
|
gchar const *ed_journal_entry_get_event(EDJournalEntry *self);
|
||||||
|
|
||||||
|
GDateTime *ed_journal_entry_get_timestamp(EDJournalEntry *self);
|
||||||
|
|
||||||
|
gboolean ed_journal_entry_is_in_range(EDJournalEntry *self,
|
||||||
|
GDateTime *start,
|
||||||
|
GDateTime *end);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if the journal entry is of the given event.
|
* Returns true if the journal entry is of the given event.
|
||||||
*/
|
*/
|
||||||
|
@ -50,6 +50,10 @@ gchar const *ed_journal_file_get_gameversion(EDJournalFile *self);
|
|||||||
EDJournalEntry *ed_journal_file_get_first(EDJournalFile *self);
|
EDJournalEntry *ed_journal_file_get_first(EDJournalFile *self);
|
||||||
EDJournalEntry *ed_journal_file_get_last(EDJournalFile *self);
|
EDJournalEntry *ed_journal_file_get_last(EDJournalFile *self);
|
||||||
|
|
||||||
|
gboolean ed_journal_file_has_entries_in_range(EDJournalFile *self,
|
||||||
|
GDateTime *start,
|
||||||
|
GDateTime *end);
|
||||||
|
|
||||||
gint ed_journal_file_compare(EDJournalFile *lhs, EDJournalFile *rhs);
|
gint ed_journal_file_compare(EDJournalFile *lhs, EDJournalFile *rhs);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
json_t *entry;
|
json_t *entry;
|
||||||
|
GDateTime *timestamp;
|
||||||
} EDJournalEntryPrivate;
|
} EDJournalEntryPrivate;
|
||||||
|
|
||||||
G_DEFINE_QUARK("ed-json-error", ed_json_error);
|
G_DEFINE_QUARK("ed-json-error", ed_json_error);
|
||||||
@ -24,7 +25,12 @@ static void ed_journal_entry_finalize(GObject *obj)
|
|||||||
EDJournalEntryPrivate *p = ed_journal_entry_get_instance_private(self);
|
EDJournalEntryPrivate *p = ed_journal_entry_get_instance_private(self);
|
||||||
|
|
||||||
json_decref(p->entry);
|
json_decref(p->entry);
|
||||||
p = NULL;
|
p->entry = NULL;
|
||||||
|
|
||||||
|
if (p->timestamp != NULL) {
|
||||||
|
g_date_time_unref(p->timestamp);
|
||||||
|
p->timestamp = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
G_OBJECT_CLASS(ed_journal_entry_parent_class)->finalize(obj);
|
G_OBJECT_CLASS(ed_journal_entry_parent_class)->finalize(obj);
|
||||||
}
|
}
|
||||||
@ -69,6 +75,7 @@ EDErrorCode ed_journal_entry_parse(EDJournalEntry *self,
|
|||||||
EDJournalEntryPrivate *p = ed_journal_entry_get_instance_private(self);
|
EDJournalEntryPrivate *p = ed_journal_entry_get_instance_private(self);
|
||||||
EDErrorCode ret = ed_error_invalid;
|
EDErrorCode ret = ed_error_invalid;
|
||||||
json_error_t e;
|
json_error_t e;
|
||||||
|
char const *timestamp = NULL;
|
||||||
|
|
||||||
json_decref(p->entry);
|
json_decref(p->entry);
|
||||||
p->entry = NULL;
|
p->entry = NULL;
|
||||||
@ -88,10 +95,43 @@ EDErrorCode ed_journal_entry_parse(EDJournalEntry *self,
|
|||||||
e.text
|
e.text
|
||||||
);
|
);
|
||||||
ret = ed_error_invalid_json;
|
ret = ed_error_invalid_json;
|
||||||
} else {
|
goto done;
|
||||||
ret = ed_error_success;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
timestamp = ed_journal_entry_get_string(self, "timestamp");
|
||||||
|
if (S_EMPTY(timestamp)) {
|
||||||
|
json_decref(p->entry);
|
||||||
|
p->entry = NULL;
|
||||||
|
|
||||||
|
g_set_error(
|
||||||
|
error,
|
||||||
|
ed_json_error_quark(),
|
||||||
|
ed_error_invalid_json,
|
||||||
|
"entry has no timestamp"
|
||||||
|
);
|
||||||
|
ret = ed_error_invalid_json;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
p->timestamp = g_date_time_new_from_iso8601(timestamp, NULL);
|
||||||
|
if (p->timestamp == NULL) {
|
||||||
|
json_decref(p->entry);
|
||||||
|
p->entry = NULL;
|
||||||
|
|
||||||
|
g_set_error(
|
||||||
|
error,
|
||||||
|
ed_json_error_quark(),
|
||||||
|
ed_error_invalid_json,
|
||||||
|
"entry has an invalid timestamp"
|
||||||
|
);
|
||||||
|
ret = ed_error_invalid_json;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = ed_error_success;
|
||||||
|
|
||||||
|
done:
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -128,3 +168,24 @@ gboolean ed_journal_entry_is(EDJournalEntry *self, gchar const *event)
|
|||||||
|
|
||||||
return (g_ascii_strcasecmp(ev, event) == 0);
|
return (g_ascii_strcasecmp(ev, event) == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GDateTime *ed_journal_entry_get_timestamp(EDJournalEntry *self)
|
||||||
|
{
|
||||||
|
EDJournalEntryPrivate *p = ed_journal_entry_get_instance_private(self);
|
||||||
|
return p->timestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
gboolean ed_journal_entry_is_in_range(EDJournalEntry *self,
|
||||||
|
GDateTime *start,
|
||||||
|
GDateTime *end)
|
||||||
|
{
|
||||||
|
GDateTime *timestamp = ed_journal_entry_get_timestamp(self);
|
||||||
|
return_if_true(timestamp == NULL, FALSE);
|
||||||
|
|
||||||
|
if (g_date_time_compare(start, timestamp) <= 0 &&
|
||||||
|
g_date_time_compare(timestamp, end) <= 0) {
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
@ -601,3 +601,34 @@ gint ed_journal_file_compare(EDJournalFile *lhs, EDJournalFile *rhs)
|
|||||||
|
|
||||||
return g_date_time_compare(ldate, rdate);
|
return g_date_time_compare(ldate, rdate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gboolean ed_journal_file_has_entries_in_range(EDJournalFile *self,
|
||||||
|
GDateTime *start,
|
||||||
|
GDateTime *end)
|
||||||
|
{
|
||||||
|
return_if_true(self == NULL, FALSE);
|
||||||
|
|
||||||
|
EDJournalFilePrivate *p = ed_journal_file_get_instance_private(self);
|
||||||
|
|
||||||
|
return_if_true(p->first == NULL || p->last == NULL, FALSE);
|
||||||
|
|
||||||
|
GDateTime *first = ed_journal_entry_get_timestamp(p->first);
|
||||||
|
GDateTime *last = ed_journal_entry_get_timestamp(p->last);
|
||||||
|
|
||||||
|
if (g_date_time_compare(start, first) <= 0 &&
|
||||||
|
g_date_time_compare(last, end) <= 0) {
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_date_time_compare(first, start) <= 0 &&
|
||||||
|
g_date_time_compare(start, last) <= 0) {
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_date_time_compare(first, end) <= 0 &&
|
||||||
|
g_date_time_compare(end, last) <= 0) {
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
{ "timestamp":"2023-04-18T04:14:56Z", "event":"Fileheader", "part":1, "language":"English/UK", "Odyssey":true, "gameversion":"4.0.0.1477", "build":"r291050/r0 " }
|
{ "timestamp":"2024-04-18T04:14:56Z", "event":"Fileheader", "part":1, "language":"English/UK", "Odyssey":true, "gameversion":"4.0.0.1477", "build":"r291050/r0 " }
|
||||||
{ "timestamp":"2023-04-18T04:15:39Z", "event":"Commander", "FID":"F123456", "Name":"DeiMuata" }
|
{ "timestamp":"2024-04-18T04:15:39Z", "event":"Commander", "FID":"F123456", "Name":"DeiMuata" }
|
||||||
{ "timestamp":"2023-04-18T05:15:39Z", "event":"Something" }
|
{ "timestamp":"2024-04-18T05:15:39Z", "event":"Something" }
|
||||||
{ "timestamp":"2023-04-18T06:15:39Z", "event":"Shutdown" }
|
{ "timestamp":"2024-04-18T06:15:39Z", "event":"Shutdown" }
|
||||||
|
@ -174,6 +174,75 @@ static void test_first_last(void **state)
|
|||||||
g_clear_object(&file);
|
g_clear_object(&file);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_in_range(void **state)
|
||||||
|
{
|
||||||
|
char const *filename = "Journal.2024-04-18T061507.01.log";
|
||||||
|
|
||||||
|
EDJournalFile *file = NULL;
|
||||||
|
EDErrorCode ret = 0;
|
||||||
|
GError *error = NULL;
|
||||||
|
|
||||||
|
GDateTime *start = NULL;
|
||||||
|
GDateTime *end = NULL;
|
||||||
|
|
||||||
|
gboolean b;
|
||||||
|
|
||||||
|
file = ed_journal_file_new();
|
||||||
|
assert_non_null(file);
|
||||||
|
|
||||||
|
ret = ed_journal_file_open(file, filename, &error);
|
||||||
|
|
||||||
|
assert_null(error);
|
||||||
|
assert_int_equal(ret, ed_error_success);
|
||||||
|
|
||||||
|
/* start in range
|
||||||
|
*/
|
||||||
|
start = g_date_time_new_from_iso8601("2024-04-18T04:15:39Z", NULL);
|
||||||
|
end = g_date_time_new_from_iso8601("2024-04-19T04:15:39Z", NULL);
|
||||||
|
b = ed_journal_file_has_entries_in_range(file, start, end);
|
||||||
|
assert_true(b);
|
||||||
|
g_date_time_unref(start);
|
||||||
|
g_date_time_unref(end);
|
||||||
|
|
||||||
|
/* end in range
|
||||||
|
*/
|
||||||
|
start = g_date_time_new_from_iso8601("2024-04-17T04:15:39Z", NULL);
|
||||||
|
end = g_date_time_new_from_iso8601("2024-04-18T05:15:39Z", NULL);
|
||||||
|
b = ed_journal_file_has_entries_in_range(file, start, end);
|
||||||
|
assert_true(b);
|
||||||
|
g_date_time_unref(start);
|
||||||
|
g_date_time_unref(end);
|
||||||
|
|
||||||
|
/* both outside
|
||||||
|
*/
|
||||||
|
start = g_date_time_new_from_iso8601("2023-04-17T04:15:39Z", NULL);
|
||||||
|
end = g_date_time_new_from_iso8601("2025-04-18T05:15:39Z", NULL);
|
||||||
|
b = ed_journal_file_has_entries_in_range(file, start, end);
|
||||||
|
assert_true(b);
|
||||||
|
g_date_time_unref(start);
|
||||||
|
g_date_time_unref(end);
|
||||||
|
|
||||||
|
/* too early
|
||||||
|
*/
|
||||||
|
start = g_date_time_new_from_iso8601("2023-04-17T04:15:39Z", NULL);
|
||||||
|
end = g_date_time_new_from_iso8601("2023-04-18T05:15:39Z", NULL);
|
||||||
|
b = ed_journal_file_has_entries_in_range(file, start, end);
|
||||||
|
assert_false(b);
|
||||||
|
g_date_time_unref(start);
|
||||||
|
g_date_time_unref(end);
|
||||||
|
|
||||||
|
/* too late
|
||||||
|
*/
|
||||||
|
start = g_date_time_new_from_iso8601("2025-04-17T04:15:39Z", NULL);
|
||||||
|
end = g_date_time_new_from_iso8601("2025-04-18T05:15:39Z", NULL);
|
||||||
|
b = ed_journal_file_has_entries_in_range(file, start, end);
|
||||||
|
assert_false(b);
|
||||||
|
g_date_time_unref(start);
|
||||||
|
g_date_time_unref(end);
|
||||||
|
|
||||||
|
g_clear_object(&file);
|
||||||
|
}
|
||||||
|
|
||||||
int main(int ac, char **av)
|
int main(int ac, char **av)
|
||||||
{
|
{
|
||||||
static const struct CMUnitTest tests[] = {
|
static const struct CMUnitTest tests[] = {
|
||||||
@ -184,6 +253,7 @@ int main(int ac, char **av)
|
|||||||
cmocka_unit_test(test_old_datetime),
|
cmocka_unit_test(test_old_datetime),
|
||||||
cmocka_unit_test(test_valid_peek),
|
cmocka_unit_test(test_valid_peek),
|
||||||
cmocka_unit_test(test_first_last),
|
cmocka_unit_test(test_first_last),
|
||||||
|
cmocka_unit_test(test_in_range),
|
||||||
};
|
};
|
||||||
|
|
||||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user