forked from cory/tildefriends
		
	Pass around SQL errors slightly better.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4180 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
		
							
								
								
									
										25
									
								
								src/ssb.js.c
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								src/ssb.js.c
									
									
									
									
									
								
							@@ -345,6 +345,7 @@ typedef struct _sql_work_t
 | 
			
		||||
	JSValue callback;
 | 
			
		||||
	JSValue promise[2];
 | 
			
		||||
	int result;
 | 
			
		||||
	char* error;
 | 
			
		||||
} sql_work_t;
 | 
			
		||||
 | 
			
		||||
static void _tf_ssb_sql_append(uint8_t** rows, size_t* rows_count, const void* data, size_t size)
 | 
			
		||||
@@ -359,7 +360,8 @@ static void _tf_ssb_sqlAsync_work(uv_work_t* work)
 | 
			
		||||
	sql_work_t* sql_work = work->data;
 | 
			
		||||
	sqlite3* db = tf_ssb_acquire_db_reader(sql_work->ssb);
 | 
			
		||||
	sqlite3_stmt* statement = NULL;
 | 
			
		||||
	if (sqlite3_prepare(db, sql_work->query, -1, &statement, NULL) == SQLITE_OK)
 | 
			
		||||
	sql_work->result = sqlite3_prepare(db, sql_work->query, -1, &statement, NULL);
 | 
			
		||||
	if (sql_work->result == SQLITE_OK)
 | 
			
		||||
	{
 | 
			
		||||
		const uint8_t* p = sql_work->binds;
 | 
			
		||||
		int column = 0;
 | 
			
		||||
@@ -443,7 +445,7 @@ static void _tf_ssb_sqlAsync_work(uv_work_t* work)
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		printf("prepare failed\n");
 | 
			
		||||
		sql_work->error = tf_strdup(sqlite3_errmsg(db));
 | 
			
		||||
	}
 | 
			
		||||
	tf_ssb_release_db_reader(sql_work->ssb, db);
 | 
			
		||||
}
 | 
			
		||||
@@ -513,14 +515,28 @@ static void _tf_ssb_sqlAsync_after_work(uv_work_t* work, int status)
 | 
			
		||||
	tf_free(sql_work->binds);
 | 
			
		||||
	tf_free(sql_work->rows);
 | 
			
		||||
 | 
			
		||||
	JSValue result = JS_Call(context, sql_work->promise[0], JS_UNDEFINED, 0, NULL);
 | 
			
		||||
	tf_util_report_error(context, result);
 | 
			
		||||
	JSValue result = JS_UNDEFINED;
 | 
			
		||||
	if (sql_work->result == SQLITE_OK)
 | 
			
		||||
	{
 | 
			
		||||
		result = JS_Call(context, sql_work->promise[0], JS_UNDEFINED, 0, NULL);
 | 
			
		||||
		tf_util_report_error(context, result);
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		JSValue error = JS_ThrowInternalError(context, "SQL Error %s: %s", sql_work->error, sql_work->query);
 | 
			
		||||
		JSValue exception = JS_GetException(context);
 | 
			
		||||
		result = JS_Call(context, sql_work->promise[1], JS_UNDEFINED, 1, &exception);
 | 
			
		||||
		tf_util_report_error(context, result);
 | 
			
		||||
		JS_FreeValue(context, exception);
 | 
			
		||||
		JS_FreeValue(context, error);
 | 
			
		||||
	}
 | 
			
		||||
	JS_FreeValue(context, result);
 | 
			
		||||
	JS_FreeValue(context, sql_work->promise[0]);
 | 
			
		||||
	JS_FreeValue(context, sql_work->promise[1]);
 | 
			
		||||
	JS_FreeValue(context, sql_work->callback);
 | 
			
		||||
	JS_FreeCString(context, sql_work->query);
 | 
			
		||||
 | 
			
		||||
	tf_free(sql_work->error);
 | 
			
		||||
	tf_free(sql_work);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -599,6 +615,7 @@ static JSValue _tf_ssb_sqlAsync(JSContext* context, JSValueConst this_val, int a
 | 
			
		||||
		JS_FreeValue(context, error_value);
 | 
			
		||||
		JS_FreeCString(context, query);
 | 
			
		||||
		tf_free(work->binds);
 | 
			
		||||
		tf_free(work->error);
 | 
			
		||||
		tf_free(work);
 | 
			
		||||
	}
 | 
			
		||||
	return result;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user