Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: timestamp postgreSQL 1c (программистам С)  (Прочитано 6944 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн baklan

  • Автор темы
  • Активист
  • *
  • Сообщений: 387
    • Просмотр профиля
    • backline
Вопрос к знатокам С . Не хватает знаний. Вот эта функция в файле timestamp.c
/*
 * timestamp_recv - converts external binary format to timestamp
 *
 * We make no attempt to provide compatibility between int and float
 * timestamp representations ...
 */
Datum
timestamp_recv(PG_FUNCTION_ARGS)
{
StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);

#ifdef NOT_USED
Oid typelem = PG_GETARG_OID(1);
#endif
int32 typmod = PG_GETARG_INT32(2);
Timestamp timestamp;
struct pg_tm tt,
   *tm = &tt;
fsec_t fsec;

#ifdef HAVE_INT64_TIMESTAMP
timestamp = (Timestamp) pq_getmsgint64(buf);
#else
timestamp = (Timestamp) pq_getmsgfloat8(buf);
#endif

/* rangecheck: see if timestamp_out would like it */
if (TIMESTAMP_NOT_FINITE(timestamp))
/* ok */ ;
else if (timestamp2tm(timestamp, NULL, tm, &fsec, NULL, NULL) != 0)
ereport(ERROR,
(errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
errmsg("timestamp out of range")));

AdjustTimestampForTypmod(&timestamp, typmod);

PG_RETURN_TIMESTAMP(timestamp);
}

Пишет в лог ошибку timestamp out of range  при загрузке файла  dt  в постгрес  . Думал проблема в том, что комп 64-битный, попробовал вот этот кусок
#ifdef HAVE_INT64_TIMESTAMP
timestamp = (Timestamp) pq_getmsgint64(buf);
#else
timestamp = (Timestamp) pq_getmsgfloat8(buf);
#endif
превратить в  timestamp = (Timestamp) pq_getmsgfloat8(buf);
Загрузка прошла, но все даты в документах стали 2000.01.01 :)
Видимо функция получает некорректные данные, но как уже сказал, моих знаний не хватает. Подскажите, как попытаться приблизиться к решению проблемы? Какие шаги предпринять? Можно бросить, конечно, но интуиция подсказывает, что решение где-то рядом :)

Пользователь решил продолжить мысль 18 Мая 2010, 12:21:08:
Можно ли вот сюда
errmsg("timestamp out of range")
кроме текстового сообщения еще и впихнуть то, что не получилось конвертнуть в timestamp?
« Последнее редактирование: 18 Мая 2010, 12:21:08 от baklan »

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: timestamp postgreSQL 1c (программистам С)
« Ответ #1 : 18 Мая 2010, 14:47:23 »
1. Покажите функцию timestamp2tm. Это именно она не работает.

2. Покажите определение типа Timestamp.

Тогда кусок кода можно дописать:

/* rangecheck: see if timestamp_out would like it */
if (TIMESTAMP_NOT_FINITE(timestamp)){
  /* ok */ ;
} else if (timestamp2tm(timestamp, NULL, tm, &fsec, NULL, NULL) != 0){
  char emsg[100];
  snprintf(emsg,99,"timestamp out of range: %d %d %d %d %d %d", timestamp.year,timestamp.month,timestamp.day,timestamp.hour,timestamp.min,timestamp.sec);
  ereport(ERROR,
              (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
               errmsg(emsg)));
}

Я это сделал в предположении, что Timestamp это структура с полями year, moth, day, hour, min, sec.
Добавлены фигурные скобочки (на всякий случай) и еще одна строковая переменная.

ОБН:
Хотя, 64 бита для такого набора это чересчур.
Можно написать несколько проще:

snprintf(emsg,99,"timestamp out of range: %lld", timestamp);
Но сомневаюсь, что это сильно поможет...
Хотя... Если даты представляются, как обычно в С, т.е. как количество секунд, прошедшее с 00оо 01-01-1970, то что-то достать можно.
« Последнее редактирование: 18 Мая 2010, 14:57:55 от wl »
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн baklan

  • Автор темы
  • Активист
  • *
  • Сообщений: 387
    • Просмотр профиля
    • backline
Re: timestamp postgreSQL 1c (программистам С)
« Ответ #2 : 18 Мая 2010, 15:35:41 »
Спасибо за ответ, попробую понять :)
В спойлер поместил  timestamp2tm()
(Нажмите, чтобы показать/скрыть)
« Последнее редактирование: 18 Мая 2010, 15:42:21 от Владимир Николаевич »

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: timestamp postgreSQL 1c (программистам С)
« Ответ #3 : 18 Мая 2010, 15:51:49 »
Ууу... Что-то дохрена разбираться... Прошу прощения за беспокойство, возможности такой нет.

В общем, понятно, что дата внутри представляется в виде микросекунд, прошедших с какого-то начального момента (POSTGRES_EPOCH_JDATE).
Подозреваю, что даты в импортируемом файле представлены неправильно.
Попробуйте поискать как они должны представляться.
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн baklan

  • Автор темы
  • Активист
  • *
  • Сообщений: 387
    • Просмотр профиля
    • backline
Re: timestamp postgreSQL 1c (программистам С)
« Ответ #4 : 18 Мая 2010, 16:04:11 »
В любом случае, спасибо за помощь. Это не жизненно необходимо, разберусь - значит хорошо, нет тоже нестрашно.

Нашел проблему, не надо ковырять исходники, надо configure  вот стакой опцией сделать
--disable-integer-datetimes
Подробности для одинэсников http://pg1c.ru/1c_server_on_ubuntu-10-04-lts
« Последнее редактирование: 21 Мая 2010, 21:53:47 от baklan »

Оффлайн maxsemenov

  • Новичок
  • *
  • Сообщений: 1
    • Просмотр профиля
Re: timestamp postgreSQL 1c (программистам С)
« Ответ #5 : 14 Сентября 2010, 15:34:01 »
В некоторых версия это не срабатывает приходится в spec менять
%{!?intdatetimes:%define intdatetimes 1}
на
%{!?intdatetimes:%define intdatetimes 0}

Источник http://www.alsigned.ru/?p=329

Оффлайн baklan

  • Автор темы
  • Активист
  • *
  • Сообщений: 387
    • Просмотр профиля
    • backline
Re: timestamp postgreSQL 1c (программистам С)
« Ответ #6 : 14 Сентября 2010, 15:50:43 »
Честно говоря , не увидел там отличий
Цитировать
Что бы после установки не появлялось при загрузке базы 1с не появлялась ошибка timestamp out of range, необходимо при компиляции задать параметр –disable-integer-datetimes.
И в добавок установлены умолчания конкретно для rpmbuild , а по сути это
configure --disable-integer-datetimes

 

Страница сгенерирована за 0.06 секунд. Запросов: 25.