These are chat archives for synrc/n2o

17th
Oct 2015
Rado Kozmer
@rkozmer
Oct 17 2015 12:56
Hi! I try to implement a type-ahead in the #input's onkeypress. I have an appropriate api_event and I wire the #api but no JavaScript function is generated in the {{code}} of the document. Do I miss something? Thank you.
Namdak Tonpa
@5HT
Oct 17 2015 12:57
better use {client,_} protocol, #api actions is something nitrogen style
but #api it should work
we don't generate {{code}} in template like in nitrogen
we send the API binding through WebSocket
-module(action_api).
-include_lib("nitro/include/nitro.hrl").
-compile(export_all).

render_action(Record) ->
    Name = Record#api.name,
    Data = "utf8_toByteArray(JSON.stringify(data))",
    PostbackScript = wf_event:new(Name, "document", Record#api.delegate, api_event, Data, []),
    nitro:f("~s = function(data) {",  [Name]) ++ binary_to_list(PostbackScript) ++ "};".
here is how #api renders
so it binds in root of the document
maybe utf8_toByteArray usage here is broken by latest changes of the utf8 rewriting
but it seems ok
Katerina Shananina
@serpentk
Oct 17 2015 15:33

Доброе утро!
Пытаюсь постичь kvs; что-то пока не выходит.
Допустим, я хочу создать свою новую таблицу.
В своём приложении добавляю два файла, kvs_custommm.erl:

-module(kvs_custommm).
-compile(export_all).

-include_lib("kvs/include/kvs.hrl").
-include_lib("kvs/include/metainfo.hrl").
-include("custommm.hrl").


metainfo() ->
    #schema{name=kvs, tables=[
         #table{name = custommm, container = true,
                fields = record_info(fields, custommm), keys=[xxx, yyy, zzz]}]}.

и custommm.hrl :

-ifndef(CUSTOMMM_HRL).
-define(CUSTOMMM_HRL, true).
-include_lib("kvs/include/kvs.hrl").

-record(custommm, { ?ITERATOR(feed, true), 
                   xxx, yyy, zzz}).
-endif.

В результате имею:

3> rr("apps/sample/src/custommm.hrl").
[container,custommm,id_seq,interval,iterator,kvs,log,
 operation]
4> kvs:all(custommm).                 
[]
5> kvs:add(#custommm{xxx=2, yyy=2, zzz=2}).
{error,just_added}

Что-то я явно делаю не так, но что?
Я точно чего-то важного не понимаю про контейнеры и итераторы.

Rado Kozmer
@rkozmer
Oct 17 2015 17:27
@5HT The api_event works now. Instead of document.search(...) I have to call search(...) in JavaScript. Still there is a problem with the parameter. I call search({'query':'test'}); but get n2o_nitrogen:Catch: error:undef [{n2o_json,decode,["{\"query\":\"test\"}"],undefined},.
Do I have to unescape the param or is there any built in mechanism in the N2O? Thank you.
Namdak Tonpa
@5HT
Oct 17 2015 17:40
@serpentk вполне возможно что ты два раза вызвала эту функцию
@rkozmer I couldn't find any n2o_json neither in nitro nor in n2o
which version of n2o do you use?
Namdak Tonpa
@5HT
Oct 17 2015 17:47
This message was deleted
Namdak Tonpa
@5HT
Oct 17 2015 17:56
у меня например все работает:
(mac@127.0.0.1)4> kvs:all(custommm).
[]
(mac@127.0.0.1)6> rr(kvs_custommm).
[column,container,custommm,id_seq,interval,iterator,kvs,log,
 operation,query,schema,table]
(mac@127.0.0.1)7>  kvs:add(#custommm{xxx=2, yyy=2, zzz=2}).
{ok,#custommm{id = undefined,version = undefined,
              container = feed,feed_id = custommm,prev = undefined,
              next = undefined,feeds = [],guard = true,etc = undefined,
              xxx = 2,yyy = 2,zzz = 2}}
(mac@127.0.0.1)8>  kvs:add(#custommm{xxx=2, yyy=2, zzz=2}).
{error,exist}
добавил твой файл:
-module(kvs_custommm).
-compile(export_all).

-include_lib("kvs/include/kvs.hrl").
-include_lib("kvs/include/metainfo.hrl").

-record(custommm, { ?ITERATOR(feed, true),
                   xxx, yyy, zzz}).

metainfo() ->
    #schema{name=kvs, tables=[
         #table{name = custommm, container = true,
                fields = record_info(fields, custommm), keys=[xxx, yyy, zzz]}]}.
проблема похоже в том, что у тебя в keys нет id
Namdak Tonpa
@5HT
Oct 17 2015 18:04
> kvs:index(custommm,yyy,1).
[#custommm{id = 3,version = undefined,container = feed,
           feed_id = custommm,prev = 2,next = undefined,feeds = [],
           guard = true,etc = undefined,xxx = 2,yyy = 1,zzz = 3},
 #custommm{id = 2,version = undefined,container = feed,
           feed_id = custommm,prev = 1,next = 3,feeds = [],
           guard = true,etc = undefined,xxx = 2,yyy = 1,zzz = 2}]
(mac@127.0.0.1)17> kvs:add(#custommm{id=3,xxx=2, yyy=1, zzz=3}).
перед этим:
> kvs:add(#custommm{id=3,xxx=2, yyy=1, zzz=3}).
{ok,#custommm{id = 3,version = undefined,container = feed,
              feed_id = custommm,prev = 2,next = undefined,feeds = [],
              guard = true,etc = undefined,xxx = 2,yyy = 1,zzz = 3}}
> kvs:add(#custommm{id=2,xxx=2, yyy=1, zzz=2}).
{ok,#custommm{id = 2,version = undefined,container = feed,
              feed_id = custommm,prev = 1,next = undefined,feeds = [],
              guard = true,etc = undefined,xxx = 2,yyy = 1,zzz = 2}}
все работает
только id вводи
id можешь выставлять например как id={Xxx,Yyy,Zzz}
Rado Kozmer
@rkozmer
Oct 17 2015 19:20
@5HT Thanks! It works now.
Katerina Shananina
@serpentk
Oct 17 2015 21:28
Спасибо!
Дропнула для чистоты экперимента базу, дописала в keys id и вроде всё стало добавляться.
Интересно, а keys (в metainfo) какую роль играют? В примере с animal по ссылке http://e4sw.tumblr.com/post/107943334340/n2o-level-1-apps-kvs key вроде вообще нет.
Namdak Tonpa
@5HT
Oct 17 2015 21:30
они, в случае с бекендами, которые поддерживают секондари индексы (как например leveldb или mnesia или mongodb), автоматически при старте базы инициализируют эти индексы для таблиц. типа просто вынесено, чтобы кратко и универсально все индексы во всех базах сразу описывать.