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");