Lähde tietovirta

Kaikki oikeudet tietenkin pidätetään.

Viimeinen versio ohjelmasta löytyy seuraavasta linkistä: moijari.com:5002

Olen välillä miettinyt ohjelman sorsien julkaisua, ja ajattelinkin taas julkaista pienen pätkän, jonka kirjoitin sunnuntaina. Se tekee vierasavainten käsittelyn. Esimerkiksi tilauksessa on tietoja jotka haetaan toisista sovelluksista esimerkiksi asiakas ja tuote. Ohjelman pätkä päättelee mitkä kentät pitää hakea ja sijoittaa ne sovelluksen kenttiin. Löytyi (mätsää tasan yhtä tietuetta) rutiinista puuttuu vielä jotain..

Tätä ei voi vielä kokeilla lelusovelluksessa, sen html osuus kaipaa pikku muutoksia. Seuraavana ovat nuo html osuudet ja sitten output tietovirrat.

Huomasin sisennyksiä tehdessäni, että ohjelmassa on ainakin yksi bugia, voit harjoitukseksi etsiä sen/ne. En alkanut korjata niitä lennossa, se ei kuitenkaan olisi mennyt oikein.

Ihan lopussa vielä nuo löytyi fprintäffät:

/* (C)1998-2014 Jari Kuivaniemi, All rights reserved! */
if(setuser!=NULL) { /* Näytöllä kenttiä */
  char kentta[64],kentta2[64],kentta3[64],kentta4[64];
  char savekentta2[64],savekentta3[64],savekentta4[64];
  char value[128];
  int c,longest;
  char *bones,*bones2;
  struct set *setinputdata,*sid;

  setallfields=NULL;

  /* Haetaan kaikki tertussa olevat kentät */
  skk_fetch2(&setallfields,"'memberid'",skk);
  sprintf(temps,"'sovellus', 'fromsovellus', 'tosovellus'=\"%s\"",sovellus);
  skk_fetch2(&setflow,temps,skk); /* Haetaan kaikki tätä sovellusta koskevat virrat */
  setf=setflow;

  while(setf!=NULL) { /* Selataan kaikki virrat */

 /* Haetaan sovelluksen nimi, lähdesovellus ja kohdesovellus */

    set_get_element("sovellus",&comp,sovellusname,setf->data);
    set_get_element("fromsovellus",&comp,fromsovellusname,setf->data);
    set_get_element("tosovellus",&comp,tosovellusname,setf->data);

    /* Jos tämä sovellus on kohdesovelluksena (tämän input) */
    if(!strcmp(tosovellusname,sovellus)) {
      /* Haetaan lähdesovelluksen kentät */
      sprintf(temps,"'sovellus'=\"%s\", 'memberid'",fromsovellusname);
      skk_fetch2(&setfromfields,temps,skk);

      /* Haetaan lähdesovelluksen kentät */
      sprintf(temps,"'sovellus'=\"%s\", 'memberid'",tosovellusname);
      skk_fetch2(&settofields,temps,skk);

      setff=setfromfields;
      bones=NULL;
      first=0;
      while(setff!=NULL) { /* Käydään läpi from kentät */
        /* Haetaan kentän nimi */
        set_get_element("memberid",&comp,kentta2,setff->data);
        longest=0; /* Haetaan pisintä yhteistä osaa, joka on tertun kentissä */
        savekentta2[0]='\0';
        savekentta3[0]='\0';
        settf=settofields;
        while(settf!=NULL) { /* Haetaan läpi to kentät */
          set_get_element("memberid",&comp,kentta3,settf->data);
          setaf=setallfields;
          while(setaf!=NULL) { /* Käydään läpi kaikki kentät */
            set_get_element("memberid",&comp,kentta4,setaf->data);
            /* Jos to kenttä ja from kenttä mätsäävät samaan tertun
             * kenttään, etsitään pisin mätsäävä.
             */
            if( (strstr(kentta2,kentta4)!=NULL) && /* from */
              (strstr(kentta3,kentta4)!=NULL) ) { /* to field */
              if((c=strlen(kentta3))>longest) {
                longest=c;
                strcpy(savekentta3,kentta3);
                strcpy(savekentta4,kentta4);
              }
            }
            setaf=setaf->next; /* Seuraava tertun kenttä */
          }
          settf=settf->next; /* Seuraava to kenttä */
        }
        if(longest>0) { /* Jos löytyi talletetaan kenttäpari */
          sprintf(temps,"'%s'='%s'",savekentta3,kentta2);
          set_add_element_noquotes(&bones,temps);
        }
        setff=setff->next; /* Seuraava from field */
      }

      if(setfromfields!=NULL)
        set_free(setfromfields);
        setfromfields=NULL;
        if(settofields!=NULL)
          set_free(settofields);
        settofields=NULL;

      setu=setuser; /* JariK 20141116 */
      while(setu!=NULL) {
        bones2=NULL;

        p=bones;
        while(*p!='\0') {
          set_get_next_equals(kentta,kentta2,&p);
          set_get_element(kentta,&comp,value,setu->data);
          if(value[0]!='\0')
            sprintf(temps,"'%s' = \"%s\"",kentta2,value);
          else
            sprintf(temps,"'%s'",kentta2,value);

          set_add_element_noquotes(&bones2,temps);
        }

        setinputdata=NULL;
        skk_fetch2(&setinputdata,bones2,skk);

         c=0;
         sid=setinputdata;
         while(sid!=NULL) {
           c++;
         sid=sid->next;
       }

       if(c==1) {
         fprintf(stdout,"*** LÖYTYI ***\n");
         fprintf(stdout,"bo[%s]b\n",bones);
         fprintf(stdout,"b2[%s]b\n",bones2);
         fprintf(stdout,"fo[%s]\n",setinputdata->data);
         fprintf(stdout,"da[%s]\n",setu->data);
       }

       if(setinputdata!=NULL)
         free(setinputdata);
       setinputdata=NULL;
       if(bones2!=NULL)
         free(bones2);
       bones2=NULL;

       setu=setu->next;
     }
     if(bones!=NULL)
       free(bones);
     bones=NULL;
   }
   setf=setf->next;
 }
 if(setallfields!=NULL)
 set_free(setallfields);
 setallfields=NULL;

*** LÖYTYI ***
bo['tilauksen asiakkaan nimi'='asiakkaan nimi', 'tilauksen asiakasnumero'='asiakasnumero']b
b2['asiakkaan nimi', 'asiakasnumero' = "1000"]b
fo['asiakkaan nimi'="Vene Oy", 'asiakasnumero'="1000"]
da['tilauksen asiakasnumero'="1000", 'tilauksen asiakkaan nimi'="", 'tilausnumero'="", 'tilauspäivä'="", 'tilauksen summa'=""]
*** LÖYTYI ***
bo['tilauksen tuotenumero'='tuotenumero', 'tilauksen tuotteen nimi'='tuotteen nimi', 'tilauksen tuotteen hinta'='tuotteen hinta']b
b2['tuotenumero' = "3000", 'tuotteen nimi', 'tuotteen hinta']b
fo['tuotenumero'="3000", 'tuotteen nimi'="Soutuvene", 'tuotteen hinta'="500"]
da['rivin summa'="", 'tilattu määrä'="", 'tilauksen tuotenumero'="3000", 'tilauksen tuotteen hinta'="", 'tilauksen tuotteen nimi'="", 'tilausnumero'="", 'tilausrivin numero'=""]