PostgreSQL-Rezepte: Mustach Template Engine

Um die Mustach Template Engine vorzubereiten , benötigen wir Postgres und Mustach . Sie können auch das fertige Bild verwenden .

Warum brauchen wir eine Template Engine in der Datenbank? Wenn sich die Template-Engine in der Datenbank befindet, sollten sich die Vorlagen selbst ebenfalls in der Datenbank befinden. Und warum müssen Sie Vorlagen in der Datenbank speichern? Ja, da Vorlagen wie Daten auch zeitabhängig sein können. Angenommen, die Datenbank enthält Konten (dies sind Daten). Offensichtlich hängen sie von der Zeit ab: In diesem Monat ist der Betrag einer, im nächsten - ein anderer, dann - der dritte usw. Die Rechnungsvorlage kann aber auch von der Zeit abhängen: in diesem und im nächsten Jahr (wie bei der Einführung von 20%). Daher ist es bequemer, die Vorlagen selbst in der Datenbank zu speichern. Nun, die Template-Engine in der Datenbank ist praktisch, da Sie sie direkt in der Datenbank vorlegen, dann (genau dort in der Datenbank) in PDF konvertieren und (direkt in der Datenbank) per E-Mail senden können . Und das alles kann asynchron mit dem Scheduler erfolgen.

Der Code ist nicht zu groß, also poste ich alles (mit Kommentaren)

#include <postgres.h> //   .

#include <catalog/pg_type.h> //  
extern text *cstring_to_text(const char *s); //  
extern text *cstring_to_text_with_len(const char *s, int len); //  
extern char *text_to_cstring(const text *t); //  , 
extern void text_to_cstring_buffer(const text *src, char *dst, size_t dst_len); //   
#define CStringGetTextDatum(s) PointerGetDatum(cstring_to_text(s)) //   
#define TextDatumGetCString(d) text_to_cstring((text *) DatumGetPointer(d)) //   json_object
#include <mustach/mustach-json-c.h> //    

#define EXTENSION(function) Datum (function)(PG_FUNCTION_ARGS); PG_FUNCTION_INFO_V1(function); Datum (function)(PG_FUNCTION_ARGS) //     

PG_MODULE_MAGIC; //   

EXTENSION(json2mustach) { //   
    char *file; //   
    char *json; //   
    char *output_data; //   
    char *template; // 
    enum json_tokener_error error; //     
    FILE *out; //  
    size_t output_len; //    
    struct json_object *object; //  
    text *output; // 
    if (PG_ARGISNULL(0)) ereport(ERROR, (errmsg("json is null!"))); //      NULL
    if (PG_ARGISNULL(1)) ereport(ERROR, (errmsg("template is null!"))); //   - 
    json = TextDatumGetCString(PG_GETARG_DATUM(0)); //  C-   
    template = TextDatumGetCString(PG_GETARG_DATUM(1)); //   
    if (!(object = json_tokener_parse_verbose(json, &error))) ereport(ERROR, (errmsg("!json_tokener_parse and %s", json_tokener_error_desc(error)))); //          
    switch (PG_NARGS()) { //     
        case 2: if (!(out = open_memstream(&output_data, &output_len))) ereport(ERROR, (errmsg("!open_memstream"))); break; //         
        case 3: //   
            if (PG_ARGISNULL(2)) ereport(ERROR, (errmsg("file is null!"))); //      NULL
            file = TextDatumGetCString(PG_GETARG_DATUM(2)); //  C-   
            if (!(out = fopen(file, "wb"))) ereport(ERROR, (errmsg("!fopen"))); //          
            pfree(file); //  
            break; // 
        default: ereport(ERROR, (errmsg("expect be 2 or 3 args"))); //        
    }
    if (fmustach_json_c(template, object, out)) ereport(ERROR, (errmsg("fmustach_json_c"))); //        
    pfree(json); //  
    pfree(template); //  
    if (!json_object_put(object)) ereport(ERROR, (errmsg("!json_object_put"))); //   
    switch (PG_NARGS()) { //     
        case 2: //   
            fclose(out); //    
            output = cstring_to_text_with_len(output_data, output_len); //   
            free(output_data); //  
            PG_RETURN_TEXT_P(output); //  
            break; // 
        case 3: PG_RETURN_BOOL(true); break; //      
        default: ereport(ERROR, (errmsg("expect be 2 or 3 args"))); //        
    }
}

Wir verwenden es so: Erstellen Sie zuerst eine Erweiterung

create extension pg_mustach

und dann Vorlage in den Speicher

select json2mustach('{"name":""}', ', {{name}}!')

oder zu archivieren

select json2mustach('{"name":""}', ', {{name}}!', 'file_name')

All Articles