Skip to content

Commit ee24114

Browse files
authored
Merge pull request #140 from DenverM80/fix_common_prefix
Fix common prefix
2 parents daad566 + e3fdab3 commit ee24114

File tree

6 files changed

+90
-12
lines changed

6 files changed

+90
-12
lines changed

src/ds3.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13234,6 +13234,7 @@ static ds3_error* _parse_top_level_ds3_list_bucket_result_response(const ds3_cli
1323413234
xmlNodePtr child_node;
1323513235
ds3_list_bucket_result_response* response;
1323613236
ds3_error* error = NULL;
13237+
GPtrArray* common_prefixes_array = g_ptr_array_new();
1323713238
GPtrArray* objects_array = g_ptr_array_new();
1323813239

1323913240
error = _get_request_xml_nodes(xml_blob, &doc, &root, "ListBucketResult");
@@ -13246,15 +13247,11 @@ static ds3_error* _parse_top_level_ds3_list_bucket_result_response(const ds3_cli
1324613247
for (child_node = root->xmlChildrenNode; child_node != NULL; child_node = child_node->next) {
1324713248
if (element_equal(child_node, "CommonPrefixes")) {
1324813249
xmlNodePtr loop_node;
13249-
GPtrArray* common_prefixes_array = g_ptr_array_new();
1325013250
int num_nodes = 0;
1325113251
for (loop_node = child_node->xmlChildrenNode; loop_node != NULL; loop_node = loop_node->next, num_nodes++) {
1325213252
ds3_str* common_prefixes = xml_get_string(doc, loop_node);
1325313253
g_ptr_array_add(common_prefixes_array, common_prefixes);
1325413254
}
13255-
response->common_prefixes = (ds3_str**)common_prefixes_array->pdata;
13256-
response->num_common_prefixes = common_prefixes_array->len;
13257-
g_ptr_array_free(common_prefixes_array, FALSE);
1325813255
} else if (element_equal(child_node, "CreationDate")) {
1325913256
response->creation_date = xml_get_string(doc, child_node);
1326013257
} else if (element_equal(child_node, "Delimiter")) {
@@ -13286,6 +13283,9 @@ static ds3_error* _parse_top_level_ds3_list_bucket_result_response(const ds3_cli
1328613283

1328713284
}
1328813285

13286+
response->common_prefixes = (ds3_str**)common_prefixes_array->pdata;
13287+
response->num_common_prefixes = common_prefixes_array->len;
13288+
g_ptr_array_free(common_prefixes_array, FALSE);
1328913289
response->objects = (ds3_contents_response**)objects_array->pdata;
1329013290
response->num_objects = objects_array->len;
1329113291
g_ptr_array_free(objects_array, FALSE);
@@ -13306,6 +13306,7 @@ static ds3_error* _parse_top_level_ds3_list_multi_part_uploads_result_response(c
1330613306
xmlNodePtr child_node;
1330713307
ds3_list_multi_part_uploads_result_response* response;
1330813308
ds3_error* error = NULL;
13309+
GPtrArray* common_prefixes_array = g_ptr_array_new();
1330913310
GPtrArray* uploads_array = g_ptr_array_new();
1331013311

1331113312
error = _get_request_xml_nodes(xml_blob, &doc, &root, "ListMultipartUploadsResult");
@@ -13320,15 +13321,11 @@ static ds3_error* _parse_top_level_ds3_list_multi_part_uploads_result_response(c
1332013321
response->bucket = xml_get_string(doc, child_node);
1332113322
} else if (element_equal(child_node, "CommonPrefixes")) {
1332213323
xmlNodePtr loop_node;
13323-
GPtrArray* common_prefixes_array = g_ptr_array_new();
1332413324
int num_nodes = 0;
1332513325
for (loop_node = child_node->xmlChildrenNode; loop_node != NULL; loop_node = loop_node->next, num_nodes++) {
1332613326
ds3_str* common_prefixes = xml_get_string(doc, loop_node);
1332713327
g_ptr_array_add(common_prefixes_array, common_prefixes);
1332813328
}
13329-
response->common_prefixes = (ds3_str**)common_prefixes_array->pdata;
13330-
response->num_common_prefixes = common_prefixes_array->len;
13331-
g_ptr_array_free(common_prefixes_array, FALSE);
1333213329
} else if (element_equal(child_node, "Delimiter")) {
1333313330
response->delimiter = xml_get_string(doc, child_node);
1333413331
} else if (element_equal(child_node, "KeyMarker")) {
@@ -13360,6 +13357,9 @@ static ds3_error* _parse_top_level_ds3_list_multi_part_uploads_result_response(c
1336013357

1336113358
}
1336213359

13360+
response->common_prefixes = (ds3_str**)common_prefixes_array->pdata;
13361+
response->num_common_prefixes = common_prefixes_array->len;
13362+
g_ptr_array_free(common_prefixes_array, FALSE);
1336313363
response->uploads = (ds3_multi_part_upload_response**)uploads_array->pdata;
1336413364
response->num_uploads = uploads_array->len;
1336513365
g_ptr_array_free(uploads_array, FALSE);

test/bucket_tests.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,44 @@ BOOST_AUTO_TEST_CASE( delimiter ) {
111111
free_client(client);
112112
}
113113

114+
BOOST_AUTO_TEST_CASE( common_prefixes ) {
115+
printf("-----Testing CommonPrefixes-------\n");
116+
117+
ds3_request* request;
118+
ds3_error* error;
119+
ds3_list_bucket_result_response* response;
120+
ds3_client* client = get_client();
121+
const char* bucket_name = "test_common_prefixes_bucket";
122+
ds3_bool found_resources = False;
123+
ds3_bool found_resources_2 = False;
124+
size_t common_prefix_index;
125+
126+
populate_with_multi_dir_objects(client, bucket_name);
127+
128+
request = ds3_init_get_bucket_request(bucket_name);
129+
ds3_request_set_delimiter(request, "/");
130+
ds3_request_set_prefix(request, "resources");
131+
error = ds3_get_bucket_request(client, request, &response);
132+
ds3_request_free(request);
133+
handle_error(error);
134+
135+
BOOST_CHECK_EQUAL(response->num_objects, 0);
136+
BOOST_CHECK_EQUAL(response->num_common_prefixes, 2);
137+
for(common_prefix_index = 0; common_prefix_index < response->num_common_prefixes; common_prefix_index++) {
138+
if(strcmp(response->common_prefixes[common_prefix_index]->value, "resources/") == 0) {
139+
found_resources = True;
140+
} else if (strcmp(response->common_prefixes[common_prefix_index]->value, "resources_2/") == 0) {
141+
found_resources_2 = True;
142+
}
143+
}
144+
BOOST_CHECK_EQUAL(found_resources, True);
145+
BOOST_CHECK_EQUAL(found_resources_2, True);
146+
147+
ds3_list_bucket_result_response_free(response);
148+
clear_bucket(client, bucket_name);
149+
free_client(client);
150+
}
151+
114152
BOOST_AUTO_TEST_CASE(marker) {
115153
printf("-----Testing Marker-------\n");
116154

test/resources_2/bar.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
This is bar.

test/resources_2/foo.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
This is foo.

test/test.cpp

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -200,11 +200,27 @@ void populate_with_objects(const ds3_client* client, const char* bucket_name) {
200200
ds3_str_free(job_id);
201201
}
202202

203+
void populate_with_multi_dir_objects(const ds3_client* client, const char* bucket_name) {
204+
ds3_str* job_id = populate_with_multi_dir_objects_return_job(client, bucket_name);
205+
ds3_str_free(job_id);
206+
}
207+
203208
ds3_bulk_object_list_response* default_object_list() {
204209
const char* books[5] = {"resources/beowulf.txt", "resources/sherlock_holmes.txt", "resources/tale_of_two_cities.txt", "resources/ulysses.txt", "resources/ulysses_large.txt"};
205210
return ds3_convert_file_list(books, 5);
206211
}
207212

213+
ds3_bulk_object_list_response* multi_dirs_object_list() {
214+
const char* books[6] = {
215+
"resources/beowulf.txt",
216+
"resources/sherlock_holmes.txt",
217+
"resources/tale_of_two_cities.txt",
218+
"resources/ulysses.txt",
219+
"resources_2/foo.txt",
220+
"resources_2/bar.txt"};
221+
return ds3_convert_file_list(books, 6);
222+
}
223+
208224
ds3_request* populate_bulk_return_request(const ds3_client* client, const char* bucket_name, ds3_bulk_object_list_response* obj_list) {
209225
ds3_error* error = create_bucket_with_data_policy(client, bucket_name, ids.data_policy_id->value);
210226
ds3_error_free(error);
@@ -289,19 +305,33 @@ void populate_with_objects_from_bulk(const ds3_client* client, const char* bucke
289305
ds3_master_object_list_response_free(chunk_response);
290306
}
291307

292-
ds3_str* populate_with_objects_return_job(const ds3_client* client, const char* bucket_name) {
293-
ds3_bulk_object_list_response* bulk_object_list_response = default_object_list();
294-
ds3_request* request = populate_bulk_return_request(client, bucket_name, bulk_object_list_response);
308+
ds3_str* populate_with_object_list_return_job( const ds3_client* client,
309+
const char* bucket_name,
310+
ds3_bulk_object_list_response* object_list) {
311+
ds3_request* request = populate_bulk_return_request(client, bucket_name, object_list);
295312
ds3_master_object_list_response* master_object_list_response = populate_bulk_return_response(client, request);
296313

297314
ds3_str* job_id = ds3_str_dup(master_object_list_response->job_id);
298315
populate_with_objects_from_bulk(client, bucket_name, master_object_list_response);
299316

300-
ds3_bulk_object_list_response_free(bulk_object_list_response);
301317
ds3_master_object_list_response_free(master_object_list_response);
302318
return job_id;
303319
}
304320

321+
ds3_str* populate_with_objects_return_job(const ds3_client* client, const char* bucket_name) {
322+
ds3_bulk_object_list_response* obj_list = default_object_list();
323+
ds3_str* job_id = populate_with_object_list_return_job(client, bucket_name, obj_list);
324+
ds3_bulk_object_list_response_free(obj_list);
325+
return job_id;
326+
}
327+
328+
ds3_str* populate_with_multi_dir_objects_return_job(const ds3_client* client, const char* bucket_name) {
329+
ds3_bulk_object_list_response* obj_list = multi_dirs_object_list();
330+
ds3_str* job_id = populate_with_object_list_return_job(client, bucket_name, obj_list);
331+
ds3_bulk_object_list_response_free(obj_list);
332+
return job_id;
333+
}
334+
305335
bool contains_object(ds3_list_bucket_result_response* bucket_list, const char* key) {
306336
uint64_t object_index;
307337
for (object_index = 0; object_index < bucket_list->num_objects; object_index++) {

test/test.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,14 @@ void teardown_after_tests();
2525
void clear_bucket(const ds3_client* client, const char* bucket_name);
2626

2727
void populate_with_objects(const ds3_client* client, const char* bucket_name);
28+
void populate_with_multi_dir_objects(const ds3_client* client, const char* bucket_name);
29+
30+
ds3_str* populate_with_object_list_return_job( const ds3_client* client,
31+
const char* bucket_name,
32+
ds3_bulk_object_list_response* object_list);
33+
2834
ds3_str* populate_with_objects_return_job(const ds3_client* client, const char* bucket_name);
35+
ds3_str* populate_with_multi_dir_objects_return_job(const ds3_client* client, const char* bucket_name);
2936
ds3_str* populate_with_empty_objects(const ds3_client* client, const char* bucket_name);
3037

3138
ds3_request* populate_bulk_return_request(const ds3_client* client, const char* bucket_name, ds3_bulk_object_list_response* obj_list);
@@ -41,6 +48,7 @@ void handle_error(ds3_error* error);
4148
void free_client(ds3_client* client);
4249

4350
ds3_bulk_object_list_response* default_object_list();
51+
ds3_bulk_object_list_response* multi_dirs_object_list();
4452

4553
ds3_error* create_bucket_with_data_policy(const ds3_client* client, const char* bucket_id, const char* data_policy_id);
4654

0 commit comments

Comments
 (0)