ngx_tcc_module-20110720 (用C语言编写网页后台脚本)
ngx_tcc_module是一个nginx http模块,它把tcc编译器内嵌到nginx,用来编译C语言编写的网页后台脚本。每个页面由两个文件组成:
*.csp,是主要用HTML编写的文件,里面会内嵌一些C代码。
*.c,纯C编写的代码文件,里面主要是做一些业务逻辑的处理。
下载:
https://github.com/downloads/hehaiqiang/ngwsx/ngx_tcc_module-20110720.rar
代码示例:
index.csp
<%/* This is a "c server page (CSP)" */static inti;%><html><head></head><body><% for (i = 0; i < 5; i++) { %><a href="<%=url%>" target="_blank"><%=title%></a><% } %></body></html>
index.c
#include <ngx_config.h>#include <ngx_core.h>#include <ngx_http.h>#define NGX_DBD_OPT_NON_BLOCKING0x01static void row_handler(ngx_http_request_t *r);static void *dbd;static u_char*url = "";static u_char*title = "";static voidfinalize(ngx_http_request_t *r, ngx_int_t rc){ ngx_tcc_dbd_close(dbd); ngx_tcc_dbd_destroy(dbd); ngx_tcc_finalize(r, rc);}static voidfield_handler(ngx_http_request_t *r){ off_t offset; size_t size, total; u_char *value; ngx_int_t rc; for ( ;; ) { rc = ngx_tcc_dbd_field_read(dbd, &value, &offset, &size, &total); if (rc == NGX_AGAIN) { return; } if (rc == NGX_ERROR) { finalize(r, rc); return; } if (rc == NGX_DONE) { break; } /* TODO: value, offset, size, total */ ngx_tcc_output(r, value, size); ngx_tcc_output_str(r, "&nbsp;&nbsp;"); } ngx_tcc_output_str(r, "<br/>"); ngx_tcc_dbd_set_handler(dbd, row_handler, r); row_handler(r);}static voidrow_handler(ngx_http_request_t *r){ ngx_int_trc; for ( ;; ) { rc = ngx_tcc_dbd_row_read(dbd); if (rc == NGX_AGAIN) { return; } if (rc == NGX_ERROR) { finalize(r, rc); return; } if (rc == NGX_DONE) { break; } ngx_tcc_dbd_set_handler(dbd, field_handler, r); field_handler(r); return; } url = "http://www.126.com/"; title = "126.com"; finalize(r, NGX_OK);}static voidcolumn_handler(ngx_http_request_t *r){ size_t size; u_char *buf; ngx_int_t rc; for ( ;; ) { rc = ngx_tcc_dbd_column_read(dbd); if (rc == NGX_AGAIN) { return; } if (rc == NGX_ERROR) { finalize(r, rc); return; } if (rc == NGX_DONE) { break; } buf = (u_char *) ngx_tcc_dbd_column_name(dbd); size = ngx_strlen(buf); ngx_tcc_output(r, buf, size); ngx_tcc_output_str(r, "&nbsp;&nbsp;"); } ngx_tcc_output_str(r, "<br/>"); ngx_tcc_dbd_set_handler(dbd, row_handler, r); row_handler(r);}static voidresult_handler(ngx_http_request_t *r){ ngx_int_trc; rc = ngx_tcc_dbd_query(dbd); if (rc == NGX_AGAIN) { return; } if (rc == NGX_ERROR) { finalize(r, rc); return; } ngx_tcc_dbd_set_handler(dbd, column_handler, r); column_handler(r);}static voidconnect_handler(ngx_http_request_t *r){ ngx_int_trc; rc = ngx_tcc_dbd_connect(dbd); if (rc == NGX_AGAIN) { return; } if (rc == NGX_ERROR) { ngx_tcc_dbd_destroy(dbd); ngx_tcc_finalize(r); return; } /* TODO: escape sql */ ngx_tcc_dbd_set_sql(dbd, "show databases", sizeof("show databases") - 1); ngx_tcc_dbd_set_handler(dbd, result_handler, r); result_handler(r);}__declspec(dllexport) voidhandler(ngx_http_request_t *r){ ngx_int_trc; dbd = (void *) ngx_tcc_dbd_create(r, "libdrizzle"); ngx_tcc_dbd_set_options(dbd, NGX_DBD_OPT_NON_BLOCKING); ngx_tcc_dbd_set_tcp(dbd, "127.0.0.1", 3306); ngx_tcc_dbd_set_db(dbd, "mysql"); ngx_tcc_dbd_set_auth(dbd, "root", "123456"); ngx_tcc_dbd_set_handler(dbd, connect_handler, r); connect_handler(r);}
页:
[1]