Обработка user-data файлов

Пользователь зашёл в систему, что-то поделал и вышел. ACIS::Web или помогающий ей скрипт "чистильщик" закрыли сессию, сохранив user-data файл в нужное место и передали запрос РеПЕк-Индекс-демону на обработу этого файла. Что дальше?

Ed.Note: подумать!…

Первая стадия: collection-класс.  На входе в RePEc-Index.

Модуль RePEc::Index::Collection::ACIS_UD должен соответствовать интерфейсу RI-Collection-класс.  Интерфейс простой: если ты наследуешь от RePEc::Index::Collection, то ты должен определить два метода: open_data_file() и get_next_record().  Ещё вызывается метод check_id(), но в случае user-data, он должен просто возвращать единицу.

Этот модуль будет в методе open_data_file() открывать файл, читать его содержимое с помощью ACIS::Data::DumpXML::Parser.  Метод get_next_record() будет при первом вызове возвращать /data/user (тип: "acis-user", id: login-name, т.е. email), а затем каждую из /data/records/list-item (тип: "acis-record-person", id: хэндл).  Затем будет возвращать 0, чтобы R::I понял, что можно переходить к следующему файлу.  Потом всё повторяется.

Итак, в методе open_data_file() мы открываем файл и загружаем (ACIS::Data::DumpXML::Parser) его содержимое в память, в $self. После этого $self->{userdata}->{user} это /data/user, а $self->{userdata}->{records} это массив записей /data/records/list-items.  Запоминаем, какой файл мы открыли и на какой стадии его обработки мы находимся, первоначально -1.

При вызове get_next_record() мы смотрим, где мы находимся.  Если текущая стадия == -1, готовим $self->{userdata}->{user} как запись.  Для этого нам нужно:

Если текущая стадия больше чем -1, то готовим и аналогичным образом возвращаем запись с соответствующим номером из массива $self->{userdata}->{records}, превращая её в запись типа "acis-record-person".

Всё.

Вторая стадия: собственно обработка записей.  В обществе ARDB.

ARDB plugin. Плагин ARDB::Plugin::Processing::ACIS_UD берет на обработку типы "acis-user" и "acis-record-person".

Из записей типа "acis-user" извлекаем следующую информацию:

Из записей типа "acis-record-person" мы извлекаем следующую информацию:

Прощальная песня

Вам весело? Это ещё не всё.  Надо не только обработать сами user-data файлы и содержащиеся в них записи, но и обрабатывать их удаление.

Пропал user-data файл? RePEc-Index это заметит и вызовет $ardb->delete_record( $id ). ARDB должен знать, что ему делать.  Но это просто: удалить соответствующие записи из таблиц acis.users, acis.records, acis.names.