Оператор NEWSESSION
Оператор NEWSESSION - создание действия, которое выполняет другое действие в новой сессии.
Синтаксис
NEWSESSION [NEWSQL] [FORMS formId1, ..., formIdM] [NESTED [nestedPropertySelector] [CLASSES]] [SINGLE] action
где nestedPropertySelector имеет один из следующих вариантов:
LOCAL
(propertyId1, ..., propertyIdN)
Описание
Оператор NEWSESSION создает действие, которое выполняет другое действие в новой сессии.
При указании NESTED LOCAL или NESTED (propertyId1, ..., propertyIdN) в новой сессии становятся видны изменения соответствующих локальных свойств текущей сессии. Также изменения этих локальных свойств в новой сессии попадут в текущую сессию при применении изменений в новой сессии.
Параметры
-
NEWSQLКлючевое слово. Если оператор выполняется не во время уже идущей транзакции применения, новая сессия получает отдельное SQL-соединение, независимое от соединения текущей сессии, и весь блок
NESTED ... [CLASSES]игнорируется — в новую сессию не переносятся ни значения локальных свойств, ни изменения классов. Если же оператор вызван внутриAPPLY-транзакции текущей сессии, поведение определяется правилами рекурсивного применения и отдельное SQL-соединение в этом случае не открывается. -
formId1, ..., formIdMСписок идентификаторов форм, указываемый после
FORMS, к которым привязывается новая сессия. Сессия становится сессией изменений этих форм; используется, когда выполняемое действие должно вести себя так, как если бы оно было вызвано из этих форм. -
NESTEDОпциональное ключевое слово, после которого можно указать, какие локальные свойства текущей сессии переносятся в новую. Само по себе, без
LOCALи без списка свойств, на поведение оператора не влияет. -
LOCALКлючевое слово. Если указывается после
NESTED, в новой сессии будут видны изменения всех локальных свойств. -
propertyId1, ..., propertyIdNНепустой список локальных свойств, указываемый после
NESTEDв круглых скобках, изменения которых будут видны в новой сессии. Каждый элемент списка должен являться идентификатором свойства. -
CLASSESОпциональное ключевое слово. Если указывается после
NESTEDи необязательного селектора локальных свойств, в новую сессию помимо тех локальных свойств, которые покрыл селектор, также переносятся изменения классов существующих объектов (и объекты, созданные в текущей сессии). -
SINGLEОпциональное ключевое слово. Если
NEWSESSIONсам вызывается внутри транзакции применения, этот флаг распространяется на внутреннее действие: изменения хранимых свойств, используемых им, записываются в базу инкрементально по ходу транзакции, а не одним пакетом в конце применения. -
actionКонтекстно-зависимый оператор-действие, описывающий действие, которое должно быть выполнено в новой сессии.
Примеры
testNewSession () {
NEWSESSION {
NEW c = Currency {
name(c) <- 'USD';
code(c) <- 866;
}
APPLY;
}
// здесь новый объект класса Currency уже в базе данных
LOCAL local = BPSTRING[10] (Currency);
local(Currency c) <- 'Local';
NEWSESSION {
MESSAGE (GROUP SUM 1 IF local(Currency c) == 'Local'); // возвратит NULL
}
NEWSESSION NESTED (local[Currency]) {
// возвратит кол-во объектов класса Currency
MESSAGE (GROUP SUM 1 IF local(Currency c) == 'Local');
}
NEWSESSION {
NEW s = Sku {
id(s) <- 1234;
name(s) <- 'New Sku';
SHOW sku OBJECTS s = s;
}
}
}
// переносим в новую сессию созданный объект вместе с локальным свойством selected
selected = DATA LOCAL BOOLEAN (Sku);
markSelected () {
NEW s = Sku;
selected(s) <- TRUE;
NEWSESSION NESTED (selected[Sku]) CLASSES {
// здесь видны и созданный Sku, и selected[Sku]
MESSAGE (GROUP SUM 1 IF selected(Sku s));
}
}
// привязываем новую сессию к конкретной форме
showOnOrders () {
NEWSESSION FORMS orders {
SHOW orders;
}
}
// запускаем действие в свежем SQL-соединении
backgroundJob () {
NEWSESSION NEWSQL {
APPLY;
}
}
// SINGLE имеет смысл только когда NEWSESSION сам вызывается внутри транзакции применения
recalc () {
APPLY {
NEWSESSION SINGLE {
// изменения здесь записываются в базу инкрементально по ходу внешнего apply
id(Sku s) <- (GROUP MAX id(Sku ss)) (+) 1;
}
}
}