Resep PostgreSQL: mesin template mustach

Untuk menyiapkan mesin template mustach, kita membutuhkan postgres dan mustach . Anda juga dapat menggunakan gambar yang sudah jadi .

Mengapa kita membutuhkan mesin template dalam database? Nah, pertama, jika mesin template ada di database, maka template itu sendiri juga harus ada di database. Dan mengapa Anda perlu menyimpan template di database? Ya, karena templat, seperti data, juga dapat bergantung waktu. Misalnya, anggap ada akun di basis data (ini adalah data). Jelas, mereka bergantung pada waktu: bulan ini jumlahnya satu, di berikutnya - lain, lalu - ketiga, dll. Tetapi templat faktur juga dapat bergantung pada waktu: tahun ini satu, dan yang berikutnya (seperti halnya dengan pengenalan 20%). Oleh karena itu, lebih mudah untuk menyimpan templat sendiri di dalam basis data. Yah, mesin templat di dalam basis data nyaman karena Anda dapat membuat templat di sana di dalam basis data, lalu (di sana di dalam basis data) mengubahnya menjadi pdf dan (tepat di basis data) mengirimkannya melalui email . Dan semua ini dapat dilakukan secara tidak sinkron menggunakan penjadwal.

Kode tidak terlalu besar, jadi saya memposting semuanya (dengan komentar)

#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"))); //        
    }
}

Kami menggunakannya seperti ini: pertama buat ekstensi

create extension pg_mustach

dan kemudian templat ke memori

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

atau ke file

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

All Articles