\ 4tH - CSV2SQL - Copyright 2009 J.L. Bezemer \ You can redistribute this file and/or modify it under \ the terms of the GNU General Public License \ Experimental program to convert the CSV trigger files from MySQL \ to executable MySQL scripts. USE AT YOUR OWN RISK! include lib/scanskip.4th char , constant comma \ comma character char " constant quote \ quote character 10 constant lf \ linefeed character 8 constant #fields \ number of fields in trigger CSV 32768 constant /buffer \ size of CSV buffer struct \ structure holding the trigger 32 +field triggername \ name of the trigger 16 +field event \ event triggering the trigger 32 +field sqltable \ table of trigger 1024 +field statement \ trigger code 64 +field timing \ triggers before or after event end-struct /trigger /trigger string trigger \ trigger structure allocation /buffer string buffer \ buffer allocation : field> >in +! quote parse ; \ get a field : record> lf parse 2drop ; \ drop a field : usage abort" Usage: csv2sql csv-file sql-file" ; : Postprocess ." DELIMITER ;" cr ; \ restore delimiter : .sql -trailing dup if 4 spaces type cr else 2drop chop then ; : Preprocess refill 0= abort" Cannot read header" \ read header 0 begin comma parse while drop 1+ repeat \ count # of fields drop #fields <> abort" Not a trigger CSV" \ check on # of fields buffer /buffer 2dup accept \ read in entire file tuck = abort" File too large" \ check size 2dup chars + 0 swap c! source! 0 >in ! \ delimit, assign buffer ." DELIMITER $$" cr cr \ write header ; : Read-file 1 field> dup >r trigger -> triggername place \ get triggername 2 field> dup r> + >r trigger -> event place \ get event 2 field> dup r> + >r trigger -> sqltable place \ get tablename 2 field> dup r> + >r trigger -> statement place \ get statement 2 field> dup r> + >r trigger -> timing place \ get timing record> r> 0<> \ skip remaining ; : Process ." CREATE TRIGGER " \ CREATE TRIGGER trigger -> triggername count type space \ write trigger name trigger -> timing count type space \ write trigger timing trigger -> event count type ." ON " \ write trigger event trigger -> sqltable count type cr \ write trigger table ." FOR EACH ROW" cr \ FOR EACH ROW trigger -> statement count 2dup \ write trigger statement bounds ?do i c@ 13 = if bl i c! then loop \ clear carriage returns begin -trailing dup while lf split .sql repeat \ write statements 2drop ." $$" cr cr \ finalize trigger ; include lib/convert.4th