لإعداد قالب المحرك 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))
#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!")));
if (PG_ARGISNULL(1)) ereport(ERROR, (errmsg("template is null!")));
json = TextDatumGetCString(PG_GETARG_DATUM(0));
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!")));
file = TextDatumGetCString(PG_GETARG_DATUM(2));
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')