Banktransacties importeren

Scanner met opslag

Behalve controleren doet bovenstaande scanner/parser nog niet zoveel. Om iets met de gegevens te doen moeten we ze onthouden zodat we ze straks aan de MySQL database kunnen toevoeren. We moeten dus code toevoegen die het onthouden mogelijk maakt. Moeten we het gehele bestand onthouden? Nee, het bestand is regel voor regel opgebouwd en de parser is ook zo opgesteld dat we regel gewijs het bestand doorlopen. We hoeven dus slechts één regel tegelijk te onthouden. In de afbeelding Opslag is te zien hoe we regels gaan opslaan.

Graphic3

Het opslaan van een regel uit het invoerbestand

Alle achtereenvolgende woorden uit de regel worden gescheiden door einde-van-string-tekens (0x0), opgeslagen in het array opslag[]. Op het moment dat de scanner aangeeft dat hij een nieuw woordgevonden heeft, zal dit woordopgeslagen worden. Dit woord, dat zich in yytext[] bevindt wordt dan opgeslagen door de C-functie voegtoe() aan te roepen.
De functie voegtoe() zal eerst beschreven worden:

#define MAXSIZE 100 /* maximaal 100 tekens per regel */
#define NULL_PTR ((void *) 0)
 
char opslag[MAXSIZE]; /* hier slaan we de tekst in op */
int idx = 0; /* index in opslag[], hier gaan we opslaan */
 
char *voegtoe(char *ptr) /* wijst naar de toe-te-voegen-tekst */
{
  int len = strlen(ptr)+1; /* vwg de 0x0, eentje bijtellen */
  char *tmp = NULL_PTR; /* wijst naar opgeslagen tekst */
 
  if ( MAXSIZE - idx >= len )
  {
    tmp = &opslag[idx]; /* hier gaan we opslaan ... */
    strcpy(tmp, ptr); /* sla op .... */
    idx += len; /* en pas de index aan */
  }
  return tmp;
}

Na het bepalen van de lengte van de toe te voegen tekst wordt gekeken of er nog ruimte is, is deze er dan wordt de tekst opgeslagen en een wijzer naar deze tekst wordt geretourneerd. Is de ruimte niet meer voorhanden dan wordt een nul-wijzer geretourneerd. Let op: dit impliceert dat fn ook de melding "syntax error" genereert als er geen ruimte meer is in opslag[]!

Bug (juli 2006)

En het hier boven genoemde gedrag openbaarde zich in juli 2006: in de export vanaf ABNAMRO zat een Omschrijving die ca. 350 tekens lang was. Deze pastte niet in opslag[] want MAXSIZE stond op 300. Om deze lange string te kunnen opslaan is MAXSIZE op 500 gezet.

#define MAXSIZE 500

Vervolgens moet deze string in een query ingebouwd worden, ook deze query wordt in een string variabele opgeslagen, en vanwege vergroting van de input string moet ook de grootte van deze query aangepast worden. In de functie FNDB_store[] vinden we:

ASCII qry[800];

Tot slot moet Omschrijving opgeslagen kunnen worden, hiertoe is het betreffende veld omgezet in de MySQL database van type VARCHAR 250 naar het type TEXT. TEXT laat velden toe van enkele duizenden tekens.

Een en ander betekent dat de grootte van de toelaatbare Omschrijving is opgerekt maar daarmee niet fundamenteel goed is aangepakt. Er is nog ruimte voor verbeteren!

$Id: hfst32.html,v 1.20 2016/07/29 18:37:16 luc Exp $Valid XHTML 1.0! Valid CSS 1.0!