Есть задача, есть решение и есть ОГРОМНАЯ проблема .....
Sergei 30.03.2005 18:02
А тперь обо всём по порядку :)
Есть в БД таблица в которой хранится график доступности курьеров на неделю вперёд (на 7 дней).
поля таблицы courier_shedule слудеющие:
courier_id, d1, d2, d3, d4, d5, d6, d7, date_sdvig
в полях d1 - d7 хранится в числовом закодированном виде расписания их доступности на каждый из 7 дней
d1 соответствует сегодня. Когда наступает следующий день, данные должны сдвинуться на 1 день влево, т.е.
d1:=d2
d2:=d3
d3:=d4
d4:=d5
d5:=d6
d6:=d7
d7:=0 (нет расписания, т.к. добавился новый день)
График должен сдвигаться один раз в день при обращении к любой странице сайта любого пользователя. Но если будут перерывы в заходах на сайт в несколько дней, то график должен сдвигаться не на 1 день, а на разницу дата последнего обновления и сегодняшняя дата. Дату последнего обновления храним в файле /admin/date_last_update.txt в формате 18-03-2005 например
далее прописывем в каждую страницу такой код:
$fileLastUpdate[^file::load[text;/admin/date_last_update.txt]]
$now[^date::now[]]
^fileLastUpdate.text.match[(\d+)\-(\d+)\-(\d+)][g]{$oldDate[^date::create($match.3;$match.2;$match.1)]}
$x(^math:trunc($now - $oldDate))
^if(^dtf:format[%d-%m-%Y;$now] ne $fileLastUpdate.text){
#----------Делаем сдвиг в БД---------------
^void:sql{
UPDATE courier_shedule
SET
date_sdvig='^now.sql-string[]',
^for[i](1;7){
d$i = ^if($i+$x<=7){d^eval($i+$x)}{0}
}[,]
WHERE
date_sdvig<'^now.sql-string[]'
}
#---------------------------------------------------------------
$newDateTXT[^dtf:format[%d-%m-%Y;$now]]
^newDateTXT.save[/admin/date_last_update.txt]
}
По идее этот код должен сдвигать дни как и задумано - так и происходит как ни странно!!! :)
Но проблема в том, что иногда все поля d1, d2, d3, d4, d5, d6, d7 забываются нулями (графики курьеров сбрасываются).
Объясните мне, умные головы, как это может происходить - хотя бы теоретически????? Я уже это поде date_sdvig добавил специально, чтобы при одновременном запуске считывания старой даты из файла /admin/date_last_update.txt несколькими пользователями, они последовательно не могли сместить несколько раз график, а чтобы сдвиг сделал, тот кто первый успеет выполнить запрос к БД.
Но и это не помогло - где-то тут ещё есть ДЫРА!!! А я уже что-то не догоняю совсем, где она может быть хотябы гипотетически.
Помогите разобраться
- Есть задача, есть решение и есть ОГРОМНАЯ проблема ....., Sergei 30.03.2005 18:02