| 1 | /* |
| 2 | * This Source Code Form is subject to the terms of the Mozilla Public |
| 3 | * License, v. 2.0. If a copy of the MPL was not distributed with this |
| 4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. |
| 5 | * |
| 6 | * Copyright 1997 - July 2008 CWI, August 2008 - 2019 MonetDB B.V. |
| 7 | */ |
| 8 | |
| 9 | /* |
| 10 | * (c) Martin Kersten |
| 11 | * This module provides a wrapping of the help function in the .../mal/mal_modules.c |
| 12 | * and the list of all MAL functions for analysis using SQL. |
| 13 | */ |
| 14 | #include "monetdb_config.h" |
| 15 | #include "manual.h" |
| 16 | |
| 17 | str |
| 18 | MANUALcreateOverview(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) |
| 19 | { |
| 20 | BAT *mod, *fcn, *sig, *adr, *com; |
| 21 | bat *mx = getArgReference_bat(stk,pci,0); |
| 22 | bat *fx = getArgReference_bat(stk,pci,1); |
| 23 | bat *sx = getArgReference_bat(stk,pci,2); |
| 24 | bat *ax = getArgReference_bat(stk,pci,3); |
| 25 | bat *cx = getArgReference_bat(stk,pci,4); |
| 26 | Module s; |
| 27 | Module* moduleList; |
| 28 | int length; |
| 29 | int j, k, top = 0; |
| 30 | Symbol t; |
| 31 | Module list[256]; |
| 32 | char buf[BUFSIZ], *tt; |
| 33 | |
| 34 | mod = COLnew(0, TYPE_str, 0, TRANSIENT); |
| 35 | fcn = COLnew(0, TYPE_str, 0, TRANSIENT); |
| 36 | sig = COLnew(0, TYPE_str, 0, TRANSIENT); |
| 37 | adr = COLnew(0, TYPE_str, 0, TRANSIENT); |
| 38 | com = COLnew(0, TYPE_str, 0, TRANSIENT); |
| 39 | if (mod == NULL || fcn == NULL || sig == NULL || adr == NULL || com == NULL) { |
| 40 | BBPreclaim(mod); |
| 41 | BBPreclaim(fcn); |
| 42 | BBPreclaim(sig); |
| 43 | BBPreclaim(adr); |
| 44 | BBPreclaim(com); |
| 45 | throw(MAL, "manual.functions" , SQLSTATE(HY001) MAL_MALLOC_FAIL); |
| 46 | } |
| 47 | |
| 48 | list[top++] = cntxt->usermodule; |
| 49 | getModuleList(&moduleList, &length); |
| 50 | if (moduleList == NULL) |
| 51 | goto bailout; |
| 52 | while (top < 256 && top <= length) { |
| 53 | list[top] = moduleList[top - 1]; |
| 54 | top++; |
| 55 | } |
| 56 | freeModuleList(moduleList); |
| 57 | |
| 58 | for (k = 0; k < top; k++) { |
| 59 | s = list[k]; |
| 60 | if (s->space) { |
| 61 | for (j = 0; j < MAXSCOPE; j++) { |
| 62 | if (s->space[j]) { |
| 63 | for (t = s->space[j]; t != NULL; t = t->peer) { |
| 64 | (void) fcnDefinition(t->def, getInstrPtr(t->def, 0), buf, TRUE, buf, sizeof(buf)); |
| 65 | tt = strstr(buf, "address " ); |
| 66 | if (tt) { |
| 67 | *tt = 0; |
| 68 | tt += 8; |
| 69 | } |
| 70 | if (BUNappend(mod, t->def->stmt[0]->modname, false) != GDK_SUCCEED || |
| 71 | BUNappend(fcn, t->def->stmt[0]->fcnname, false) != GDK_SUCCEED || |
| 72 | BUNappend(com, t->def->help ? t->def->help : "" , false) != GDK_SUCCEED || |
| 73 | BUNappend(sig,buf,false) != GDK_SUCCEED || |
| 74 | BUNappend(adr, tt ? tt : "" , false) != GDK_SUCCEED) { |
| 75 | goto bailout; |
| 76 | } |
| 77 | } |
| 78 | } |
| 79 | } |
| 80 | } |
| 81 | } |
| 82 | |
| 83 | BBPkeepref( *mx = mod->batCacheid); |
| 84 | BBPkeepref( *fx = fcn->batCacheid); |
| 85 | BBPkeepref( *sx = sig->batCacheid); |
| 86 | BBPkeepref( *ax = adr->batCacheid); |
| 87 | BBPkeepref( *cx = com->batCacheid); |
| 88 | (void)mb; |
| 89 | return MAL_SUCCEED; |
| 90 | |
| 91 | bailout: |
| 92 | BBPreclaim(mod); |
| 93 | BBPreclaim(fcn); |
| 94 | BBPreclaim(sig); |
| 95 | BBPreclaim(adr); |
| 96 | BBPreclaim(com); |
| 97 | throw(MAL, "manual.functions" , GDK_EXCEPTION); |
| 98 | } |
| 99 | |