void **handle,
struct rgw_err *err) = 0;
- virtual int get_obj(void *handle, std::string& bucket, std::string& oid,
+ virtual int get_obj(void **handle, std::string& bucket, std::string& oid,
char **data, off_t ofs, off_t end) = 0;
+ virtual void finish_get_obj(void **handle) = 0;
+
/**
* Get the attributes for an object.
* bucket: name of the bucket holding the object.
return ret;
do {
- ret = get_obj(handle, src_bucket, src_obj, &data, ofs, end);
+ ret = get_obj(&handle, src_bucket, src_obj, &data, ofs, end);
if (ret < 0)
return ret;
ofs += ret;
return r;
}
-int RGWFS::get_obj(void *handle, std::string& bucket, std::string& obj,
+int RGWFS::get_obj(void **handle, std::string& bucket, std::string& obj,
char **data, off_t ofs, off_t end)
{
uint64_t len;
bufferlist bl;
int r = 0;
- GetObjState *state = (GetObjState *)handle;
+ GetObjState *state = *(GetObjState **)handle;
if (end <= 0)
len = 0;
return r;
}
+void RGWFS::finish_get_obj(void **handle)
+{
+ if (*handle) {
+ GetObjState *state = *(GetObjState **)handle;
+ close(state->fd);
+ delete state;
+ *handle = NULL;
+ }
+}
+
void **handle,
struct rgw_err *err);
- int get_obj(void *handle, std::string& bucket, std::string& obj,
+ int get_obj(void **handle, std::string& bucket, std::string& obj,
char **data, off_t ofs, off_t end);
+
+ void finish_get_obj(void **handle);
};
#endif
goto done;
while (ofs <= end) {
- len = rgwstore->get_obj(handle, s->bucket_str, s->object_str, &data, ofs, end);
+ len = rgwstore->get_obj(&handle, s->bucket_str, s->object_str, &data, ofs, end);
if (len < 0) {
ret = len;
goto done;
done:
send_response(handle);
free(data);
+ rgwstore->finish_get_obj(&handle);
}
int RGWGetObj::init_common()
ret = put_obj_meta(id, dest_bucket, dest_obj, mtime, attrs);
+ finish_get_obj(&handle);
+
return ret;
done_err:
- /* FIXME: need to free handle */
+ finish_get_obj(&handle);
return r;
}
map<string, bufferlist>::iterator iter;
+ *handle = NULL;
+
GetObjState *state = new GetObjState;
if (!state)
return -ENOMEM;
return r;
}
-int RGWRados::get_obj(void *handle,
+int RGWRados::get_obj(void **handle,
std::string& bucket, std::string& oid,
char **data, off_t ofs, off_t end)
{
uint64_t len;
bufferlist bl;
- GetObjState *state = (GetObjState *)handle;
+ GetObjState *state = *(GetObjState **)handle;
if (end <= 0)
len = 0;
if (r < 0 || !len || ((off_t)(ofs + len - 1) == end)) {
rados->close_pool(state->pool);
delete state;
+ *handle = NULL;
}
return r;
}
+void RGWRados::finish_get_obj(void **handle)
+{
+ if (*handle) {
+ GetObjState *state = *(GetObjState **)handle;
+ rados->close_pool(state->pool);
+ delete state;
+ *handle = NULL;
+ }
+}
+
void **handle,
struct rgw_err *err);
- int get_obj(void *handle, std::string& bucket, std::string& oid,
+ int get_obj(void **handle, std::string& bucket, std::string& oid,
char **data, off_t ofs, off_t end);
+
+ void finish_get_obj(void **handle);
};
#endif
struct rgw_err err;
void *handle;
off_t ofs = 0, end = -1;
+ bufferlist::iterator iter;
ret = rgwstore->prepare_get_obj(ui_bucket, user_id, ofs, &end, NULL, NULL, NULL, NULL, NULL, true, &handle, &err);
if (ret < 0)
return ret;
do {
- ret = rgwstore->get_obj(handle, ui_bucket, user_id, &data, ofs, end);
+ ret = rgwstore->get_obj(&handle, ui_bucket, user_id, &data, ofs, end);
if (ret < 0) {
- return ret;
+ goto done;
}
bl.append(data, ret);
free(data);
ofs += ret;
} while (ofs <= end);
- bufferlist::iterator iter = bl.begin();
+
+ iter = bl.begin();
info.decode(iter);
- return 0;
+ ret = 0;
+done:
+ rgwstore->finish_get_obj(&handle);
+ return ret;
}
/**
RGWUID uid;
void *handle;
off_t ofs = 0, end = -1;
+ bufferlist::iterator iter;
ret = rgwstore->prepare_get_obj(ui_email_bucket, email, ofs, &end, NULL, NULL,
NULL, NULL, NULL, true, &handle, &err);
if (ret < 0)
return ret;
do {
- ret = rgwstore->get_obj(handle, ui_email_bucket, email, &data, ofs, end);
+ ret = rgwstore->get_obj(&handle, ui_email_bucket, email, &data, ofs, end);
if (ret < 0)
- return ret;
+ goto done;
ofs += ret;
bl.append(data, ret);
free(data);
} while (ofs <= end);
- bufferlist::iterator iter = bl.begin();
+ iter = bl.begin();
uid.decode(iter);
user_id = uid.user_id;
- return 0;
+ ret = 0;
+done:
+ rgwstore->finish_get_obj(&handle);
+ return ret;
}
/**