@@ -226,12 +226,11 @@ int dbutils_settings_check_version (cloudsync_context *data, const char *version
226226 return res ;
227227}
228228
229- char * dbutils_table_settings_get_value (cloudsync_context * data , const char * table , const char * column_name , const char * key , char * buffer , size_t blen ) {
229+ int dbutils_table_settings_get_value (cloudsync_context * data , const char * table , const char * column_name , const char * key , char * buffer , size_t blen ) {
230230 DEBUG_SETTINGS ("dbutils_table_settings_get_value table: %s column: %s key: %s" , table , column_name , key );
231-
232- // check if heap allocation must be forced
233- if (!buffer || blen == 0 ) blen = 0 ;
234- size_t size = 0 ;
231+
232+ if (!buffer || blen == 0 ) return DBRES_MISUSE ;
233+ buffer [0 ] = 0 ;
235234
236235 dbvm_t * vm = NULL ;
237236 int rc = databasevm_prepare (data , SQL_TABLE_SETTINGS_GET_VALUE , (void * * )& vm , 0 );
@@ -251,40 +250,30 @@ char *dbutils_table_settings_get_value (cloudsync_context *data, const char *tab
251250 else if (rc != DBRES_ROW ) goto finalize_get_value ;
252251
253252 // SQLITE_ROW case
254- if (database_column_type (vm , 0 ) == DBTYPE_NULL ) {
255- buffer = NULL ;
253+ if (rc == DBRES_ROW ) {
256254 rc = DBRES_OK ;
257- goto finalize_get_value ;
258- }
255+
256+ // NULL case
257+ if (database_column_type (vm , 0 ) == DBTYPE_NULL ) {
258+ goto finalize_get_value ;
259+ }
259260
260- const char * value = database_column_text (vm , 0 );
261- #if CLOUDSYNC_UNITTEST
262- size = (buffer == OUT_OF_MEMORY_BUFFER ) ? (SQLITE_MAX_ALLOCATION_SIZE + 1 ) :(size_t )database_column_bytes (vm , 0 );
263- #else
264- size = (size_t )database_column_bytes (vm , 0 );
265- #endif
266- if (size + 1 > blen ) {
267- buffer = cloudsync_memory_alloc ((uint64_t )(size + 1 ));
268- if (!buffer ) {
261+ const char * value = database_column_text (vm , 0 );
262+ size_t size = (size_t )database_column_bytes (vm , 0 );
263+ if (size + 1 > blen ) {
269264 rc = DBRES_NOMEM ;
270- goto finalize_get_value ;
265+ } else {
266+ memcpy (buffer , value , size );
267+ buffer [size ] = '\0' ;
271268 }
272269 }
273270
274- memcpy (buffer , value , size + 1 );
275- rc = DBRES_OK ;
276-
277- finalize_get_value :
278- #if CLOUDSYNC_UNITTEST
279- if ((rc == DBRES_NOMEM ) && (size == SQLITE_MAX_ALLOCATION_SIZE + 1 )) rc = DBRES_OK ;
280- #endif
271+ finalize_get_value :
281272 if (rc != DBRES_OK ) {
282- buffer = NULL ;
283273 DEBUG_ALWAYS ("cloudsync_table_settings error %s" , database_errmsg (data ));
284274 }
285- if (vm ) databasevm_finalize (vm );
286-
287- return buffer ;
275+ if (vm ) databasevm_finalize (vm );
276+ return rc ;
288277}
289278
290279int dbutils_table_settings_set_key_value (cloudsync_context * data , const char * table_name , const char * column_name , const char * key , const char * value ) {
@@ -341,8 +330,8 @@ table_algo dbutils_table_settings_get_algo (cloudsync_context *data, const char
341330 DEBUG_SETTINGS ("dbutils_table_settings_get_algo %s" , table_name );
342331
343332 char buffer [512 ];
344- char * value = dbutils_table_settings_get_value (data , table_name , "*" , "algo" , buffer , sizeof (buffer ));
345- return (value ) ? cloudsync_algo_from_name (value ) : table_algo_none ;
333+ int rc = dbutils_table_settings_get_value (data , table_name , "*" , "algo" , buffer , sizeof (buffer ));
334+ return (rc == DBRES_OK ) ? cloudsync_algo_from_name (buffer ) : table_algo_none ;
346335}
347336
348337int dbutils_settings_load_callback (void * xdata , int ncols , char * * values , char * * names ) {
0 commit comments