
Макс
01.08.2016
07:51:03
в деструктор. и зачем scope(exit)?

Dmitry
01.08.2016
07:51:19
чтобы соединение закрывать
просто я не хочу создавать отдельный метод:
void finalize() // finalization of connection
{
conn.close();
}
и потом вызывать его.

Макс
01.08.2016
07:52:14
в деструкторе это и сделай.
~this() { conn.close(); }

Google

Макс
01.08.2016
07:52:59
Либо в какой-то другой момент закрой, после того как conn точно больше не нужен. Тут тебе виднее.

Dmitry
01.08.2016
07:54:26
ну я думаю самое логичное в деструкторе. на сколько я понимаю себе модель соединения

Макс
01.08.2016
07:55:56
если ты создаёшь в конструкторе и удаляешь в деструкторе, то conn у тебя будет соединён ровно столько, сколько жив GeoDataBase. А я подозреваю, что это тебе и надо

Dmitry
01.08.2016
08:00:41
void dbdata(HTTPServerRequest req, HTTPServerResponse res) // process rasters and
{
GeoDataBase gdb = new GeoDataBase(config); //
}
Получается что экземпляр gdb живет ровно столько сколько функция dbdata
верно?
Просто я думаю над тем как потом пул подключений создать с БД

Макс
01.08.2016
08:06:13
Это внутри конструкторов scope(exit) для полей не то, для этого там деструктор

Oleg
01.08.2016
08:07:08
в dbdata можно написать scope(exit) destroy(gdb)

Dmitry
01.08.2016
08:07:48
это повысить шансы на утилизацию gdb при первом проходе?
Олег, а не мог бы ответить на вот этот вопрос:
Не приводит ли такой код к лишней аллокации памяти?
jsonfromstruct = jsonfromstruct.replaceLast(,,``);

qwe
01.08.2016
08:28:25
@DmitryBubnenkov могу предложить посмотреть адрес переменной до и после проведения операции. Если разный, следовательно новая переменная — копия.
А старая удалится GC, но как написано выше, он может прийти сколь угодно позже

Dmitry
01.08.2016
08:29:20
тоесть вариант явной пометки это реально хорошая практика?

Google

Dmitry
01.08.2016
08:29:39
И как адреса переменных смотреть? Можно как-то без дебаггера это сделать?

qwe
01.08.2016
08:29:49
writeln(&var);

Dmitry
01.08.2016
08:32:52
о пасибо.
После добавления:
scope(exit) destroy(gdb)
в момент прерывания приложения по ctrl + с
выпало:
ption.InvalidMemoryOperationError@src\core\exception.d(693): Invalid memory operation
оно может быть связано?
нет. поправка. ошибка вылезает вот тут:
~this()
{
conn.close(); // finalization connection
}
если в деструкторе вызывать финализацию коннекта
если не вызывать то ctrl + с
обрабатывается нормально

qwe
01.08.2016
08:37:52
Так может надо обрабатывать что-то вроде INTERRUPT
Или уже есть обработчик?

Dmitry
01.08.2016
08:38:45
неа, я даже не знаю что это такое и как обрабатывать

qwe
01.08.2016
08:40:19
я предлагаю 2 варианта поискать как обрабатывать сигнал INTERRUPT. Или делать проверочку объекта conn

Dmitry
01.08.2016
08:40:32
какую проверку?

qwe
01.08.2016
08:41:00
ну как? if(conn !is null)

Dmitry
01.08.2016
08:41:24
если коннект существует?

qwe
01.08.2016
08:41:49
то можно сделать conn.close();

Dmitry
01.08.2016
08:42:38
а так ошибка из-за чего вылезает?
пытаюсь закрыть то что уже закрыто?

qwe
01.08.2016
08:43:11
полагаю, что пытаетесь обратить к тому, чего уже нет

Dmitry
01.08.2016
08:43:23
http://www.everfall.com/paste/id.php?5qgjkf1z9f01 вот мой код
в каком моменте коннект может закрывать то?

qwe
01.08.2016
08:44:22
да в том же, просто я бы проверочку поставил на существования объекта

Dmitry
01.08.2016
08:45:17
та же байда

Google

qwe
01.08.2016
08:45:55
тогда надо дебажить(

Dmitry
01.08.2016
09:37:23
я тут подумал — все же закрывать коннект в деструкторе это не праивльно, щас еще раз почитаю что мне там на форуме отписали
"Never run important finalization in a class destructor! The GC is not obliged to run the destructors, so you may end up with your objects destroyed but the connections still open. For this kind of important things, you have to do them manually."

Pavel
01.08.2016
09:39:00
+1

Dmitry
01.08.2016
09:40:55
получается что деструктор может убить открытое соединение?

Макс
01.08.2016
10:13:49

Pavel
01.08.2016
10:33:52
Мне всегда деструкторы виделись непонятным магическим местом, которое исполняется непонятно когда
Что по сути так и есть :) Ну впринципе закрыть коннект надо явно в явно вызываемом методе, а вот финализировать что-то там можно ив деструкторе

Макс
01.08.2016
11:21:30
Вообще странно. Код написан, а будет ли он выполняться, никто не знает. Чревато не только незакрытыми соединениями, но и несброшенными в файлы буферами, что ещё серьёзнее. Неужто правда всё так плохо?

Dmitry
01.08.2016
11:34:59
Макс, это вот тут ответ http://forum.dlang.org/thread/vkuvpzbczsyglfnnmygi@forum.dlang.org
Хотя там пишут люди, которые думают, что коннект в деструкторе закрывать надо: "but closing the connection to the DB is up to you. So do that in the destructor"
Я никак в толк не могу взять. деструктор в какой момент вызывается? Когда функция до конца доходит?

Макс
01.08.2016
11:44:05
деструктор к функциям точно отношения не имеет, он с жизнью объекта связан

Dmitry
01.08.2016
11:44:52
ну тобишь объекта

Pavel
01.08.2016
13:00:07
То есть если объект в процессе живет неделю, то и деструктор может неделю не выполняться, пока объект не почистит кто-то
Instead you use a function, destroy(object), which calls the destructor where you can free resources that are not GC memory. The destructor will be caused again during GC collection of the objects own memory. This is explained in "The D Programming Language".
http://stackoverflow.com/questions/4589114/when-to-delete-in-d
То есть если хочешь чтобы все ресурсы у объекта освободились прямо сейчас, сделай destroy()

Dmitry
01.08.2016
13:12:59
но закрытие коннекта это же не освобождение объекта

Google

Pavel
01.08.2016
13:21:01
Ну да, поэтому и не надо закрытие конекта пихать в деструктор

Dmitry
01.08.2016
13:36:15
А вообще как JSON можно склеивать?
~ подходит?
Json j1 = Json.emptyObject;
j1["aa"] = 1; // { "aa": 1 }
Json j2 = Json.emptyObject;
j1["bb"] = 2; // { "bb": 2 }
Нужно:
{ "aa": 1 }, { "bb": 2 }
просто сейчас сделал через значек ~ но на консоль только первый вывелся, щас конечно перепроверю все, но...

Pavel
01.08.2016
13:39:45
{ "aa": 1 }, { "bb": 2 } - это разве корректный json ?
Тогда уж [{ "aa": 1 }, { "bb": 2 }]
засунь два объекта в массив и попробуй это сконвертировать в json

Dmitry
01.08.2016
13:41:41
а в массив как засунуть, кроме как добивки руками [ и ] и потом парсинга идей нет

Oleg
01.08.2016
16:26:34

Admin
ERROR: S client not available

Макс
01.08.2016
17:19:58

Dmitry
02.08.2016
07:17:37
Так, а как лучше всего проверить, прилетел ли JSON или было просто обращение к урлу.
Просто ситуация такая. Есть урл /data
на него json данные кидаются. если просто к нему обратиться, то ошибка 500 вылетает. Думаю как получше обработать ее
такой вариант норм?
if (result.type == Json.Type.undefined)
просто у меня в этот блок не заходит:
значи что-то не то
можно как-то проверить навроде:
if (req.json is Json)
?
В http://vibed.org/api/vibe.http.server/HTTPServerRequest я не вижу методов которые позволили бы понять, что именно прилетело

qwe
02.08.2016
17:18:58
@DmitryBubnenkov так а через writeln нельзя посмотреть тело запроса?

Google

Dmitry
02.08.2016
17:24:38
Не помню точно, но вроде пустая строка была

qwe
02.08.2016
17:30:10
Смотри, я с vibe.d не работал, но немного разбираюсь в HTTP и в Django. В запросе задаются заголовки, среди которых указывает тип данных запроса. Заголовок называется Content-Type. И если в теле json, то у этого заголовка должно быть значение application/json. Если в vibe.d нет метода для определения типа данных запроса, то стоит поискать метод для получения HTTP заголовков. Он-то уж наверняка должен быть.

Pavel
02.08.2016
17:37:40
+1 проверяй по Content-Type
http://vibed.org/api/vibe.http.common/HTTPRequest.contentType

qwe
02.08.2016
17:38:08
?

Oleg
02.08.2016
18:45:32
тут мелькала либа какая-то для json, в чём её соль?
вроде stdx.json
std.json как std.xml чем-то плох и нуждается в замене?

qwe
02.08.2016
18:49:13
где-то видел, что std.json долгий

Макс
02.08.2016
18:50:08
У vibe.d вроде свой JSON, но я не знаю, почему

0x9d8e
02.08.2016
18:50:34
Ну вроде так с любой сериализацией "на все случаи жизни".

Макс
02.08.2016
18:50:44
У dub тоже свой, но там, кажется, тупо ради висячих запятых :)

Oleg
02.08.2016
18:51:05
разве у dub свой, а не из vibe.d?
http://code.dlang.org/packages/std_data_json
кандидат в std из vibe.d

Макс
02.08.2016
18:54:24
разве у dub свой, а не из vibe.d?
Ну не знаю, лежит в их исходниках: https://github.com/dlang/dub/blob/master/source/dub/internal/vibecompat/data/json.d
Но я глубоко не глядел на самом деле.
Ааааа! Любопытно!
version (Have_vibe_d) public import vibe.data.json;
else:

Oleg
02.08.2016
18:58:24
хм

Макс
02.08.2016
19:00:29
Значит ли это, что vibe.d тоже толерантен к висячим запятым, как и dub.json?
Или это значит, что если собирать dub с Have_vibe_d (а когда и для чего так собирают, кстати?), то он перестанет быть толерантным?
Или это значит, что я мало чего вообще понимаю?
Наверное, это просто скопированный кусок vibe.d в дабе.

Oleg
02.08.2016
19:05:54
а кто-нибудь встречал реализацию сериализации/десериализации без JSONValue?
чтобы, например, mixin'ом строилась функция сериализации в json-строку
и чтобы парсинг строки сразу в структуру шёл

qwe
03.08.2016
09:19:22
то есть без шаблонов?