github.com/ncruces/go-sqlite3@v0.15.1-0.20240520133447-53eef1510ff0/sqlite3/column.c (about) 1 #include <stddef.h> 2 3 #include "sqlite3.h" 4 5 union sqlite3_data { 6 sqlite3_int64 i; 7 double d; 8 struct { 9 const void *ptr; 10 int len; 11 }; 12 }; 13 14 int sqlite3_columns_go(sqlite3_stmt *stmt, int nCol, char *aType, 15 union sqlite3_data *aData) { 16 if (nCol != sqlite3_column_count(stmt)) { 17 return SQLITE_MISUSE; 18 } 19 int rc = SQLITE_OK; 20 for (int i = 0; i < nCol; ++i) { 21 const void *ptr = NULL; 22 switch (aType[i] = sqlite3_column_type(stmt, i)) { 23 default: // SQLITE_NULL 24 aData[i] = (union sqlite3_data){}; 25 case SQLITE_INTEGER: 26 aData[i].i = sqlite3_column_int64(stmt, i); 27 continue; 28 case SQLITE_FLOAT: 29 aData[i].d = sqlite3_column_double(stmt, i); 30 continue; 31 case SQLITE_TEXT: 32 ptr = sqlite3_column_text(stmt, i); 33 break; 34 case SQLITE_BLOB: 35 ptr = sqlite3_column_blob(stmt, i); 36 break; 37 } 38 if (ptr == NULL && rc == SQLITE_OK) { 39 rc = sqlite3_errcode(sqlite3_db_handle(stmt)); 40 } 41 aData[i].ptr = ptr; 42 aData[i].len = sqlite3_column_bytes(stmt, i); 43 } 44 return rc; 45 } 46 47 static_assert(offsetof(union sqlite3_data, i) == 0, "Unexpected offset"); 48 static_assert(offsetof(union sqlite3_data, d) == 0, "Unexpected offset"); 49 static_assert(offsetof(union sqlite3_data, ptr) == 0, "Unexpected offset"); 50 static_assert(offsetof(union sqlite3_data, len) == 4, "Unexpected offset"); 51 static_assert(sizeof(union sqlite3_data) == 8, "Unexpected size");