Как сохранить временную метку в базе данных DBM?

Я реализую простой файлообменный сервис. В настоящее время я использую базу данных на основе файлов (так как это соответствует моим потребностям).

   # somewhere in my cgi script
   sub first_run
    {
      my $dbh = DBI->connect('dbi:DBM:');
      $dbh = DBI->connect("dbi:DBM:", "", "",{ AutoCommit => 1, RaiseError => 1, f_dir=>$DATABASE_DIR} );
      unless ($dbh)
      {
        print "<br>Cannot connect: $DBI::errstr";
        return undef;
      }
      $dbh->do("CREATE TABLE uploads( user_name TEXT,
        file_name TEXT, 
        upload_date TEXT ) ");
      $dbh->disconnect( );
    }

Как видите, я предлагаю хранить временную метку загрузки в виде строки, поскольку в настоящее время мне нужно только отобразить ее (предположим, использовать localtime() для получения временной метки в удобочитаемом формате). Но мне это кажется несколько нехорошим. Что, если позже я захочу показать загрузки за какой-то период и т. д.

Каков общий способ хранения меток времени в базе данных DBM без использования сторонних модулей CPAN? Как я могу вытащить их позже и показать пользователю (в моей ситуации преобразовать обратно в строку)?


person jonny    schedule 02.04.2009    source источник


Ответы (2)


Учтите, что сохранение времени в формате UTC менее неоднозначно, чем сохранение местного времени. Если вы сэкономите время на своем компьютере в Лондоне и отправите мне файл в Гонконге, увижу ли я при загрузке файла в вашей программе время, которое вы на самом деле сэкономили?

Учтите, что при хранении времени UTC у вас есть (по крайней мере) два варианта: отформатированная строка времени или подсчет чисел (секунд/миллисекунд/независимо) с определенного времени («эпохи»). Предположительно любой из этих форматов изоморфен другому, поскольку существует четко определенное двунаправленное преобразование одного формата в другой.

person tpdi    schedule 02.04.2009

Я бы просто сохранил эпоху, затем ее легко отобразить с помощью *localtime* или *strftime*.

Если вы действительно хотите иметь возможность просматривать содержимое БД без необходимости обратного преобразования эпохи, вы можете сохранить как числовое значение, так и строку *localtime* ("`1238693517 - Thu Apr 2 19:31:57 2009` "). Это делает данные избыточными и денормализованными, а также упрощает их проверку, сохраняя при этом возможность обрабатывать числовое значение. Ваш звонок.

person mirod    schedule 02.04.2009