adamc@764: (* Copyright (c) 2008-2009, 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 adamc@764: * 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 adamc@764: adamc@866: val setDebug : bool -> unit adamc@866: val getDebug : unit -> bool adamc@866: 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 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 adamc@765: val isEffectful : ffi -> bool adamc@765: 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 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 adamc@768: type rewrite = { pkind : path_kind, kind : pattern_kind, from : string, to : string } 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: adamc@855: (* Web protocols that generated programs may speak *) adamc@855: type protocol = { adamc@855: name : string, (* Call it this on the command line *) adamc@855: link : string, (* Pass these linker arguments *) adamc@858: persistent : bool (* Multiple requests per process? *) 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@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: adamc@866: type dbms = { adamc@866: name : string, adamc@866: (* Call it this on the command line *) 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, adamc@868: dml : ErrorMsg.span -> Print.PD.pp_desc, adamc@868: dmlPrepared : {loc : ErrorMsg.span, id : int, dml : string, adamc@869: inputs : sql_type list} -> 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@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@877: createSequence : string -> string, adamc@878: textKeysNeedLengths : bool, adamc@879: supportsNextval : bool, adamc@879: supportsNestedPrepared : 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@764: end