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 (...) как текст)", но ничего не изменилось...

Спасибо!

0 ответов

Другие вопросы по тегам