apr_dbd sqlite3: выполнение select STRFTIME() в подготовленный оператор возвращает неверные данные
Я занимаюсь разработкой модуля apache2, который использует api_prd для хранения данных. Когда я использую следующий запрос через подготовленное утверждение, я не получаю ожидаемых результатов:
SELECT STRFTIME('%Y%m%d%H%M%S', date ,'unixepoch', 'localtime') as datestamp, date, read from sensorLogs where name = ?
поле даты хранится как int, содержит дату в формате отметки времени unix. Вместо отформатированной даты я получаю "??????" текстовая строка. Если я выполняю запрос вместо подготовленного оператора, я получаю правильный результат. С другими подготовленными утверждениями я получаю нормальные результаты, я не понимаю, что делаю неправильно (и мне нравятся подготовленные утверждения)
apr_dbd_results_t * result = NULL;
apr_dbd_prepared_t * statement;
apr_status_t rv;
statement = apr_hash_get(connection->prepared, "logsForSensor", APR_HASH_KEY_STRING);
rv = apr_dbd_pvselect(connection->driver, r->pool, connection->handle, &result, statement, 0, "pippo");
//same SQL, executed as query instead of prepared statement
//rv = apr_dbd_select(connection->driver, r->pool, connection->handle, &result, "select strftime('%Y%m%d%H%M%S', date ,'unixepoch', 'localtime') as datestamp, date ,name, read from sensorLogs where name = 'pippo'", 0);
char buf[120];
apr_strerror(rv, buf,120);
ap_log_rerror_(APLOG_MARK, APLOG_INFO, 0, r, "query returned %s", buf);
ap_rprintf(r, "\n<!-- select query returned \"%s\" -->\n", buf);
if (rv == 0)
{
int cnt = apr_dbd_num_tuples(connection->driver, result);
int cols = apr_dbd_num_cols(connection->driver, result);
ap_rprintf(r, "<br/>db connection OK!!! got %i results, %i columns<br/>", cnt, cols);
ap_rprintf(r, "\n<table\n");
for (int k = 1; k <= cnt; k++)
{
ap_rprintf(r, "\t<tr>\n");
apr_dbd_row_t * row = NULL;
apr_dbd_get_row(connection->driver, r->pool, result, &row, k);
ap_log_rerror_(APLOG_MARK, APLOG_INFO, 0, r, " - got row %i", k);
for (int z = 0; z < cols; z++)
{
if (z == 0)
{
const char * data = apr_pstrdup(r->pool, apr_dbd_get_entry(connection->driver, row, z));
ap_log_rerror_(APLOG_MARK, APLOG_INFO, 0, r, " - - got column %i", z);
ap_log_rerror_(APLOG_MARK, APLOG_INFO, 0, r, "%s", data);
ap_rprintf(r, "\t\t<td>%s</td>\n", data);
}
else if (z == 1 )
{
uint32_t * l = apr_pcalloc(r->pool, sizeof(uint32_t));
apr_dbd_datum_get(connection->driver, row, z, APR_DBD_TYPE_UINT, l);
ap_log_rerror_(APLOG_MARK, APLOG_INFO, 0, r, " - - got column %i", z);
ap_rprintf(r, "\t\t<td>%d</td>\n", *l);
}
else if (z == 2)
{
uint8_t * l = apr_pcalloc(r->pool, sizeof(uint8_t));
apr_dbd_datum_get(connection->driver, row, z, APR_DBD_TYPE_UTINY, l);
ap_log_rerror_(APLOG_MARK, APLOG_INFO, 0, r, " - - got column %i", z);
ap_rprintf(r, "\t\t<td>%d</td>\n", *l);
}
}
ap_rprintf(r, "\t</tr>\n");
}
ap_rprintf(r, "</table>\n");
Я также пытался "привести (strftime (...) как текст)", но ничего не изменилось...
Спасибо!