ziv@2213: table tab : {Id : int, Val : int} PRIMARY KEY Id ziv@2203: ziv@2213: fun cache id = ziv@2225: res <- oneOrNoRows (SELECT tab.Val ziv@2225: FROM tab ziv@2225: WHERE tab.Id = {[id]}); ziv@2204: return ziv@2213: Reading {[id]}. ziv@2204: {case res of ziv@2213: None => ? ziv@2213: | Some row => {[row.Tab.Val]}} ziv@2204: ziv@2203: ziv@2235: ziv@2213: fun flush id = ziv@2235: dml (UPDATE tab ziv@2235: SET Val = 42 ziv@2235: WHERE Id = {[id]} OR Id = {[id + 1]}); ziv@2204: return ziv@2235: Changed {[id]}! ziv@2204: ziv@2234: ziv@2235: (* fun flush id = *) ziv@2235: (* res <- oneOrNoRows (SELECT tab.Val *) ziv@2235: (* FROM tab *) ziv@2235: (* WHERE tab.Id = {[id]}); *) ziv@2235: (* (case res of *) ziv@2235: (* None => dml (INSERT INTO tab (Id, Val) *) ziv@2235: (* VALUES ({[id]}, 0)) *) ziv@2235: (* | Some row => dml (UPDATE tab *) ziv@2235: (* SET Val = {[row.Tab.Val + 1]} *) ziv@2235: (* WHERE Id = {[id]} OR Id = {[id + 1]})); *) ziv@2235: (* return *) ziv@2235: (* {case res of *) ziv@2235: (* None => Initialized {[id]}! *) ziv@2235: (* | Some row => Incremented {[id]}!} *) ziv@2235: (* *)