Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Support querying files by modification time and size
Thanks for Leslie Zhai's patch.
  • Loading branch information
yetist authored and lukefromdc committed Jan 28, 2019
1 parent e8f124d commit 3a22d4c
Show file tree
Hide file tree
Showing 4 changed files with 344 additions and 20 deletions.
37 changes: 37 additions & 0 deletions libcaja-private/caja-query.c
Expand Up @@ -36,6 +36,8 @@ struct CajaQueryDetails
char *location_uri;
GList *mime_types;
GList *tags;
gint64 duration;
gint64 size;
};

static void caja_query_class_init (CajaQueryClass *class);
Expand Down Expand Up @@ -75,6 +77,8 @@ static void
caja_query_init (CajaQuery *query)
{
query->details = g_new0 (CajaQueryDetails, 1);
query->details->duration = 0;
query->details->size = 0;
}

CajaQuery *
Expand Down Expand Up @@ -379,6 +383,8 @@ caja_query_to_xml (CajaQuery *query)
char *mimetype;
char *tag;
GList *l;
gint64 duration;
gint64 size;

xml = g_string_new ("");
g_string_append (xml,
Expand Down Expand Up @@ -420,6 +426,17 @@ caja_query_to_xml (CajaQuery *query)
g_string_append (xml, " </tags>\n");
}

if (query->details->duration != 0)
{
g_string_append_printf(xml, " <duration>%ld</duration>",
query->details->duration);
}

if (query->details->size != 0)
{
g_string_append_printf(xml, " <size>%ld</size>", query->details->size);
}

g_string_append (xml, "</query>\n");

return g_string_free (xml, FALSE);
Expand All @@ -445,3 +462,23 @@ caja_query_save (CajaQuery *query, char *file)
}
return res;
}

void caja_query_set_duration(CajaQuery *query, gint64 sec)
{
query->details->duration = sec;
}

gint64 caja_query_get_duration(CajaQuery *query)
{
return query->details->duration;
}

void caja_query_set_size(CajaQuery *query, gint64 size)
{
query->details->size = size;
}

gint64 caja_query_get_size(CajaQuery *query)
{
return query->details->size;
}
8 changes: 7 additions & 1 deletion libcaja-private/caja-query.h
Expand Up @@ -66,7 +66,13 @@ void caja_query_set_mime_types (CajaQuery *query, GList *mime_type
void caja_query_add_mime_type (CajaQuery *query, const char *mime_type);

char * caja_query_to_readable_string (CajaQuery *query);
CajaQuery *caja_query_load (char *file);
CajaQuery * caja_query_load (char *file);
gboolean caja_query_save (CajaQuery *query, char *file);

gint64 caja_query_get_duration (CajaQuery *query);
void caja_query_set_duration (CajaQuery *query, gint64 sec);

gint64 caja_query_get_size (CajaQuery *query);
void caja_query_set_size (CajaQuery *query, gint64 size);

#endif /* CAJA_QUERY_H */
64 changes: 47 additions & 17 deletions libcaja-private/caja-search-engine-simple.c
Expand Up @@ -48,6 +48,8 @@ typedef struct

gint n_processed_files;
GList *uri_hits;
gint64 duration;
gint64 size;
} SearchThreadData;


Expand Down Expand Up @@ -124,6 +126,8 @@ search_thread_data_new (CajaSearchEngineSimple *engine,

data->tags = caja_query_get_tags (query);
data->mime_types = caja_query_get_mime_types (query);
data->duration = caja_query_get_duration (query);
data->size = caja_query_get_size (query);

data->cancellable = g_cancellable_new ();

Expand Down Expand Up @@ -350,34 +354,38 @@ visit_directory (GFile *dir, SearchThreadData *data)
GList *l;
const char *id;
gboolean visited;
GTimeVal result;
time_t timestamp;
gchar *attributes;
GString *attr_string;

const char *attributes;
attr_string = g_string_new (STD_ATTRIBUTES);
if (data->mime_types != NULL) {
if (data->tags != NULL) {
attributes = STD_ATTRIBUTES ","
G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE ","
G_FILE_ATTRIBUTE_XATTR_XDG_TAGS;
} else {
attributes = STD_ATTRIBUTES ","
G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE;
}
} else {
if (data->tags != NULL) {
attributes = STD_ATTRIBUTES ","
G_FILE_ATTRIBUTE_XATTR_XDG_TAGS;
} else {
attributes = STD_ATTRIBUTES;
}
g_string_append (attr_string, "," G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE);
}
if (data->tags != NULL) {
g_string_append (attr_string, "," G_FILE_ATTRIBUTE_XATTR_XDG_TAGS);
}
if (data->duration != 0) {
g_string_append (attr_string, "," G_FILE_ATTRIBUTE_TIME_MODIFIED ","
G_FILE_ATTRIBUTE_TIME_MODIFIED_USEC);
}
if (data->size != 0) {
g_string_append (attr_string, "," G_FILE_ATTRIBUTE_STANDARD_SIZE);
}

enumerator = g_file_enumerate_children (dir, attributes, 0,
attributes = g_string_free (attr_string, FALSE);
enumerator = g_file_enumerate_children (dir, (const char*)attributes, 0,
data->cancellable, NULL);

g_free (attributes);
if (enumerator == NULL)
{
return;
}

timestamp = time(NULL);

while ((info = g_file_enumerator_next_file (enumerator, data->cancellable, NULL)) != NULL)
{
if (g_file_info_get_is_hidden (info))
Expand Down Expand Up @@ -426,6 +434,28 @@ visit_directory (GFile *dir, SearchThreadData *data)
hit = file_has_all_tags (info, data->tags);
}

if (hit && data->duration != 0) {
g_file_info_get_modification_time (info, &result);
if (data->duration > 0) {
if (timestamp - result.tv_sec < data->duration)
hit = FALSE;
} else {
if (timestamp - result.tv_sec > ABS(data->duration))
hit = FALSE;
}
}

if (hit && data->size != 0) {
gint64 file_size = g_file_info_get_size (info);
if (data->size > 0) {
if (file_size < data->size)
hit = FALSE;
} else {
if (ABS(data->size) < file_size)
hit = FALSE;
}
}

child = g_file_get_child (dir, g_file_info_get_name (info));

if (hit)
Expand Down

0 comments on commit 3a22d4c

Please sign in to comment.