📄 gen_rec.awk
字号:
} # If out of disk space log writes may fail. If we are debugging # that print out which records did not make it to disk. printf("#ifdef LOG_DIAGNOSTIC\n") >> CFILE printf("\tif (ret != 0)\n") >> CFILE; printf("\t\t(void)%s_print(dbenv,\n", funcname) >> CFILE; printf("\t\t (DBT *)&logrec, ret_lsnp, NULL, NULL);\n") \ >> CFILE printf("#endif\n\n") >> CFILE # Free and return if (dbprivate) { printf("#ifdef DIAGNOSTIC\n") >> CFILE write_free("\t", "logrec.data", CFILE) printf("#else\n") >> CFILE printf("\tif (is_durable || txnid == NULL)\n") >> CFILE; write_free("\t\t", "logrec.data", CFILE) printf("#endif\n") >> CFILE } else { write_free("\t", "logrec.data", CFILE) } } else { printf("\t*lenp = (u_int32_t)(bp - buf);\n\n") >> CFILE } printf("\treturn (ret);\n}\n\n") >> CFILE;}# If we're logging a DB handle, make sure we have a log# file ID for it.function db_handle_id_function(modes, n){ for (i = 0; i < n; i++) if (modes[i] == "DB") { # We actually log the DB handle's fileid; from # that ID we're able to acquire an open handle # at recovery time. printf(\ "\tDB_ASSERT(dbp->log_filename != NULL);\n") \ >> CFILE; printf("\tif (dbp->log_filename->id == ") \ >> CFILE; printf("DB_LOGFILEID_INVALID &&\n\t ") \ >> CFILE printf("(ret = __dbreg_lazy_id(dbp)) != 0)\n") \ >> CFILE printf("\t\treturn (ret);\n\n") >> CFILE; break; }}function print_function(){ # Write the print function; function prototype p[1] = sprintf("int %s_print", funcname); p[2] = " "; p[3] = "__P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));"; p[4] = ""; proto_format(p, PFILE); # Function declaration printf("int\n%s_print(dbenv, ", funcname) >> PFILE; printf("dbtp, lsnp, notused2, notused3)\n") >> PFILE; printf("\tDB_ENV *dbenv;\n") >> PFILE; printf("\tDBT *dbtp;\n") >> PFILE; printf("\tDB_LSN *lsnp;\n") >> PFILE; printf("\tdb_recops notused2;\n\tvoid *notused3;\n{\n") >> PFILE; # Locals printf("\t%s_args *argp;\n", funcname) >> PFILE; for (i = 0; i < nvars; i ++) if (modes[i] == "TIME") { printf("\tstruct tm *lt;\n") >> PFILE printf("\ttime_t timeval;\n") >> PFILE break; } for (i = 0; i < nvars; i ++) if (modes[i] == "DBT" || modes[i] == "PGDBT") { printf("\tu_int32_t i;\n") >> PFILE printf("\tint ch;\n") >> PFILE break; } printf("\tint ret;\n\n") >> PFILE; # Get rid of complaints about unused parameters. printf("\tnotused2 = DB_TXN_ABORT;\n\tnotused3 = NULL;\n\n") >> PFILE; # Call read routine to initialize structure printf("\tif ((ret = %s_read(dbenv, dbtp->data, &argp)) != 0)\n", \ funcname) >> PFILE; printf("\t\treturn (ret);\n") >> PFILE; # Print values in every record printf("\t(void)printf(\n\t \"[%%lu][%%lu]%s%%s: ",\ funcname) >> PFILE; printf("rec: %%lu txnid %%lx ") >> PFILE; printf("prevlsn [%%lu][%%lu]\\n\",\n") >> PFILE; printf("\t (u_long)lsnp->file,\n") >> PFILE; printf("\t (u_long)lsnp->offset,\n") >> PFILE; printf("\t (argp->type & DB_debug_FLAG) ? \"_debug\" : \"\",\n") \ >> PFILE; printf("\t (u_long)argp->type,\n") >> PFILE; printf("\t (u_long)argp->txnid->txnid,\n") >> PFILE; printf("\t (u_long)argp->prev_lsn.file,\n") >> PFILE; printf("\t (u_long)argp->prev_lsn.offset);\n") >> PFILE; # Now print fields of argp for (i = 0; i < nvars; i ++) { if (modes[i] == "TIME") { printf("\ttimeval = (time_t)argp->%s;\n", vars[i]) >> PFILE; printf("\tlt = localtime(&timeval);\n") >> PFILE; printf("\t(void)printf(\n\t \"\\t%s: ", vars[i]) >> PFILE; } else printf("\t(void)printf(\"\\t%s: ", vars[i]) >> PFILE; if (modes[i] == "DBT" || modes[i] == "PGDBT") { printf("\");\n") >> PFILE; printf("\tfor (i = 0; i < ") >> PFILE; printf("argp->%s.size; i++) {\n", vars[i]) >> PFILE; printf("\t\tch = ((u_int8_t *)argp->%s.data)[i];\n", \ vars[i]) >> PFILE; printf("\t\tprintf(isprint(ch) || ch == 0x0a") >> PFILE; printf(" ? \"%%c\" : \"%%#x \", ch);\n") >> PFILE; printf("\t}\n\t(void)printf(\"\\n\");\n") >> PFILE; } else if (types[i] == "DB_LSN *") { printf("[%%%s][%%%s]\\n\",\n", \ formats[i], formats[i]) >> PFILE; printf("\t (u_long)argp->%s.file,", \ vars[i]) >> PFILE; printf(" (u_long)argp->%s.offset);\n", \ vars[i]) >> PFILE; } else if (modes[i] == "TIME") { # Time values are displayed in two ways: the standard # string returned by ctime, and in the input format # expected by db_recover -t. printf(\ "%%%s (%%.24s, 20%%02lu%%02lu%%02lu%%02lu%%02lu.%%02lu)\\n\",\n", \ formats[i]) >> PFILE; printf("\t (long)argp->%s, ", vars[i]) >> PFILE; printf("ctime(&timeval),", vars[i]) >> PFILE; printf("\n\t (u_long)lt->tm_year - 100, ") >> PFILE; printf("(u_long)lt->tm_mon+1,") >> PFILE; printf("\n\t (u_long)lt->tm_mday, ") >> PFILE; printf("(u_long)lt->tm_hour,") >> PFILE; printf("\n\t (u_long)lt->tm_min, ") >> PFILE; printf("(u_long)lt->tm_sec);\n") >> PFILE; } else if (modes[i] == "LOCKS") { printf("\\n\");\n") >> PFILE; printf("\t__lock_list_print(dbenv, &argp->locks);\n") \ >> PFILE; } else { if (formats[i] == "lx") printf("0x") >> PFILE; printf("%%%s\\n\", ", formats[i]) >> PFILE; if (formats[i] == "lx" || formats[i] == "lu") printf("(u_long)") >> PFILE; if (formats[i] == "ld") printf("(long)") >> PFILE; printf("argp->%s);\n", vars[i]) >> PFILE; } } printf("\t(void)printf(\"\\n\");\n") >> PFILE; write_free("\t", "argp", PFILE); printf("\treturn (0);\n") >> PFILE; printf("}\n\n") >> PFILE;}function read_function(){ # Write the read function; function prototype if (not_buf) p[1] = sprintf("int %s_read __P((DB_ENV *, void *,", funcname); else p[1] = sprintf("int %s_read __P((DB_ENV *, void *, void **,", \ funcname); p[2] = " "; p[3] = sprintf("%s_args **));", funcname); p[4] = ""; proto_format(p, CFILE); # Function declaration if (not_buf) printf("int\n%s_read(dbenv, recbuf, argpp)\n", funcname) \ >> CFILE; else printf(\ "int\n%s_read(dbenv, recbuf, nextp, argpp)\n", funcname) \ >> CFILE; # Now print the parameters printf("\tDB_ENV *dbenv;\n") >> CFILE; printf("\tvoid *recbuf;\n") >> CFILE; if (!not_buf) printf("\tvoid **nextp;\n") >> CFILE; printf("\t%s_args **argpp;\n", funcname) >> CFILE; # Function body and local decls printf("{\n\t%s_args *argp;\n", funcname) >> CFILE; if (is_uint == 1) printf("\tu_int32_t uinttmp;\n") >> CFILE; printf("\tu_int8_t *bp;\n") >> CFILE; if (dbprivate) { # We only use dbenv and ret in the private malloc case. printf("\tint ret;\n\n") >> CFILE; } else { printf("\t/* Keep the compiler quiet. */\n") >> CFILE; printf("\n\tdbenv = NULL;\n") >> CFILE; } if (not_buf) { malloc_size = sprintf("sizeof(%s_args) + sizeof(DB_TXN)", \ funcname) } else { malloc_size = sprintf("sizeof(%s_args)", funcname) } write_malloc("\t", "argp", malloc_size, CFILE) # Set up the pointers to the txnid. printf("\tbp = recbuf;\n") >> CFILE; if (not_buf) { printf("\targp->txnid = (DB_TXN *)&argp[1];\n\n") >> CFILE; # First get the record type, prev_lsn, and txnid fields. printf("\tmemcpy(&argp->type, bp, sizeof(argp->type));\n") \ >> CFILE; printf("\tbp += sizeof(argp->type);\n\n") >> CFILE; printf("\tmemcpy(&argp->txnid->txnid, bp, ") >> CFILE; printf("sizeof(argp->txnid->txnid));\n") >> CFILE; printf("\tbp += sizeof(argp->txnid->txnid);\n\n") >> CFILE; printf("\tmemcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));\n") \ >> CFILE; printf("\tbp += sizeof(DB_LSN);\n\n") >> CFILE; } # Now get rest of data. for (i = 0; i < nvars; i ++) { if (modes[i] == "DBT" || \ modes[i] == "LOCKS" || modes[i] == "PGDBT") { printf("\tmemset(&argp->%s, 0, sizeof(argp->%s));\n", \ vars[i], vars[i]) >> CFILE; printf("\tmemcpy(&argp->%s.size, ", vars[i]) >> CFILE; printf("bp, sizeof(u_int32_t));\n") >> CFILE; printf("\tbp += sizeof(u_int32_t);\n") >> CFILE; printf("\targp->%s.data = bp;\n", vars[i]) >> CFILE; printf("\tbp += argp->%s.size;\n", vars[i]) >> CFILE; } else if (modes[i] == "ARG" || modes[i] == "TIME" || modes[i] == "DB") { printf("\tmemcpy(&uinttmp, bp, sizeof(uinttmp));\n") \ >> CFILE; printf("\targp->%s = (%s)uinttmp;\n", vars[i], \ types[i]) >> CFILE; printf("\tbp += sizeof(uinttmp);\n") >> CFILE; } else { # POINTER printf("\tmemcpy(&argp->%s, bp, ", vars[i]) >> CFILE; printf(" sizeof(argp->%s));\n", vars[i]) >> CFILE; printf("\tbp += sizeof(argp->%s);\n", vars[i]) >> CFILE; } printf("\n") >> CFILE; } # Free and return if (!not_buf) printf("\t*nextp = bp;\n") >> CFILE; printf("\t*argpp = argp;\n") >> CFILE; printf("\treturn (0);\n}\n\n") >> CFILE;}# proto_format --# Pretty-print a function prototype.function proto_format(p, fp){ printf("/*\n") >> fp; s = ""; for (i = 1; i in p; ++i) s = s p[i]; t = " * PUBLIC: " if (length(s) + length(t) < 80) printf("%s%s", t, s) >> fp; else { split(s, p, "__P"); len = length(t) + length(p[1]); printf("%s%s", t, p[1]) >> fp n = split(p[2], comma, ","); comma[1] = "__P" comma[1]; for (i = 1; i <= n; i++) { if (len + length(comma[i]) > 70) { printf("\n * PUBLIC: ") >> fp; len = 0; } printf("%s%s", comma[i], i == n ? "" : ",") >> fp; len += length(comma[i]) + 2; } } printf("\n */\n") >> fp; delete p;}function write_malloc(tab, ptr, size, file){ if (dbprivate) { print(tab "if ((ret = __os_malloc(dbenv,") >> file print(tab " " size ", &" ptr ")) != 0)") >> file print(tab "\treturn (ret);") >> file; } else { print(tab "if ((" ptr " = malloc(" size ")) == NULL)") >> file print(tab "\treturn (ENOMEM);") >> file }}function write_free(tab, ptr, file){ if (dbprivate) { print(tab "__os_free(dbenv, " ptr ");") >> file } else { print(tab "free(" ptr ");") >> file }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -