swbltin.c
上传用户:aidanglao
上传日期:2007-01-07
资源大小:69k
文件大小:16k
源码类别:

Oracle数据库

开发平台:

Unix_Linux

  1. /* swbltin.c - built-in processing routines (if,cursor,symbol, etc)
  2. /*
  3. /* Copyright (c) 1995-1999 Applied Information Technologies, Inc.
  4. /* All Rights Reserved.
  5. /*  
  6. /* Distributed uder the GNU General Public License which was included in
  7. /* the file named "LICENSE" in the package that you recieved.
  8. /* If not, write to:
  9. /* The Free Software Foundation, Inc.,
  10. /* 675 Mass Ave, Cambridge, MA 02139, USA.
  11.  */
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <ctype.h>
  15. #include <string.h>
  16. #include <fcntl.h>
  17. #include <sys/types.h>
  18. #include <sys/wait.h>
  19. #include "sqlweb.h"
  20. /*
  21. /* Internal Private Functions....
  22.  */
  23. static eBoolean_t iCp2CookList(PI *pPI);
  24. static eBoolean_t iCp2PIList(PI *pPI);
  25. static eBoolean_t iCp2PIAList(SYMBOL *pPIA);
  26. static eBoolean_t ChopPI(PI *pPI,eBoolean_t b);
  27. /* Global Variables defined elsewhere...
  28.  */
  29. extern SQLWEB_LDA gLDA;
  30. extern eBoolean_t gbBufferOutput;
  31. /*
  32. /* Global Variables used by all modules
  33. /* but owned by this one!
  34.  */
  35. /* Global Variables Private to THIS FILE
  36.  */
  37. static LIST *glCookList
  38.    ,*glPIList
  39.    ,*glPIAList
  40. ;
  41. eBoolean_t
  42. sqlweb_if(
  43.  PI *pPI
  44. ,eBoolean_t *pbExpr
  45. )
  46. {
  47.     char sSQL[MAX_TOKVAL_SIZE];
  48.     char *pSQL, *pBuf, *pExpr;
  49.     SQLWEB_CURSOR cda;
  50.     *pbExpr = eFalse;
  51.     if(!is_casematch(pPI->pTagName,"IF")
  52. && !is_casematch(pPI->pTagName,"SQLWEB-IF"))
  53.     {
  54. MsgPush("sqlweb_if:Can't Process %s",pPI->pTagName);
  55. return(eFalse);
  56.     }
  57.     /*
  58.     /* Process IF Tag
  59.      */
  60.     (*pbExpr) = eFalse;
  61.     if(ISeTrue(GetPIAValueREF(pPI,"EXPR",&pExpr))) {
  62. if(ISeTrue(GetPIAValueREF(pPI,"EVAL",&pBuf))
  63.     && (is_casematch(pBuf,"TRUE")) )
  64. {
  65.     ExpandString(pExpr,&pBuf);
  66.     RemoveCharCodes(pBuf);
  67.     pExpr = pBuf;
  68. }
  69. sprintf(sSQL,"%s %s",gpIfExpr,pExpr);
  70. RETeFalse(DbOpenCursor(&gLDA,sSQL,&cda)
  71.  ,"DbOpenCursor Failed"
  72.  );
  73. RETeFalse(DbFetchCursor(&cda,eTrue) /* Close */
  74.  ,"DbFetchCursor Failed"
  75.  );
  76. (*pbExpr) = cda.bFound;
  77. ChopPI(pPI,(*pbExpr));
  78. /* Chop Children IFF expression is FALSE
  79.  */
  80.     } /* Got the "Required EXPR" symbol... */
  81.     return(eTrue);
  82. }
  83. eBoolean_t
  84. sqlweb_cursor(
  85.  PI *pPI
  86. ,eBoolean_t *pbExpr
  87. )
  88. {
  89.     char *pSQL, *pBuf;
  90.     SQLWEB_CURSOR cda;
  91.     LIST *lBINDList;
  92.     LIST *lTmpCookList;
  93.     LIST *lTmpPIList;
  94.     int  iLoopCount=0;
  95.     *pbExpr = eFalse;
  96.     if(!is_casematch(pPI->pTagName,"CURSOR")
  97. &&!is_casematch(pPI->pTagName,"SQLWEB-CURSOR"))
  98.     {
  99. MsgPush("sqlweb_cursor:Can't Process %s",pPI->pTagName);
  100. return(eFalse);
  101.     }
  102.     /*
  103.     /* Process a CURSOR Tag
  104.      */
  105.     DebugHTML(__FILE__,__LINE__,4,"Got a CURSOR!");
  106.     if(ISeFalse(GetPIAValueREF(pPI,"SQL",&pSQL))){
  107. pSQL= gpNullSelect;
  108.     }
  109.     if(ISeTrue(GetPIAValueREF(pPI,"EVAL",&pBuf))
  110. &&(is_casematch(pBuf,"TRUE")))
  111.     {
  112. DebugHTML(__FILE__,__LINE__,2,"Opening SQL="%s"",pSQL);
  113. ExpandString(pSQL,&pBuf);
  114. RemoveCharCodes(pBuf);
  115. pSQL = pBuf;
  116.     }
  117.     DebugHTML(__FILE__,__LINE__,2,"Opening SQL="%s"",pSQL);
  118.     RETeFalse(DbOpenCursor(&gLDA,pSQL,&cda)
  119.      ,"DbOpenCursor Failed"
  120.      );
  121.     DebugHTML(__FILE__,__LINE__,4,"Its OPEN!");
  122.     /*
  123.     /* Save the CURSOR's PI List the lBINDList.
  124.     /* and create a New, clean, consolidated list and
  125.     /* setup a global pointer to the new list.
  126.      */
  127.     lTmpCookList = glCookList;
  128.     lTmpPIList   = glPIList;
  129.     lBINDList = pPI->lPI;
  130.     pPI->lPI = l_create("QUEUE");
  131.     glPIList  = pPI->lPI;
  132.     /*
  133.     /* Fetch LOOP
  134.      */
  135.     for(iLoopCount=0;;){
  136. /*
  137. /* Do the FETCH
  138.  */
  139. DebugHTML(__FILE__,__LINE__,4
  140.     ,"Attempting a FETCH(%d)!"
  141.     ,cda.iCursorIndex);
  142. RETeFalse(DbFetchCursor(&cda,eFalse)
  143.  ,"DbFetchCursor Failed"
  144.  );
  145. if(ISeFalse(cda.bFound)) {
  146.     DebugHTML(__FILE__,__LINE__,4,"Fetch Done.");
  147.     break;
  148. }
  149. iLoopCount++;
  150. DebugHTML(__FILE__,__LINE__,4,"Got a ROW, attempting LIST Dup");
  151. /* Step 1
  152. /* Duplicate the Origional LIST to BIND to the FETCHED ROW
  153.  */
  154. if( !(glCookList = l_create("QUEUE"))) {
  155.     MsgPush("l_create(lglookList) Failed");
  156.     return(eFalse);
  157. }
  158. RETeFalse(l_scan(lBINDList,(PFI)iCp2CookList)
  159.  ,"l_scan(iCp2CookList) Failed"
  160.  );
  161. /* Step 2
  162. /* Cook the Newly build glCookList built in the above step
  163.  */
  164. RETeFalse(l_scan(glCookList,(PFI)CookPI)
  165.  ,"CookPI Failed in w/in CURSOR"
  166.  );
  167.     
  168. if(ISeTrue(gbBufferOutput)){
  169.     /* Step 3
  170.     /* Add the newly Cooked Items to the pPI-lPI LIST
  171.     /* where it belongs.
  172.      */
  173.     RETeFalse(l_scan(glCookList,(PFI)iCp2PIList)
  174.      ,"l_scan(iCp2PIlist) Failed"
  175.      );
  176. }
  177. l_destroy(glCookList);
  178.     }
  179.     /* Chop "template" Children IFF no rows processed */
  180.     if(iLoopCount==0) {
  181. ChopPI(pPI,eFalse);
  182.     }
  183.     /* Never Re-Cook Looped Stuff */
  184.     *pbExpr = eFalse;
  185.     glCookList = lTmpCookList;
  186.     glPIList   = lTmpPIList;
  187.     return(eTrue);
  188. }
  189. eBoolean_t
  190. sqlweb_while(
  191.  PI *pPI
  192. ,eBoolean_t *pbExpr
  193. )
  194. {
  195.     char *pExpr, *pBuf;
  196.     LIST *lBINDList;
  197.     LIST *lTmpCookList;
  198.     LIST *lTmpPIList;
  199.     int iLoopCount=0;
  200.     *pbExpr = eFalse;
  201.     if(!is_casematch(pPI->pTagName,"WHILE")
  202. &&!is_casematch(pPI->pTagName,"SQLWEB-WHILE"))
  203.     {
  204. MsgPush("sqlweb_while:Can't Process %s",pPI->pTagName);
  205. return(eFalse);
  206.     }
  207.     /*
  208.     /* Process a WHILE Tag
  209.      */
  210.     DebugHTML(__FILE__,__LINE__,3,"Got a WHILE!");
  211.     if(ISeFalse(GetPIAValueREF(pPI,"EXPR",&pExpr))) {
  212. DebugHTML(__FILE__,__LINE__,0
  213.  ,"WARN: No EXPR for While on line %d"
  214.  ,pPI->iLineNbr
  215.  );
  216. MsgPush("sqlweb_while:No EXPR");
  217. return(eTrue);
  218.     }
  219.     if(ISeTrue(GetPIAValueREF(pPI,"EVAL",&pBuf))
  220. &&(is_casematch(pBuf,"TRUE")))
  221.     {
  222. ExpandString(pExpr,&pBuf);
  223. RemoveCharCodes(pBuf);
  224. pExpr = pBuf;
  225.     }
  226.     /*
  227.     /* Save the WHILE's PI List the lBINDList.
  228.     /* and create a New, clean, consolidated list and
  229.     /* setup a global pointer to the new list.
  230.      */
  231.     lTmpCookList = glCookList;
  232.     lTmpPIList   = glPIList;
  233.     lBINDList = pPI->lPI;
  234.     pPI->lPI = l_create("QUEUE");
  235.     glPIList  = pPI->lPI;
  236.     /*
  237.     /* Fetch LOOP
  238.      */
  239.     for(iLoopCount=0;;){
  240. DebugHTML(__FILE__,__LINE__,2,"While-Expr="%s"",pExpr);
  241. /*
  242. /* Process EXPR
  243.  */
  244. RETeFalse2(ParseIf(pExpr,pbExpr)
  245.   ,"Failed to expand WHILE:%s"
  246.   ,pExpr
  247.   );
  248. DebugHTML(__FILE__,__LINE__,4,"While-Expr:Done:(%s %d Children)"
  249.     ,ISeFalse((*pbExpr))?"CHOP":"KEEP"
  250.     ,pPI->lPI? l_size(pPI->lPI): -1
  251.     );
  252. if(ISeFalse(*pbExpr)) {
  253.     DebugHTML(__FILE__,__LINE__,4,"While Done.");
  254.     break;
  255. }
  256. iLoopCount++;
  257. DebugHTML(__FILE__,__LINE__,4,"Got a TRUE, attempting LIST Dup");
  258. /* Step 1
  259. /* Duplicate the Origional LIST to BIND to the FETCHED ROW
  260.  */
  261. if( !(glCookList = l_create("QUEUE"))) {
  262.     MsgPush("l_create(lglookList) Failed");
  263.     return(eFalse);
  264. }
  265. RETeFalse(l_scan(lBINDList,(PFI)iCp2CookList)
  266.  ,"l_scan(iCp2CookList) Failed"
  267.  );
  268. /* Step 2
  269. /* Cook the Newly build glCookList built in the above step
  270.  */
  271. RETeFalse(l_scan(glCookList,(PFI)CookPI)
  272.  ,"CookPI Failed in w/in CURSOR"
  273.  );
  274.     
  275. if(ISeTrue(gbBufferOutput)){
  276.     /* Step 3
  277.     /* Add the newly Cooked Items to the pPI-lPI LIST
  278.     /* where it belongs.
  279.      */
  280.      RETeFalse(l_scan(glCookList,(PFI)iCp2PIList)
  281.      ,"l_scan(iCp2PIlist) Failed"
  282.      );
  283. }
  284. l_destroy(glCookList);
  285.     }
  286.     /* Chop "template" Children IFF no rows processed */
  287.     if(iLoopCount==0) {
  288. ChopPI(pPI,eFalse);
  289.     }
  290.     /* Never Re-Cook Looped Stuff */
  291.     *pbExpr = eFalse;
  292.     glCookList = lTmpCookList;
  293.     glPIList   = lTmpPIList;
  294.     return(eTrue);
  295. }
  296. eBoolean_t
  297. sqlweb_connect(
  298.  PI *pPI
  299. ,eBoolean_t *pbExpr
  300. )
  301. {
  302.     char *pBuf, *pName;
  303.     *pbExpr = eFalse;
  304.     if(!is_casematch(pPI->pTagName,"CONNECT")
  305. &&!is_casematch(pPI->pTagName,"SQLWEB-CONNECT"))
  306.     {
  307. MsgPush("sqlweb_connect:Can't Process %s",pPI->pTagName);
  308. return(eFalse);
  309.     }
  310.     if(ISeFalse(GetPIAValueREF(pPI,"NAME",&pName))) {
  311. if(ISeFalse(GetPIAValueREF(pPI,"SCHEMA",&pName))) {
  312.     /* If no name or schema; use default found in "ini" file 
  313.      */
  314.     RETeFalse(DbConnect(0,&gLDA),"Failed to CONNECT to Database");
  315.     return(eTrue);
  316. }
  317.     }
  318.     ExpandString(pName,&pBuf);
  319.     RemoveCharCodes(pBuf);
  320.     pName = pBuf;
  321.     RETeFalse(DbConnect(pName,&gLDA),"Failed to CONNECT to Database");
  322.     *pbExpr = eFalse;
  323.     return(eTrue);
  324. }
  325. static eBoolean_t
  326. iCp2CookList(
  327.  PI *pPI
  328. )
  329. {
  330.     PI *pPI2;
  331.     LIST *lTmpList = glCookList;
  332.     DebugHTML(__FILE__,__LINE__,5,"iCp2CookList(%s)", pPI->pTagName);
  333.     pPI2 = NewPI();
  334.     if(!pPI2){
  335. MsgPush("NewPI failed");
  336. return(eFalse);
  337.     }
  338.     /* (void)memset(pPI2,0,sizeof(PI));
  339.      */
  340.     pPI2->iLevel = pPI->iLevel;
  341.     pPI2->pTagName = DupBuf(pPI->pTagName);
  342.     pPI2->pPiContents = DupBuf(pPI->pPiContents);
  343.     pPI2->pTag = pPI->pTag;
  344.     pPI2->pPIContext = pPI->pPIContext;
  345. /* Works only if pPIContext does NOT BIND
  346.  */
  347.     pPI2->lPI = l_create("QUEUE");
  348.     pPI2->lPIA = l_create("INORDER"); /* Searchable... */
  349.     pPI2->iLineNbr = pPI->iLineNbr;
  350.     glPIAList = pPI2->lPIA;
  351.     RETeFalse(l_scan(pPI->lPIA,(PFI)iCp2PIAList)
  352.      ,"Failed to Duplicate PIA List"
  353.      );
  354.     /* Add self to current COOK List
  355.      */
  356.     RETeFalse(ENQ(glCookList,pPI2)
  357.      ,"Cp2CookList:ENQ Failed"
  358.      );
  359.     glCookList = pPI2->lPI;
  360.     RETeFalse(l_scan(pPI->lPI,(PFI)iCp2CookList)
  361.      ,"Failed to Duplicate Cooked List"
  362.      );
  363.     glCookList = lTmpList;
  364.     return(eTrue);
  365. }
  366. static eBoolean_t
  367. iCp2PIList(PI *pPI)
  368. {
  369.     DebugHTML(__FILE__,__LINE__,4,"iCp2PIList(%s)", pPI->pTagName);
  370.     RETeFalse(ENQ(glPIList,pPI)
  371.      ,"Cp2PIList:ENQ Failed"
  372.      );
  373.     return(eTrue);
  374. }
  375. static eBoolean_t
  376. iCp2PIAList(SYMBOL *pPIA)
  377. {
  378.     SYMBOL *pSym;
  379.     pSym = NewPIA();
  380.     if(!pSym){
  381. MsgPush("NewPIA failed");
  382. return(eFalse);
  383.     }
  384.     pSym->iType = pPIA->iType;
  385.     pSym->pName = DupBuf(pPIA->pName);
  386.     pSym->pValue = DupBuf(pPIA->pValue);
  387.     pSym->esDataType = pPIA->esDataType;
  388.     return(ENQ(glPIAList,pSym));
  389. }
  390. eBoolean_t
  391. sqlweb_include(PI *pPI
  392. ,eBoolean_t *pbExpr
  393. )
  394. {
  395.     char sFileName[BUFSIZ];
  396.     char *pFieldName
  397.       ,*pExpandedName
  398.       ,*pType
  399. ;
  400.     PAGE *pPage;
  401.     *pbExpr = eTrue;
  402.     if(!is_casematch(pPI->pTagName,"INCLUDE")
  403. && !is_casematch(pPI->pTagName,"SQLWEB-INCLUDE"))
  404.     {
  405. MsgPush("sqlweb_include:Can't Process %s",pPI->pTagName);
  406. return(eFalse);
  407.     }
  408.     /*
  409.     /* The INCLUDE Tag
  410.      */
  411.     /*
  412.     /* Get the NAME Attribute
  413.      */
  414.     if(ISeFalse(GetPIAValueREF(pPI,"NAME",&pFieldName))){
  415. /* Get the FILENAME Attribute, for backward compat.
  416.  */
  417. if(ISeFalse(GetPIAValueREF(pPI,"FILENAME",&pFieldName))){
  418.     /* Get the PAGENAME Attribute, for backward compat.
  419.      */
  420.     if(ISeFalse(GetPIAValueREF(pPI,"PAGENAME",&pFieldName))){
  421. DebugHTML(__FILE__,__LINE__,0,"Nothing to INCLUDE.");
  422. return(eTrue);
  423.     } else {
  424. DebugHTML(__FILE__,__LINE__,0
  425.     ,"Warning, replace old PAGENAME attribute with FILENAME");
  426.     }
  427. }
  428.     }
  429.     ExpandString(pFieldName,&pExpandedName);
  430.     /*
  431.     /* Pagename starts with '/' then it's based on SQLWEB_DOC_ROOT
  432.      */
  433.     if(*pExpandedName=='/') {
  434. char *pIncRoot;
  435. if(ISeFalse(GetSymbolValueREF("SQLWEB_DOC_ROOT",&pIncRoot))) {
  436.     DebugHTML(__FILE__,__LINE__,0
  437.      ,"Warning: SQLWEB_DOC_ROOT not found in sqlweb.ini."
  438.      );
  439.     return(eTrue);
  440. }
  441. sprintf(sFileName,"%s%s",pIncRoot,pExpandedName);
  442.     }
  443.     /*
  444.     /* else its relative to current file.
  445.      */
  446.     else {
  447. char *pDirName = strrchr(gpFileName,'/');
  448. if(pDirName) {
  449.     char *p = gpFileName;
  450.     int i;
  451.     for(i=0,p=gpFileName;(p<pDirName);i++,p++)
  452. sFileName[i]=*p;
  453.     sFileName[i++]='/';
  454.     sFileName[i++]=0;
  455.     strcat(sFileName,pExpandedName);
  456. } else {
  457.     sprintf(sFileName,"./%s",pExpandedName);
  458. }
  459.     }
  460.     /*
  461.     /* Get the FILETYPE Attribute
  462.      */
  463.     if(ISeFalse(GetPIAValueREF(pPI,"TYPE",&pType))){
  464. if(ISeFalse(GetPIAValueREF(pPI,"FILETYPE",&pType))){
  465.     pType="SQLWEB";
  466. }
  467.     }
  468.     DebugHTML(__FILE__,__LINE__,3,"Loading: %s (type=%s)",sFileName,pType);
  469.     if(is_casematch(pType,"SQLWEB")) {
  470. if(ISeFalse(LoadHTML(sFileName,&pPage))){
  471.     DebugHTML(__FILE__,__LINE__,0
  472.      ,"INCLUDE: Failed to load html: %s", sFileName
  473.      );
  474.     return(eTrue);
  475. }
  476. /*
  477. /* Now that the new page is loaded use its 
  478. /* PI-List as this PI's PI-List
  479.  */
  480. pPI->lPI = pPage->lPI;
  481. return(eTrue);
  482.     }
  483.     if(ISeFalse(LoadTEXT(sFileName,pType,pPI))){
  484. DebugHTML(__FILE__,__LINE__,0
  485.  ,"INCLUDE: Failed to load %s file: %s"
  486.  ,pType
  487.  ,sFileName
  488.  );
  489. return(eTrue);
  490.     }
  491.     return(eTrue);
  492. }
  493. /*
  494. /* overrides the default IF processing depending on DB...
  495.  */
  496. eBoolean_t
  497. sqlweb_if2(
  498.  PI *pPI
  499. ,eBoolean_t *pbExpr
  500. )
  501. {
  502.     char *pExpr, *pBuf;
  503.     *pbExpr = eFalse;
  504.     if(!is_casematch(pPI->pTagName,"IF2")
  505. && !is_casematch(pPI->pTagName,"SQLWEB-IF2")
  506. && !is_casematch(pPI->pTagName,"SQLWEB-SYMBOL")
  507. && !is_casematch(pPI->pTagName,"SYMBOL"))
  508.     {
  509. MsgPush("sqlweb_if2:Can't Process %s",pPI->pTagName);
  510. return(eFalse);
  511.     }
  512.     /*
  513.     /* Process IF2 Tag
  514.      */
  515.     (*pbExpr) = eFalse;
  516.     if(ISeTrue(GetPIAValueREF(pPI,"EXPR",&pExpr))) {
  517. if(ISeTrue(GetPIAValueREF(pPI,"EVAL",&pBuf))
  518.     && (is_casematch(pBuf,"TRUE")) )
  519. {
  520.     ExpandString(pExpr,&pBuf);
  521.     RemoveCharCodes(pBuf);
  522.     pExpr = pBuf;
  523. }
  524. DebugHTML(__FILE__,__LINE__,3,"Expr="%s"",pExpr);
  525. RETeFalse2(ParseIf(pExpr,pbExpr)
  526.   ,"Failed to expand IF:%s"
  527.   ,pExpr
  528.   );
  529. ChopPI(pPI,(*pbExpr));
  530. /* Chop Children IFF expression is FALSE
  531.  */
  532.     } /* Got the "Required EXPR" symbol... */
  533.     return(eTrue);
  534. }
  535. eBoolean_t
  536. sqlweb_host(
  537.  PI *pPI
  538. ,eBoolean_t *pbExpr
  539. )
  540. {
  541.     char sBuf[MAX_TOKVAL_SIZE]
  542. ,*p;
  543.     char *pCmd, *pOutput, *pBuf;
  544.     int c, iCharCount, iStatus;
  545.     FILE *pF;
  546.     DebugHTML(__FILE__,__LINE__,3,"Host");
  547.     *pbExpr = eTrue;
  548. #ifdef WIN32
  549.     MsgPush("SQLweb/NT: Doesn't Support HOST");
  550.     return(eTrue);
  551. #endif
  552. #ifndef WIN32
  553.     if(!is_casematch(pPI->pTagName,"HOST")
  554. && !is_casematch(pPI->pTagName,"SQLWEB-HOST"))
  555.     {
  556. MsgPush("sqlweb_host:Can't Process %s",pPI->pTagName);
  557. return(eFalse);
  558.     }
  559.     /*
  560.     /* Get the CMD Attribute
  561.      */
  562.     if(ISeFalse(GetPIAValueREF(pPI,"CMD",&pCmd))){
  563. DebugHTML(__FILE__,__LINE__,1,"W:No "CMD" Attribute");
  564. return(eTrue);
  565.     }
  566.     ExpandString(pCmd,&pBuf);
  567.     pCmd = pBuf;
  568.     DebugHTML(__FILE__,__LINE__,3,"Running: (%s)",pCmd);
  569.     /*
  570.     /* Get the OUTPUT Attribute
  571.      */
  572.     if(ISeTrue(GetPIAValueREF(pPI,"OUTPUT",&pOutput))
  573. && is_casematch(pOutput,"FALSE"))
  574.     {
  575. *pbExpr = eFalse;
  576.     }
  577.     pF = popen(pCmd,"r");
  578.     if(!pF){
  579. MsgPush("sqlweb_host:Can't popen(%s,"r")", pCmd);
  580. return(eFalse);
  581.     }
  582.     DebugHTML(__FILE__,__LINE__,3,"Open'd(%x)",pF);
  583.     for( c=fgetc(pF), iCharCount=0, p=sBuf
  584. ;c != EOF
  585. ;c=fgetc(pF), iCharCount++ )
  586.     {
  587. if(iCharCount<sizeof(sBuf))
  588.     *p++ = (char)c;
  589.     }
  590.     *p = 0;
  591.     DebugHTML(__FILE__,__LINE__,3,"Read %d chars",iCharCount);
  592.     iStatus = pclose(pF);
  593.     DebugHTML(__FILE__,__LINE__,3,"popen:%d:%d",iStatus,c);
  594.     if(sBuf[0]) {
  595. FreeBuf(pPI->pPiContents);
  596. pPI->pPiContents= DupBuf(sBuf);
  597. SELSym("SQLWEB_HOST_OUTPUT",pPI->pPiContents);
  598.     }
  599.     return(eTrue);
  600. #endif
  601. }
  602. /*
  603. /* This one is not yet ready for prime time-- it would be best
  604. /* to run "CookPI" to an alternate buffer, and then run
  605. /* LoadHTML on the alternate buffer to reparse the output
  606. /* -- that would be a "read" EVAL
  607. /*
  608. /* This one just DON'T WORK!
  609.  */
  610. eBoolean_t
  611. sqlweb_eval(
  612.  PI *pPI
  613. ,eBoolean_t *pbExpr
  614. )
  615. {
  616.     eBoolean_t b = gbBufferOutput;
  617.     DebugHTML(__FILE__,__LINE__,0,"EVAL:Pass1n");
  618.     gbBufferOutput=eTrue;
  619.     if(ISeFalse(l_scan(pPI->lPI,(PFI)CookPI))) {
  620. MsgPush("EVAL: pass1 failed");
  621. return(eTrue);
  622.     }
  623.     DebugHTML(__FILE__,__LINE__,0,"EVAL:Pass2n");
  624.     gbBufferOutput=b;
  625.     if(ISeFalse(l_scan(pPI->lPI,(PFI)CookPI))) {
  626. MsgPush("EVAL: pass1 failed");
  627. return(eTrue);
  628.     }
  629.     *pbExpr = eTrue;
  630.     return(eTrue);
  631. }
  632. eBoolean_t
  633. sqlweb_demo(
  634.  PI *pPI
  635. ,eBoolean_t *pbExpr
  636. )
  637. {
  638.     pPI->pPiContents="This is a Demo, ::HOME = ':home', this is only a demo";
  639.     *pbExpr = eTrue;
  640.     return(eTrue);
  641. }
  642. static eBoolean_t
  643. ChopPI(PI *pPI,eBoolean_t bExpr)
  644. {
  645.     DebugHTML(__FILE__,__LINE__,3,"ChopPI(%s:%s %d Children)"
  646.     ,pPI->pTagName
  647.     ,ISeFalse(bExpr)?"CHOP":"KEEP"
  648.     ,pPI->lPI? l_size(pPI->lPI): -1
  649.     );
  650.     if(ISeFalse(bExpr)) {
  651. if(ISeTrue(gbBufferOutput)){
  652.     pPI->lPI = l_create("QUEUE");
  653.     pPI->pPiContents = DupBuf(0);
  654. } else {
  655.     FreePI(pPI);
  656. }
  657.     }
  658.     DebugHTML(__FILE__,__LINE__,5,"ChopPI:Done.");
  659.     return(eTrue);
  660. }