From saulo2 at gmail.com Fri Jul 8 10:38:40 2016 From: saulo2 at gmail.com (Saulo Araujo) Date: Fri, 8 Jul 2016 11:38:40 -0300 Subject: [Ur] Runtime error Message-ID: Hi, I am getting the error "Error triggers unlimited retry: Couldn't allocate new heap chunk contiguously; increasing size to 512" when I execute the following program open List table user_table: {ID: int, NAME: string} PRIMARY KEY ID table project_table: {ID: int, NAME: string, DESCRIPTION: string, USER_ID: int} PRIMARY KEY ID, CONSTRAINT USER_ID FOREIGN KEY USER_ID REFERENCES user_table(ID) table task_table: {ID: int, NAME: string, DESCRIPTION: string, USER_ID: int} PRIMARY KEY ID, CONSTRAINT USER_ID FOREIGN KEY USER_ID REFERENCES user_table(ID) table project_task_table: {PROJECT_ID: int, TASK_ID: int} PRIMARY KEY (PROJECT_ID, TASK_ID), CONSTRAINT PROJECT_ID FOREIGN KEY PROJECT_ID REFERENCES project_table (ID), CONSTRAINT TASK_ID FOREIGN KEY TASK_ID REFERENCES task_table (ID) table entry_table: {PROJECT_ID: int, TASK_ID: int, DATE: time, TIME: int} PRIMARY KEY (PROJECT_ID, TASK_ID, DATE) CONSTRAINT PROJECT_ID FOREIGN KEY PROJECT_ID REFERENCES project_table (ID), CONSTRAINT TASK_ID FOREIGN KEY TASK_ID REFERENCES task_table (ID) datatype entry_cell = EntryCell of int * float datatype task_row = TaskRow of int * string * list entry_cell datatype project_row = ProjectRow of int * string * list task_row datatype time_sheet = TimeSheet of list project_row fun timeSheet userId = projectIdTaskRowsPairs <- query (SELECT P.ID AS PROJECT_ID, T.ID AS ID, T.NAME AS NAME FROM project_table AS P INNER JOIN project_task_table AS PT ON PT.PROJECT_ID = P.ID INNER JOIN task_table AS T ON T.ID = PT.TASK_ID WHERE P.USER_ID = {[userId]} ORDER BY T.NAME) (fn r projectIdTaskRowsPairs => let val projectIdTaskRowsPair = (r.PROJECT_ID, TaskRow (r.ID, r.NAME, [])) in return (projectIdTaskRowsPair :: projectIdTaskRowsPairs) end) []; projectRows <- query (SELECT P.ID AS ID, P.NAME AS NAME FROM project_table AS P WHERE P.USER_ID = {[userId]} ORDER BY P.NAME) (fn r projectRows => let val projectIdTaskRowsPairs = filter (fn (projectId, _) => projectId = r.ID) projectIdTaskRowsPairs val taskRows = mp (fn (_, taskRow) => taskRow) projectIdTaskRowsPairs val projectRow = ProjectRow (r.ID, r.NAME, taskRows) in return (projectRow :: projectRows) end) []; return (TimeSheet projectRows) fun main () = timeSheet <- timeSheet 1; return {case timeSheet of TimeSheet (projectRows) => mapX (fn projectRow => case projectRow of ProjectRow (projectId, projectName, taskRows) => mapX (fn taskRow => case taskRow of TaskRow (taskId, taskName, _) => ) taskRows) projectRows}
{[projectId]} {[projectName]} {[taskId]} {[taskName]}
Does anyone knows how to circumvent it? Is it possible to configure the size of the heap? Sincerely, Saulo -------------- next part -------------- An HTML attachment was scrubbed... URL: From saulo2 at gmail.com Fri Jul 8 11:13:13 2016 From: saulo2 at gmail.com (Saulo Araujo) Date: Fri, 8 Jul 2016 12:13:13 -0300 Subject: [Ur] Runtime error In-Reply-To: References: Message-ID: I just found out that the messages "Error triggers unlimited retry: Couldn't allocate new heap chunk contiguously; increasing size to..." are not error messages, but informative ones. Also, the Ur/Web manual talks about the minHeap setting. After setting it to 1024 in my project file, the messages vanished, as expected. Unfortunately, my page is blank. If I remove the inner mapX like below, I can see the projects stored in the database. Does anyone know what I am doing wrong? Is it possible to nest mapX like I did? {case timeSheet of TimeSheet (projectRows) => mapX (fn projectRow => case projectRow of ProjectRow (projectId, projectName, taskRows) => {[projectId]} {[projectName]} (* ... *) Sincerely, Saulo On Fri, Jul 8, 2016 at 11:38 AM, Saulo Araujo wrote: > Hi, > > I am getting the error > > "Error triggers unlimited retry: Couldn't allocate new heap chunk > contiguously; increasing size to 512" > > when I execute the following program > > open List > > table user_table: {ID: int, NAME: string} PRIMARY KEY ID > > table project_table: {ID: int, NAME: string, DESCRIPTION: string, USER_ID: > int} PRIMARY KEY ID, > CONSTRAINT USER_ID FOREIGN KEY USER_ID REFERENCES user_table(ID) > > table task_table: {ID: int, NAME: string, DESCRIPTION: string, USER_ID: > int} PRIMARY KEY ID, > CONSTRAINT USER_ID FOREIGN KEY USER_ID REFERENCES user_table(ID) > > table project_task_table: {PROJECT_ID: int, TASK_ID: int} PRIMARY KEY > (PROJECT_ID, TASK_ID), > CONSTRAINT PROJECT_ID FOREIGN KEY PROJECT_ID REFERENCES > project_table (ID), > CONSTRAINT TASK_ID FOREIGN KEY TASK_ID REFERENCES task_table (ID) > > table entry_table: {PROJECT_ID: int, TASK_ID: int, DATE: time, TIME: int} > PRIMARY KEY (PROJECT_ID, TASK_ID, DATE) > CONSTRAINT PROJECT_ID FOREIGN KEY PROJECT_ID REFERENCES > project_table (ID), > CONSTRAINT TASK_ID FOREIGN KEY TASK_ID REFERENCES task_table (ID) > > datatype entry_cell = EntryCell of int * float > > datatype task_row = TaskRow of int * string * list entry_cell > > datatype project_row = ProjectRow of int * string * list task_row > > datatype time_sheet = TimeSheet of list project_row > > fun timeSheet userId = > projectIdTaskRowsPairs <- query (SELECT P.ID AS PROJECT_ID, T.ID AS > ID, T.NAME AS NAME > FROM project_table AS P > INNER JOIN project_task_table AS PT ON PT.PROJECT_ID = P.ID > INNER JOIN task_table AS T ON T.ID = PT.TASK_ID > WHERE P.USER_ID = {[userId]} > ORDER BY T.NAME) > (fn r projectIdTaskRowsPairs => > let val projectIdTaskRowsPair = (r.PROJECT_ID, TaskRow (r.ID, r.NAME, [])) > in > return (projectIdTaskRowsPair :: projectIdTaskRowsPairs) > end) > []; > > projectRows <- query (SELECT P.ID AS ID, P.NAME AS NAME > FROM project_table AS P > WHERE P.USER_ID = {[userId]} > ORDER BY P.NAME) > (fn r projectRows => > let val projectIdTaskRowsPairs = filter (fn (projectId, _) => > projectId = r.ID) projectIdTaskRowsPairs > val taskRows = mp (fn (_, taskRow) => taskRow) projectIdTaskRowsPairs > val projectRow = ProjectRow (r.ID, r.NAME, taskRows) > in > return (projectRow :: projectRows) > end) > []; > > return (TimeSheet projectRows) > > fun main () = > timeSheet <- timeSheet 1; > > return > > > > {case timeSheet of > TimeSheet (projectRows) => > mapX (fn projectRow => > case projectRow of > ProjectRow (projectId, projectName, taskRows) => > mapX (fn taskRow => > case taskRow of > TaskRow (taskId, taskName, _) => > > > > > > > > ) > taskRows) > projectRows} >
{[projectId]}{[projectName]}{[taskId]}{[taskName]}
> >
> > Does anyone knows how to circumvent it? Is it possible to configure the > size of the heap? > > Sincerely, > Saulo > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From ziv at mit.edu Fri Jul 8 13:44:40 2016 From: ziv at mit.edu (Ziv Scully) Date: Fri, 8 Jul 2016 13:44:40 -0400 Subject: [Ur] Runtime error In-Reply-To: References: Message-ID: Hi Saulo, Exactly right about the heap. I'd be very surprised if the page blankness is because of heap-related issues. Nested [mapX]s are definitely okay. Maybe it's just that all of the [taskRows] lists are empty for some reason? (I haven't carefully read your queries.) Because all your xml is generated in that innermost loop, if that was the case, every innermost [mapX] would map over 0 things and you'd get no output. Perhaps try something like: fun main () = timeSheet <- timeSheet 1; return {case timeSheet of TimeSheet (projectRows) => mapX (fn projectRow => case projectRow of ProjectRow (projectId, projectName, taskRows) => (**** begin new stuff ****) { (**** end new stuff ****) mapX (fn taskRow => case taskRow of TaskRow (taskId, taskName, _) => ) taskRows) (**** begin new stuff ****) } (**** end new stuff ****) projectRows}
{[projectId]} {[projectName]}
{[projectId]} {[projectName]} {[taskId]} {[taskName]}
On Fri, Jul 8, 2016 at 11:13 AM, Saulo Araujo wrote: > I just found out that the messages "Error triggers unlimited retry: > Couldn't allocate new heap chunk contiguously; increasing size to..." are > not error messages, but informative ones. Also, the Ur/Web manual talks > about the minHeap setting. After setting it to 1024 in my project file, the > messages vanished, as expected. Unfortunately, my page is blank. If I > remove the inner mapX like below, I can see the projects stored in the > database. Does anyone know what I am doing wrong? Is it possible to nest > mapX like I did? > > {case timeSheet of > TimeSheet (projectRows) => > mapX (fn projectRow => > case projectRow of > ProjectRow (projectId, projectName, taskRows) => > > > {[projectId]} > {[projectName]} (* ... *) > > Sincerely, > Saulo > > > > On Fri, Jul 8, 2016 at 11:38 AM, Saulo Araujo wrote: > >> Hi, >> >> I am getting the error >> >> "Error triggers unlimited retry: Couldn't allocate new heap chunk >> contiguously; increasing size to 512" >> >> when I execute the following program >> >> open List >> >> table user_table: {ID: int, NAME: string} PRIMARY KEY ID >> >> table project_table: {ID: int, NAME: string, DESCRIPTION: string, >> USER_ID: int} PRIMARY KEY ID, >> CONSTRAINT USER_ID FOREIGN KEY USER_ID REFERENCES user_table(ID) >> >> table task_table: {ID: int, NAME: string, DESCRIPTION: string, USER_ID: >> int} PRIMARY KEY ID, >> CONSTRAINT USER_ID FOREIGN KEY USER_ID REFERENCES user_table(ID) >> >> table project_task_table: {PROJECT_ID: int, TASK_ID: int} PRIMARY KEY >> (PROJECT_ID, TASK_ID), >> CONSTRAINT PROJECT_ID FOREIGN KEY PROJECT_ID REFERENCES >> project_table (ID), >> CONSTRAINT TASK_ID FOREIGN KEY TASK_ID REFERENCES task_table (ID) >> >> table entry_table: {PROJECT_ID: int, TASK_ID: int, DATE: time, TIME: int} >> PRIMARY KEY (PROJECT_ID, TASK_ID, DATE) >> CONSTRAINT PROJECT_ID FOREIGN KEY PROJECT_ID REFERENCES >> project_table (ID), >> CONSTRAINT TASK_ID FOREIGN KEY TASK_ID REFERENCES task_table (ID) >> >> datatype entry_cell = EntryCell of int * float >> >> datatype task_row = TaskRow of int * string * list entry_cell >> >> datatype project_row = ProjectRow of int * string * list task_row >> >> datatype time_sheet = TimeSheet of list project_row >> >> fun timeSheet userId = >> projectIdTaskRowsPairs <- query (SELECT P.ID AS PROJECT_ID, T.ID AS >> ID, T.NAME AS NAME >> FROM project_table AS P >> INNER JOIN project_task_table AS PT ON PT.PROJECT_ID = P.ID >> INNER JOIN task_table AS T ON T.ID = PT.TASK_ID >> WHERE P.USER_ID = {[userId]} >> ORDER BY T.NAME) >> (fn r projectIdTaskRowsPairs => >> let val projectIdTaskRowsPair = (r.PROJECT_ID, TaskRow (r.ID, r.NAME, >> [])) in >> return (projectIdTaskRowsPair :: projectIdTaskRowsPairs) >> end) >> []; >> >> projectRows <- query (SELECT P.ID AS ID, P.NAME AS NAME >> FROM project_table AS P >> WHERE P.USER_ID = {[userId]} >> ORDER BY P.NAME) >> (fn r projectRows => >> let val projectIdTaskRowsPairs = filter (fn (projectId, _) => >> projectId = r.ID) projectIdTaskRowsPairs >> val taskRows = mp (fn (_, taskRow) => taskRow) projectIdTaskRowsPairs >> val projectRow = ProjectRow (r.ID, r.NAME, taskRows) >> in >> return (projectRow :: projectRows) >> end) >> []; >> >> return (TimeSheet projectRows) >> >> fun main () = >> timeSheet <- timeSheet 1; >> >> return >> >> >> >> {case timeSheet of >> TimeSheet (projectRows) => >> mapX (fn projectRow => >> case projectRow of >> ProjectRow (projectId, projectName, taskRows) => >> mapX (fn taskRow => >> case taskRow of >> TaskRow (taskId, taskName, _) => >> >> >> >> >> >> >> >> ) >> taskRows) >> projectRows} >>
{[projectId]}{[projectName]}{[taskId]}{[taskName]}
>> >>
>> >> Does anyone knows how to circumvent it? Is it possible to configure the >> size of the heap? >> >> Sincerely, >> Saulo >> >> > > _______________________________________________ > Ur mailing list > Ur at impredicative.com > http://www.impredicative.com/cgi-bin/mailman/listinfo/ur > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From saulo2 at gmail.com Fri Jul 8 14:05:49 2016 From: saulo2 at gmail.com (Saulo Araujo) Date: Fri, 8 Jul 2016 15:05:49 -0300 Subject: [Ur] Runtime error In-Reply-To: References: Message-ID: Hi Ziv, You are right! I am quite ashamed of not remembering to check the database state :) Thanks a lot for your help! Sincerely, Saulo On Fri, Jul 8, 2016 at 2:44 PM, Ziv Scully wrote: > Hi Saulo, > > Exactly right about the heap. I'd be very surprised if the page blankness > is because of heap-related issues. > > Nested [mapX]s are definitely okay. Maybe it's just that all of the > [taskRows] lists are empty for some reason? (I haven't carefully read your > queries.) Because all your xml is generated in that innermost loop, if that > was the case, every innermost [mapX] would map over 0 things and you'd get > no output. Perhaps try something like: > > fun main () = > timeSheet <- timeSheet 1; > return > > > > {case timeSheet of > TimeSheet (projectRows) => > mapX (fn projectRow => > case projectRow of > ProjectRow (projectId, projectName, taskRows) => > (**** begin new stuff ****) > > > > > > { > (**** end new stuff ****) > mapX (fn taskRow => > case taskRow of > TaskRow (taskId, taskName, _) => > > > > > > > > ) > taskRows) > (**** begin new stuff ****) > } > > (**** end new stuff ****) > projectRows} >
{[projectId]}{[projectName]}
{[projectId]}{[projectName]}{[taskId]}{[taskName]}
> >
> > > > On Fri, Jul 8, 2016 at 11:13 AM, Saulo Araujo wrote: > >> I just found out that the messages "Error triggers unlimited retry: >> Couldn't allocate new heap chunk contiguously; increasing size to..." are >> not error messages, but informative ones. Also, the Ur/Web manual talks >> about the minHeap setting. After setting it to 1024 in my project file, the >> messages vanished, as expected. Unfortunately, my page is blank. If I >> remove the inner mapX like below, I can see the projects stored in the >> database. Does anyone know what I am doing wrong? Is it possible to nest >> mapX like I did? >> >> {case timeSheet of >> TimeSheet (projectRows) => >> mapX (fn projectRow => >> case projectRow of >> ProjectRow (projectId, projectName, taskRows) => >> >> >> {[projectId]} >> {[projectName]} (* ... *) >> >> Sincerely, >> Saulo >> >> >> >> On Fri, Jul 8, 2016 at 11:38 AM, Saulo Araujo wrote: >> >>> Hi, >>> >>> I am getting the error >>> >>> "Error triggers unlimited retry: Couldn't allocate new heap chunk >>> contiguously; increasing size to 512" >>> >>> when I execute the following program >>> >>> open List >>> >>> table user_table: {ID: int, NAME: string} PRIMARY KEY ID >>> >>> table project_table: {ID: int, NAME: string, DESCRIPTION: string, >>> USER_ID: int} PRIMARY KEY ID, >>> CONSTRAINT USER_ID FOREIGN KEY USER_ID REFERENCES user_table(ID) >>> >>> table task_table: {ID: int, NAME: string, DESCRIPTION: string, USER_ID: >>> int} PRIMARY KEY ID, >>> CONSTRAINT USER_ID FOREIGN KEY USER_ID REFERENCES user_table(ID) >>> >>> table project_task_table: {PROJECT_ID: int, TASK_ID: int} PRIMARY KEY >>> (PROJECT_ID, TASK_ID), >>> CONSTRAINT PROJECT_ID FOREIGN KEY PROJECT_ID REFERENCES >>> project_table (ID), >>> CONSTRAINT TASK_ID FOREIGN KEY TASK_ID REFERENCES task_table (ID) >>> >>> table entry_table: {PROJECT_ID: int, TASK_ID: int, DATE: time, TIME: >>> int} PRIMARY KEY (PROJECT_ID, TASK_ID, DATE) >>> CONSTRAINT PROJECT_ID FOREIGN KEY PROJECT_ID REFERENCES >>> project_table (ID), >>> CONSTRAINT TASK_ID FOREIGN KEY TASK_ID REFERENCES task_table (ID) >>> >>> datatype entry_cell = EntryCell of int * float >>> >>> datatype task_row = TaskRow of int * string * list entry_cell >>> >>> datatype project_row = ProjectRow of int * string * list task_row >>> >>> datatype time_sheet = TimeSheet of list project_row >>> >>> fun timeSheet userId = >>> projectIdTaskRowsPairs <- query (SELECT P.ID AS PROJECT_ID, T.ID AS >>> ID, T.NAME AS NAME >>> FROM project_table AS P >>> INNER JOIN project_task_table AS PT ON PT.PROJECT_ID = P.ID >>> INNER JOIN task_table AS T ON T.ID = PT.TASK_ID >>> WHERE P.USER_ID = {[userId]} >>> ORDER BY T.NAME) >>> (fn r projectIdTaskRowsPairs => >>> let val projectIdTaskRowsPair = (r.PROJECT_ID, TaskRow (r.ID, r.NAME, >>> [])) in >>> return (projectIdTaskRowsPair :: projectIdTaskRowsPairs) >>> end) >>> []; >>> >>> projectRows <- query (SELECT P.ID AS ID, P.NAME AS NAME >>> FROM project_table AS P >>> WHERE P.USER_ID = {[userId]} >>> ORDER BY P.NAME) >>> (fn r projectRows => >>> let val projectIdTaskRowsPairs = filter (fn (projectId, _) => >>> projectId = r.ID) projectIdTaskRowsPairs >>> val taskRows = mp (fn (_, taskRow) => taskRow) projectIdTaskRowsPairs >>> val projectRow = ProjectRow (r.ID, r.NAME, taskRows) >>> in >>> return (projectRow :: projectRows) >>> end) >>> []; >>> >>> return (TimeSheet projectRows) >>> >>> fun main () = >>> timeSheet <- timeSheet 1; >>> >>> return >>> >>> >>> >>> {case timeSheet of >>> TimeSheet (projectRows) => >>> mapX (fn projectRow => >>> case projectRow of >>> ProjectRow (projectId, projectName, taskRows) => >>> mapX (fn taskRow => >>> case taskRow of >>> TaskRow (taskId, taskName, _) => >>> >>> >>> >>> >>> >>> >>> >>> ) >>> taskRows) >>> projectRows} >>>
{[projectId]}{[projectName]}{[taskId]}{[taskName]}
>>> >>>
>>> >>> Does anyone knows how to circumvent it? Is it possible to configure the >>> size of the heap? >>> >>> Sincerely, >>> Saulo >>> >>> >> >> _______________________________________________ >> Ur mailing list >> Ur at impredicative.com >> http://www.impredicative.com/cgi-bin/mailman/listinfo/ur >> >> > > _______________________________________________ > Ur mailing list > Ur at impredicative.com > http://www.impredicative.com/cgi-bin/mailman/listinfo/ur > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From saulo2 at gmail.com Fri Jul 22 20:04:49 2016 From: saulo2 at gmail.com (Saulo Araujo) Date: Fri, 22 Jul 2016 21:04:49 -0300 Subject: [Ur] Busy indicator Message-ID: Hi, I would like to show a busy indicator when there is an ongoing rpc. I was wondering if there is a source that contains that information. Does anyone know if is there such source? Sincerely, Saulo -------------- next part -------------- An HTML attachment was scrubbed... URL: From adamc at csail.mit.edu Fri Jul 22 20:13:48 2016 From: adamc at csail.mit.edu (Adam Chlipala) Date: Fri, 22 Jul 2016 20:13:48 -0400 Subject: [Ur] Busy indicator In-Reply-To: References: Message-ID: <5792B6BC.1090409@csail.mit.edu> I don't have anything in particular in mind, but it should be easy enough to get the appropriate signals from Ur/Web. It should even be possible to write generic functionality to wrap an RPC with code to change the status of a busy indicator after the call returns. On 07/22/2016 08:04 PM, Saulo Araujo wrote: > Hi, > > I would like to show a busy indicator when there is an ongoing rpc. I > was wondering if there is a source that contains that information. > Does anyone know if is there such source? > > Sincerely, > Saulo From saulo2 at gmail.com Fri Jul 22 21:51:32 2016 From: saulo2 at gmail.com (Saulo Araujo) Date: Fri, 22 Jul 2016 22:51:32 -0300 Subject: [Ur] Busy indicator In-Reply-To: <5792B6BC.1090409@csail.mit.edu> References: <5792B6BC.1090409@csail.mit.edu> Message-ID: Hi Adam, Thanks for your suggestion. It was quite easy indeed. Do you think this signal could/should be part of the Ur/Web standard library and runtime? If so, I can make a pull request with my implementation of this signal. By the way, have you looked into https://github.com/urweb/urweb/pull/34 ? Regards, Saulo On Fri, Jul 22, 2016 at 9:13 PM, Adam Chlipala wrote: > I don't have anything in particular in mind, but it should be easy enough > to get the appropriate signals from Ur/Web. It should even be possible to > write generic functionality to wrap an RPC with code to change the status > of a busy indicator after the call returns. > > > On 07/22/2016 08:04 PM, Saulo Araujo wrote: > >> Hi, >> >> I would like to show a busy indicator when there is an ongoing rpc. I was >> wondering if there is a source that contains that information. Does anyone >> know if is there such source? >> >> Sincerely, >> Saulo >> > > _______________________________________________ > Ur mailing list > Ur at impredicative.com > http://www.impredicative.com/cgi-bin/mailman/listinfo/ur > -------------- next part -------------- An HTML attachment was scrubbed... URL: