summaryrefslogtreecommitdiff
path: root/src/sql.sml
diff options
context:
space:
mode:
authorGravatar Ziv Scully <ziv@mit.edu>2014-10-14 18:05:09 -0400
committerGravatar Ziv Scully <ziv@mit.edu>2014-10-14 18:05:09 -0400
commit75d1eedd15edc41b1c2bc9d1fce7a74f37bd78a1 (patch)
tree09a958bb9333b12cc118b14053cb9043e8a6463b /src/sql.sml
parent8cf3a275f25ffcbb97d623c4e988fdcc81ef5978 (diff)
Complete overhaul: cache queries based on immediate query result, not eventual HTML output.
Diffstat (limited to 'src/sql.sml')
-rw-r--r--src/sql.sml20
1 files changed, 19 insertions, 1 deletions
diff --git a/src/sql.sml b/src/sql.sml
index 8d245660..d38de055 100644
--- a/src/sql.sml
+++ b/src/sql.sml
@@ -270,6 +270,22 @@ fun sqlify chs =
| _ => NONE
+fun sqlifySqlcache chs =
+ case chs of
+ (* Match entire FFI application, not just its argument. *)
+ Exp (e' as EFfiApp ("Basis", f, [(_, _)]), _) :: chs =>
+ if String.isPrefix "sqlify" f then
+ SOME ((e', ErrorMsg.dummySpan), chs)
+ else
+ NONE
+ | Exp (ECase (e, [((PCon (_, PConFfi {mod = "Basis", con = "True", ...}, NONE), _),
+ (EPrim (Prim.String (Prim.Normal, "TRUE")), _)),
+ ((PCon (_, PConFfi {mod = "Basis", con = "False", ...}, NONE), _),
+ (EPrim (Prim.String (Prim.Normal, "FALSE")), _))], _), _) :: chs =>
+ SOME (e, chs)
+
+ | _ => NONE
+
fun constK s = wrap (const s) (fn () => s)
val funcName = altL [constK "COUNT",
@@ -281,6 +297,8 @@ val funcName = altL [constK "COUNT",
val unmodeled = altL [const "COUNT(*)",
const "CURRENT_TIMESTAMP"]
+val sqlcacheMode = ref false;
+
fun sqexp chs =
log "sqexp"
(altL [wrap prim SqConst,
@@ -292,7 +310,7 @@ fun sqexp chs =
wrap known SqKnown,
wrap func SqFunc,
wrap unmodeled (fn () => Unmodeled),
- wrap sqlify Inj,
+ wrap (if !sqlcacheMode then sqlifySqlcache else sqlify) Inj,
wrap (follow (const "COALESCE(") (follow sqexp (follow (const ",")
(follow (keep (fn ch => ch <> #")")) (const ")")))))
(fn ((), (e, _)) => e),