وصفات PostgreSQL: محرك قالب الشارب

لإعداد قالب المحرك mustach، نحتاج بوستجرس و mustach . يمكنك أيضًا استخدام الصورة النهائية .

لماذا نحتاج إلى محرك قالب في قاعدة البيانات؟ حسنًا ، أولاً ، إذا كان محرك القالب في قاعدة البيانات ، فيجب أن تكون القوالب نفسها أيضًا في قاعدة البيانات. ولماذا تحتاج إلى تخزين القوالب في قاعدة البيانات؟ نعم ، لأن النماذج ، مثل البيانات ، يمكن أن تعتمد أيضًا على الوقت. على سبيل المثال ، افترض أن هناك حسابات في قاعدة البيانات (هذه هي البيانات). من الواضح أنهم يعتمدون على الوقت: هذا الشهر يكون المبلغ واحدًا ، في الشهر التالي - آخر ، ثم - الثالث ، إلخ. ولكن يمكن أن يعتمد قالب الفاتورة أيضًا على الوقت: هذا العام ، والآخر التالي (كما كان الحال مع تقديم 20 ٪). لذلك ، من الملائم تخزين القوالب بأنفسهم في قاعدة البيانات. حسنًا ، محرك القالب في قاعدة البيانات مناسب حيث يمكنك وضعه هناك في قاعدة البيانات ، ثم (مباشرة في قاعدة البيانات) تحويله إلى pdf و (حق في قاعدة البيانات) إرساله عبر البريد الإلكتروني . وكل هذا يمكن القيام به بشكل غير متزامن باستخدام المجدول.

الرمز ليس كبيرًا جدًا ، لذلك أنشره بالكامل (مع التعليقات)

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

نستخدمها على النحو التالي: قم أولاً بإنشاء امتداد

create extension pg_mustach

ثم القالب في الذاكرة

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

أو لتقديم ملف

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

All Articles