malykh
#
16 дек 2006
|
Вопрос не понял, но скажу, что полагаться на алгоритм генерации и назначения id нельзя. Какой назначен объекту - такой назначен. Гарантируется лишь доступность объекта по id .
Подробнее про такие ключи (но в приложении к БД).
|
Sammy
#
21 дек 2006
|
ок, спасибо
|
Sammy
#
1 мар 2013
|
как получить все объекты указанного класса из bdb?
делаю так:
def main* = {
fix cfg = SimpleConfig((%FirstClass, %SecondClass))
fix db = cfg.open("/home/sammy/bdb")
work(db) as sa {
var obj1 = sa.new(%FirstClass) {title="First"}
var obj2 = sa.new(%FirstClass) {title="Second"}
}
work(db) as sb {
var obj3 = sb.new(%SecondClass) {title="Third"}
var obj4 = sb.new(%SecondClass) {title="Fourth"}
}
db.close()
}
получаю объекты:
work(db) as sa {
sa.all(%FirstClass).title.println()
}
выводится "object 19373033 of class libretto/storage/Work"
пробовал так:
work(db).all(%SecondClass).title.println() ,
но так выводятся только объекты последнего класса (если: work(db).all(%FirstClass).title.println() выводится пустота)
|
malykh
#
1 мар 2013
|
println() просто переводит строку. Для печати значения из контекста нужно использовать println($) :
sa.all(%FirstClass).title.println($)
А выводимое как object 19373033 of class libretto/storage/Work - это результат работы всей программы (а не вывод println ).
|
Sammy
#
15 дек 2006
|
почему-то, что бы я ни ставил в аргумент println , результат такой же
|
malykh
#
1 мар 2013
|
Значит не доходит до println (где-то пустота). Попробуйте добавлять в путь в разных местах:
sa.all(%FirstClass).println($).title.println($)
(println "пропускает" через себя контекст без изменения)
|
Алексей Быков
#
21 мар 2013
|
Пытаюсь добавить объект класса Ingridient классу Recipe:
def ingridFormProcess = {
fix id_ing = ("id_ing".params!)
fix id_ing_rec = ("id_ing_rec".params!)
fix name_ing? = ("name".params!)
fix value_ing? = ("value".params!)
fix type_ing? = ("type".params!)
work(base.db) as w.{
var ingridient = base.ingrid(id_ing.toInt)?{case _ => w.new(%Ingridient)}
ingridient.{name = name_ing; value = value_ing; type = type_ing}
control/recipeFormProcessIng(ingridient, id_ing_rec)
}
}
def recipeFormProcessIng(obj_ing, id)? = {
work(base.db) as w.{
var recipe = base.recipe(id.toInt)?{case _ => w.new(%Recipe)}
recipe.{fn = ""; instructions = ""; duration = ""; ingr = obj_ing}
var ingr = w.new(%Ingridient)
html.view/recipeForm(recipe, ingr)
}
}
вылазит вот такое
(JE 5.0.34) Lock expired. Locker 28473328 64_qtp27241660-52_Txn: waited for lock on database=configurationDatabse LockAddr:29343256 LSN=0x0/0x8677 type=READ grant=WAIT_NEW timeoutMillis=500 startTime=1363866743125 endTime=1363866743625
Owners: [<LockInfo locker="22033632 63_qtp27241660-52_Txn" type="WRITE"/>]
в чем проблема может быть?
|
Ирина Кустова
#
30 апр 2013
|
У нас возникает вопрос про авторизацию.
Как она правильно делается в Libretto?
У нас есть
"def sessionId: String - возвращает идентификатор сессии
def session - возвращает внешнее поле для чтения/изменения данных сессии. Ключом обязательно должен быть декларативный (определенный при помощи object) объект, который является экземпляром класса libretto/web/SessionKey . В качестве значений пока понимаются String, Int ."
1. Если надо сессию только на некоторое время, пока пользователь не закрыл браузер.
Нам же надо положить какую-то информацию о пользователе в сессию, а потом как-то её оттуда получать и обрабатывать по мере надобности?
то есть,
a) надо создать, например, object UserId extends SessionKey - Id пользователя класса SessionKey.
b) Добавить Id в сессию
def addIdToSession(uId) = {
session.{UserId to uId} //Объясните, пожалуйста, почему пишется to , а не UserId = uId например?
}
c)Написать функцию получения Id из сессии
def getUId = {
UserId.session!?("guest") //?() - обработчик пустоты, возвращает "guest", если UserId пуст (да?)
}
Примерно так или совсем по-другому?
2. Если надо информацию о деятельности пользователя (сессии) хранить даже если он браузер закрыл, ещё надо как-то (хэшировать и) складывать данные, которые лежат в сессии, в базу вместе с Id сессии, в куки писать Id этой сессии, и потом Id сессии из куков будет читаться, и данные из сессии можно будет получить? Если так, то как будет выглядеть восстановление сессии? Чем писать информцию в куки?
|
Vladimir
#
6 мая 2013
|
Читайте выжимку с форума:
https://docs.google.com/document/d/1KNrSSUs9o1V3ooOe6N3wCZBnX_c3VH90i6bTYQveMvc/edit
Там есть про работу с сессией.
def sessionPut(key: SessionKey, value) = session.{ key to value }
def sessionGet(key: SessionKey)? = key.session!
В прикрепленном файле реализован простейший способ авторизации через выделенный объект, который является ключом в сессии.
Были трудности с удалением ключа из сессии.
Не работает
sessionPut(KEY, ())
Работает только
session.{key to ()}
Хотя по идее с точки зрения API варианты идентичны.
Для А.А. Малых будет интересно: cловил стабильную багу, известную как NoSuchElement при использовании следующей конструкции:
session.key--
Стабильна и для последней обновленной версии. Для экономии времени в контроллере надо раскомментировать строчку помеченную //constant error
|
Ирина Кустова
#
15 мая 2013
|
Кривая не оптимизированная библиотека для дат.
def main* = {
getMsLocal(jMs,9) as dt.println(<<%{formatDate(getDate(dt),"dd.mm.yyyy")} %{formatTime(getTime(dt),"hh:mm:ss:msms")}>>!)
}
|
Vladimir
#
16 мая
|
Были трудности с удалением ключа из сессии.
Работает только
session.{key to ()}
Поправка:
Данный вариант не удаляет ключ из сессии, а задает его значение равным пустому множеству. Для удаления ключа используется функция
session.removeKeys(key)
можно указать несколько ключей
session.removeKeys(1..10)
или
session.removeKeys((key1, key2))
|
Ирина Кустова
#
14 дек 2006
|
Немного исправлена
Кривая не оптимизированная библиотека для дат.
def main* = {
getMsLocal(jMs,9) as dt.println(<<%{formatDate(getDate(dt),"dd.mm.yyyy")} %{formatTime(getTime(dt),"hh:mm:ss:msms")}>>!)
} .
|
Ирина Кустова
#
11 дек 2006
|
Скажите пожалуйста, кто-то делает библиотеку загрузки файлов? Если нет, то что потребуется, чтобы сделать её в Libretto?
|
malykh
#
24 авг 2013
|
Скажите пожалуйста, кто-то делает библиотеку загрузки файлов? Если нет, то что потребуется, чтобы сделать её в Libretto?
Вспомогательные функции есть.
Доступ до тела запроса. Читаем, парсим как multipart/form-data. Опционально или держим в памяти, или сохраняем в файл (временный или по указанному пути). Работа с файлами: 1, 2, 3.
|
Ваш ответ:
|
|
Чтобы написать сообщение, необходимо войти или зарегистрироваться