(module sql-sig mzscheme

  (require (lib ""))

  (provide (all-defined))
  ; Units and signatures -------------------------

  ;; signature sql-quote^ : signature for conversion between Scheme and DBMS primitives
  ;; This sig provides procedures for converting between Scheme and database primitives:
  ;;   identifiers (for columns, tables and so on)
  ;;     These are typically stored as symbols in Scheme, but are sometimes also
  ;;     stored as strings. Identifiers can contain many different puncuation symbols
  ;;     (the most common of which is the hyphen), so they typically have to be quoted
  ;;     in the database backend (e.g. [my-table] in SQLite and `my-table` in MySQL).
  ;;   data (the atomic values stored in each record)
  ;;     Snooze supports a number of data types (strings, numbers, and so on), which may
  ;;     or may not be supported by a given database backend. "Quoting" data involves
  ;;     converting a Scheme primitive into a corresponding string for insertion into SQL.
  ;;     "Unquoting" data involves converting the value from the result of a query back into
  ;;     a Scheme primitive.
  ;;     A Scheme data type may be stored differently by different database backends. Snooze
  ;;     does not guarantee that data in one DBMS can be ported to another without conversion.
  ;;     Snooze currently does not provide software tools for migrating from database to
  ;;     database.
  (define-signature sql-quote^
    (quote-id       ; (U symbol string) -> string
     quote-data     ; type any -> string
     unquote-data   ; type string -> any
     ;; make-data-unquoter
     ;;     : (list-of type)
     ;;    -> ((U (row-of (U string #f)) #f) -> (U (vector-of scheme-primitive) #f))
     ;; where (row-of ...) represents a list or vector of quoted values, or whatever the DB
     ;; passes to Snooze.
     ;; Creates a procedure that "unquotes" (parses) a vector of data retrieved from a database.

  ;; signature sql-query^ : top-level signature for select statements
  ;; Snooze uses structures to represent the various aspects of a SELECT query in a DBMS-
  ;; independent way. This signature provides functions for converting these structures into
  ;; SQL. While must of the data manipulation language in SQL is common across DBMSs, subtle
  ;; DBMS-specific variations may exist (particularly in the quoted forms of identifiers and
  ;; data primitives - see sql-quote^).
  (define-signature sql-select^
    (select-sql))       ; select -> string
  ;; signature sql-select-internals^ : signature for constructing SELECT statements
  (define-signature sql-select-internals^
    (display-select-sql  ; select output-port -> void
     display-what-sql    ; (list-of (U field aggregate)) output-port -> void
     display-from-sql    ; (U table join select) output-port -> void ; doesn't display the word "FROM"
     display-expr-sql    ; expr output-port output-port -> void ; doesn't display the words "ON" or "WHERE"
     display-group-sql   ; (list-of (U field aggregate)) output-port -> void ; doesn't display the words "GROUP BY"
     display-order-sql)) ; (list-of order) output-port -> void ; doesn't display the words "ORDER BY"
  ;; signature sql-update^ : signature for creating, updating and dropping tables and records
  ;; This sig provides procedures for creating and dropping entities in/from the database.
  ;; DBMSs vary greatly in their support for the different features of Snooze: the SQL
  ;; produced by these procedures will be quite DBMS specific.
  ;; Note that a single Snooze entity may map to several tables (and potentially other
  ;; structures) in a database. The create-sql procedure returns a single SQL string that
  ;; creates all of the necessary structures in the correct order. The drop-sql procedure
  ;; returns SQL to drop all of the structures created by create-sql.
  (define-signature sql-update^
    (create-sql       ; entity -> string
     drop-sql         ; entity -> string
     insert-sql       ; persistent-struct -> string
     update-sql       ; persistent-struct -> string
     delete-sql))     ; entity integer -> string      ; an entity and an id
  ;; signature sql-update-internals^ : convenience signature for building parts of update queries
  (define-signature sql-update-internals^
    (create-fields-sql ; entity -> string
     column-names      ; entity -> string
     column-values))   ; persistent-struct -> string