adam@1848: (* Copyright (c) 2008-2011, 2013, Adam Chlipala adamc@764: * All rights reserved. adamc@764: * adamc@764: * Redistribution and use in source and binary forms, with or without adamc@764: * modification, are permitted provided that the following conditions are met: adamc@764: * adamc@764: * - Redistributions of source code must retain the above copyright notice, adamc@764: * this list of conditions and the following disclaimer. adamc@764: * - Redistributions in binary form must reproduce the above copyright notice, adamc@764: * this list of conditions and the following disclaimer in the documentation adamc@764: * and/or other materials provided with the distribution. adamc@764: * - The names of contributors may not be used to endorse or promote products adamc@764: * derived from this software without specific prior written permission. adamc@764: * adamc@764: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" adamc@764: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE adamc@764: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE adamc@764: * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE adam@1682: * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR adamc@764: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF adamc@764: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS adamc@764: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN adamc@764: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) adamc@764: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE adamc@764: * POSSIBILITY OF SUCH DAMAGE. adamc@764: *) adamc@764: adamc@764: signature SETTINGS = sig adam@1682: ezyang@1739: (* XXX these should be unit -> string too *) ezyang@1739: val configBin : string ref ezyang@1739: val configLib : string ref ezyang@1739: val configSrcLib : string ref ezyang@1739: val configInclude : string ref ezyang@1739: val configSitelisp : string ref ezyang@1739: ezyang@1739: val libUr : unit -> string ezyang@1739: val libC : unit -> string ezyang@1739: val libJs : unit -> string ezyang@1739: adamc@866: val setDebug : bool -> unit adamc@866: val getDebug : unit -> bool adam@1682: ezyang@1739: val libFile : string -> string adamc@866: val clibFile : string -> string adamc@866: adamc@765: (* How do all application URLs begin? *) adamc@764: val setUrlPrefix : string -> unit adamc@764: val getUrlPrefix : unit -> string adam@1370: val getUrlPrePrefix : unit -> string adam@1637: val getUrlPrefixFull : unit -> string adam@1637: (* The full prefix is the value that was set explicitly, while the "pre" adam@1637: * prefix gets the protocol/host/port part and the unqualified prefix gets adam@1637: * the URI. *) adamc@764: adamc@765: (* How many seconds should the server wait before assuming a Comet client has left? *) adamc@764: val setTimeout : int -> unit adamc@764: val getTimeout : unit -> int adamc@764: adamc@765: (* Which C header files are needed? *) adamc@764: val setHeaders : string list -> unit adamc@764: val getHeaders : unit -> string list adamc@764: adamc@766: (* Which extra JavaScript URLs should be included? *) adamc@766: val setScripts : string list -> unit adamc@766: val getScripts : unit -> string list adamc@766: adamc@765: type ffi = string * string adamc@765: adamc@765: (* Which FFI types may be sent from clients to servers? *) adamc@765: val setClientToServer : ffi list -> unit adamc@765: val mayClientToServer : ffi -> bool adamc@765: adamc@765: (* Which FFI functions have side effects? *) adamc@765: val setEffectful : ffi list -> unit adam@1878: val addEffectful : ffi -> unit adamc@765: val isEffectful : ffi -> bool adamc@765: adamc@1171: (* Which FFI functions should not have their calls removed or reordered, but cause no lasting effects? *) adamc@1171: val setBenignEffectful : ffi list -> unit adamc@1171: val isBenignEffectful : ffi -> bool adamc@1171: adamc@765: (* Which FFI functions may only be run in clients? *) adamc@765: val setClientOnly : ffi list -> unit adamc@765: val isClientOnly : ffi -> bool adamc@765: adamc@765: (* Which FFI functions may only be run on servers? *) adamc@765: val setServerOnly : ffi list -> unit adamc@765: val isServerOnly : ffi -> bool adamc@765: adamc@765: (* Which FFI functions may be run in JavaScript? (JavaScript function names included) *) adamc@765: val setJsFuncs : (ffi * string) list -> unit adamc@765: val jsFunc : ffi -> string option adam@1433: val allJsFuncs : unit -> (ffi * string) list adamc@765: adamc@768: datatype pattern_kind = Exact | Prefix adamc@768: datatype action = Allow | Deny adamc@768: type rule = { action : action, kind : pattern_kind, pattern : string } adamc@768: adamc@768: datatype path_kind = Any | Url | Table | Sequence | View | Relation | Cookie | Style adam@1752: type rewrite = { pkind : path_kind, kind : pattern_kind, from : string, to : string, hyphenate : bool } adamc@768: adamc@768: (* Rules for rewriting URLs from canonical forms *) adamc@768: val setRewriteRules : rewrite list -> unit adamc@768: val rewrite : path_kind -> string -> string adamc@768: adamc@769: (* Validating URLs and MIME types *) adamc@769: val setUrlRules : rule list -> unit adamc@770: val getUrlRules : unit -> rule list adamc@769: val checkUrl : string -> bool adamc@769: adamc@769: val setMimeRules : rule list -> unit adamc@770: val getMimeRules : unit -> rule list adamc@769: val checkMime : string -> bool adamc@769: adam@1465: val setRequestHeaderRules : rule list -> unit adam@1465: val getRequestHeaderRules : unit -> rule list adam@1465: val checkRequestHeader : string -> bool adam@1465: adam@1465: val setResponseHeaderRules : rule list -> unit adam@1465: val getResponseHeaderRules : unit -> rule list adam@1465: val checkResponseHeader : string -> bool adam@1465: adam@1799: val setEnvVarRules : rule list -> unit adam@1799: val getEnvVarRules : unit -> rule list adam@1799: val checkEnvVar : string -> bool adam@1799: adamc@855: (* Web protocols that generated programs may speak *) adamc@855: type protocol = { adamc@1095: name : string, (* Call it this on the command line *) adamc@1096: compile : string, (* Pass these `gcc -c' arguments *) adamc@1095: linkStatic : string, (* Pass these static linker arguments *) adamc@1095: linkDynamic : string,(* Pass these dynamic linker arguments *) adamc@1164: persistent : bool, (* Multiple requests per process? *) adamc@1164: code : unit -> Print.PD.pp_desc (* Extra code to include in C files *) adamc@855: } adamc@855: val addProtocol : protocol -> unit adamc@856: val setProtocol : string -> unit adamc@855: val currentProtocol : unit -> protocol adamc@855: adamc@866: (* Different DBMSes *) adamc@867: datatype sql_type = adamc@867: Int adamc@867: | Float adamc@867: | String adamc@1011: | Char adamc@867: | Bool adamc@867: | Time adamc@867: | Blob adamc@867: | Channel adamc@867: | Client adamc@867: | Nullable of sql_type adamc@867: adamc@873: val p_sql_ctype : sql_type -> string adamc@867: val isBlob : sql_type -> bool adamc@870: val isNotNull : sql_type -> bool adamc@867: adam@1293: datatype failure_mode = Error | None adam@1293: adamc@866: type dbms = { adamc@866: name : string, adamc@866: (* Call it this on the command line *) adam@1682: randomFunction : string, adam@1682: (* DBMS's name for random number-generating function *) adamc@866: header : string, adamc@866: (* Include this C header file *) adamc@866: link : string, adamc@866: (* Pass these linker arguments *) adamc@873: p_sql_type : sql_type -> string, adamc@870: init : {dbstring : string, adamc@870: prepared : (string * int) list, adamc@870: tables : (string * (string * sql_type) list) list, adamc@872: views : (string * (string * sql_type) list) list, adamc@870: sequences : string list} -> Print.PD.pp_desc, adamc@874: (* Define uw_client_init(), uw_db_init(), uw_db_close(), uw_db_begin(), uw_db_commit(), and uw_db_rollback() *) adamc@873: query : {loc : ErrorMsg.span, cols : sql_type list, adamc@880: doCols : ({loc : ErrorMsg.span, wontLeakStrings : bool, col : int, typ : sql_type} -> Print.PD.pp_desc) adamc@867: -> Print.PD.pp_desc} adamc@867: -> Print.PD.pp_desc, adamc@867: queryPrepared : {loc : ErrorMsg.span, id : int, query : string, adamc@873: inputs : sql_type list, cols : sql_type list, adamc@880: doCols : ({loc : ErrorMsg.span, wontLeakStrings : bool, col : int, adamc@880: typ : sql_type} -> Print.PD.pp_desc) adamc@879: -> Print.PD.pp_desc, adamc@879: nested : bool} adamc@868: -> Print.PD.pp_desc, adam@1293: dml : ErrorMsg.span * failure_mode -> Print.PD.pp_desc, adamc@868: dmlPrepared : {loc : ErrorMsg.span, id : int, dml : string, adam@1293: inputs : sql_type list, mode : failure_mode} -> Print.PD.pp_desc, adamc@878: nextval : {loc : ErrorMsg.span, seqE : Print.PD.pp_desc, seqName : string option} -> Print.PD.pp_desc, adamc@874: nextvalPrepared : {loc : ErrorMsg.span, id : int, query : string} -> Print.PD.pp_desc, adamc@1073: setval : {loc : ErrorMsg.span, seqE : Print.PD.pp_desc, count : Print.PD.pp_desc} -> Print.PD.pp_desc, adamc@874: sqlifyString : string -> string, adamc@874: p_cast : string * sql_type -> string, adamc@874: p_blank : int * sql_type -> string (* Prepared statement input *), adamc@877: supportsDeleteAs : bool, adamc@886: supportsUpdateAs : bool, adamc@877: createSequence : string -> string, adamc@878: textKeysNeedLengths : bool, adamc@879: supportsNextval : bool, adamc@882: supportsNestedPrepared : bool, adamc@890: sqlPrefix : string, adamc@1014: supportsOctetLength : bool, adamc@1014: trueString : string, adamc@1196: falseString : string, adamc@1196: onlyUnion : bool, adam@1777: nestedRelops : bool, adam@1777: windowFunctions : bool adamc@866: } adamc@857: adamc@866: val addDbms : dbms -> unit adamc@866: val setDbms : string -> unit adamc@866: val currentDbms : unit -> dbms adamc@858: adamc@891: val setDbstring : string option -> unit adamc@891: val getDbstring : unit -> string option adamc@891: adamc@891: val setExe : string option -> unit adamc@891: val getExe : unit -> string option adamc@891: adamc@891: val setSql : string option -> unit adamc@891: val getSql : unit -> string option adamc@891: adamc@1016: val setCoreInline : int -> unit adamc@1016: val getCoreInline : unit -> int adamc@1016: adamc@1016: val setMonoInline : int -> unit adamc@1016: val getMonoInline : unit -> int adamc@1016: adamc@1095: val setStaticLinking : bool -> unit adamc@1095: val getStaticLinking : unit -> bool adamc@1095: adamc@1114: val setDeadlines : bool -> unit adamc@1114: val getDeadlines : unit -> bool adamc@1114: adamc@1164: val setSigFile : string option -> unit adamc@1164: val getSigFile : unit -> string option adamc@1164: adamc@1183: (* Which GET-able functions should be allowed to have side effects? *) adamc@1183: val setSafeGets : string list -> unit adamc@1183: val isSafeGet : string -> bool adamc@1183: adam@1294: val setOnError : (string * string list * string) option -> unit adam@1294: val getOnError : unit -> (string * string list * string) option adam@1307: adam@1307: val addLimit : string * int -> unit adam@1307: val limits : unit -> (string * int) list adam@1332: adam@1332: val setMinHeap : int -> unit adam@1332: val getMinHeap : unit -> int adam@1393: adam@1393: val addAlwaysInline : string -> unit adam@1393: val checkAlwaysInline : string -> bool adam@1478: adam@1478: val addNoXsrfProtection : string -> unit adam@1478: val checkNoXsrfProtection : string -> bool adam@1629: adam@1629: val setTimeFormat : string -> unit adam@1629: val getTimeFormat : unit -> string grrwlf@1871: adam@1953: val getCCompiler : unit -> string adam@1953: val setCCompiler : string -> unit adam@1953: adam@1953: val setMangleSql : bool -> unit adam@1953: val mangleSql : string -> string adam@1953: val mangleSqlCatalog : string -> string adam@1953: val mangleSqlTable : string -> string adamc@764: end