1717#include < vsag/index.h>
1818#include < vsag/vsag_c_api.h>
1919
20+ #include < cstring>
2021#include < fstream>
2122
23+ Error_t SUCCESS = {VSAG_SUCCESS, " success" };
24+
2225class VsagIndex {
2326public:
2427 VsagIndex (std::shared_ptr<vsag::Index> index) : index_(std::move(index)) {
@@ -27,6 +30,26 @@ class VsagIndex {
2730 std::shared_ptr<vsag::Index> index_;
2831};
2932
33+ static Error_t
34+ make_error (const vsag::Error& error) {
35+ Error_t err;
36+ err.code = static_cast <int >(error.type );
37+ const auto & msg = error.message ;
38+ memcpy (err.message , msg.c_str (), msg.size () + 1 );
39+ err.message [msg.size ()] = ' \0 ' ;
40+ return err;
41+ }
42+
43+ static Error_t
44+ make_error (const std::exception& e) {
45+ Error_t err;
46+ err.code = static_cast <int >(vsag::ErrorType::INTERNAL_ERROR);
47+ const auto * msg = e.what ();
48+ memcpy (err.message , msg, strlen (msg) + 1 );
49+ err.message [strlen (msg)] = ' \0 ' ;
50+ return err;
51+ }
52+
3053extern " C" {
3154vsag_index_t
3255vsag_index_factory (const char * index_name, const char * index_param) {
@@ -42,18 +65,18 @@ vsag_index_factory(const char* index_name, const char* index_param) {
4265 }
4366}
4467
45- bool
68+ Error_t
4669vsag_index_destroy (vsag_index_t index) {
4770 try {
4871 auto * vsag_index = static_cast <VsagIndex*>(index);
4972 delete vsag_index;
50- return true ;
73+ return SUCCESS ;
5174 } catch (const std::exception& e) {
52- return false ;
75+ return make_error (e) ;
5376 }
5477}
5578
56- bool
79+ Error_t
5780vsag_index_build (
5881 vsag_index_t index, const float * data, const int64_t * ids, uint64_t dim, uint64_t count) {
5982 try {
@@ -65,15 +88,20 @@ vsag_index_build(
6588 ->NumElements (static_cast <int64_t >(count))
6689 ->Ids (ids)
6790 ->Float32Vectors (data);
68- vsag_index->index_ ->Build (dataset);
91+ auto build_result = vsag_index->index_ ->Build (dataset);
92+ if (build_result.has_value ()) {
93+ return SUCCESS;
94+ }
95+
96+ return make_error (build_result.error ());
6997 }
70- return true ;
98+ return SUCCESS ;
7199 } catch (const std::exception& e) {
72- return false ;
100+ return make_error (e) ;
73101 }
74102}
75103
76- bool
104+ Error_t
77105vsag_index_knn_search (vsag_index_t index,
78106 const float * query,
79107 uint64_t dim,
@@ -98,30 +126,36 @@ vsag_index_knn_search(vsag_index_t index,
98126 ids[i] = ids_view[i];
99127 results[i] = dists_view[i];
100128 }
129+ } else {
130+ return make_error (result.error ());
101131 }
102132 }
103- return true ;
133+ return SUCCESS ;
104134 } catch (const std::exception& e) {
105- return false ;
135+ return make_error (e) ;
106136 }
107137}
108138
109- bool
139+ Error_t
110140vsag_serialize_file (vsag_index_t index, const char * file_path) {
111141 try {
112142 auto * vsag_index = static_cast <VsagIndex*>(index);
113143 if (vsag_index != nullptr ) {
114144 std::ofstream file (file_path, std::ios::binary);
115- vsag_index->index_ ->Serialize (file);
145+ auto serialize_result = vsag_index->index_ ->Serialize (file);
116146 file.close ();
147+ if (serialize_result.has_value ()) {
148+ return SUCCESS;
149+ }
150+ return make_error (serialize_result.error ());
117151 }
118- return true ;
152+ return SUCCESS ;
119153 } catch (const std::exception& e) {
120- return false ;
154+ return make_error (e) ;
121155 }
122156}
123157
124- bool
158+ Error_t
125159vsag_deserialize_file (vsag_index_t index, const char * file_path) {
126160 try {
127161 auto * vsag_index = static_cast <VsagIndex*>(index);
@@ -130,9 +164,9 @@ vsag_deserialize_file(vsag_index_t index, const char* file_path) {
130164 vsag_index->index_ ->Deserialize (file);
131165 file.close ();
132166 }
133- return true ;
167+ return SUCCESS ;
134168 } catch (const std::exception& e) {
135- return false ;
169+ return make_error (e) ;
136170 }
137171}
138172}
0 commit comments