Ga naar inhoud
  • 0

Gezocht: Praktische manier MySQL Blobs te importeren


dudematters

Vraag

Heeft er iemand een mooie routine gemaakt die een MySQL blob goed kan importeren naar een FMA14 container veld?

 

Ik heb behoorlijk rond 'geneusd' en de mogelijkheden van Base64 conversie overwogen, maar dat is te groot. Ik heb een aantal web-formulieren waarin klanten bestanden kunnen uploaden tot 5GB. Ik weet van te voren niet wat dit voor bestanden zijn, JPG, PNG, PDF, DOC(X), XLS(X), vrij veel is mogelijk. Deze worden netjes in MySQL opgeslagen in een BLOB.

 

Ik heb een ODBC koppeling tussen FM en MySQL via de opendatabases ODBC van ActualTech, dat werkt prima, de data komt ook goed binnen. De ontwikkelaar van ActualTech schrijft dat ik een BASE64 conversie moet maken, maar op grote bestanden is dit wel heel veel overhead. Ik had ook al even gekeken naar plugins, maar blijkbaar is dit een heel lastig verhaal. Troi FilePlugin kon ik zo geen oplossing in zien, ook niet bij 24U. MBS bied wel wat mogelijkheden maar ook daar moet ik eigenlijk van te voren het formaat weten....

 

Ik kan me moeilijk voorstellen dat ik de enige ben met dit probleem.... dus vandaar mijn vraag, heeft iemand al eens zoiets geschreven wat werkt en wil dit delen (evt. tegen betaling).

Link naar reactie

6 antwoorden op deze vraag

Aanbevolen berichten

  • 0

Samen met de makers van MBS http://www.monkeybreadsoftware.de/filemaker/ een nieuwe functie gemaakt die het mogelijk maakt MySQL een type BLOB goed te importeren/converteren in FM containervelden. Christian van MBS is echt supersnel in het meedenken en aanpassen van zijn plugin! Een aanrader voor iedere serieuze FM ontwikkelaar.

 

Hierbij mijn bijdrage aan de community.

 

Ik gebruik WordPress om veel sites op te zetten. Voor alle formulieren op een site (contact, support, etc) gebruik ik ContactForm7 en om deze data niet alleen via mail te versturen gebruik in Contact Form DB https://wordpress.org/support/plugin/contact-form-7-to-database-extension om de ingevulde formulieren in de MySQL tabel te zetten. Er wordt door CFDB een nieuwe tabel aangemaakt (cf7db_submits) waarin de data wordt opgeslagen. Deze tabel heb ik uitgebreid met twee velden, ID (Auto increment, deze zit er standaard niet in 8O ) en Processed (TinyInt) die een waarde NULL heeft en op 1 gezet wordt door mijn script. In MySQL heb ik een view gemaakt om alleen de data te laten zien die niet verwerkt is en om bij BLOB velden de bestandsnaam te genereren die de MBS plugin nodig heeft om het type bestand te herkennen.

 

CFDB_View (MySQL Query)

select 
`wp_cf7dbplugin_submits`.`id` AS `id`,
`wp_cf7dbplugin_submits`.`submit_time` AS `submit_time`,
`wp_cf7dbplugin_submits`.`form_name` AS `form_name`,
`wp_cf7dbplugin_submits`.`field_name` AS `field_name`,
`wp_cf7dbplugin_submits`.`field_value` AS `field_value`,
`wp_cf7dbplugin_submits`.`field_order` AS `field_order`,
`wp_cf7dbplugin_submits`.`file` AS `file`,`wp_cf7dbplugin_submits`.`processed` AS `processed`,

if((`wp_cf7dbplugin_submits`.`field_name` = 'file'),`wp_cf7dbplugin_submits`.`field_value`,NULL) AS `file_name` 
from `wp_cf7dbplugin_submits` 
where isnull(`wp_cf7dbplugin_submits`.`processed`)

Uiteraard kan dit aangepast worden naar iedere MySQL tabel ook zonder WordPress/CF7/CF7DB.

 

In Filemaker heb ik een tabel gemaakt met dezelfde velden die ook in cf7db_submits staan, ik heb gekozen om de data raw te importeren en daarna pas alle bewerkingen erop los te laten.

 

Ik heb drie custom functions gemaakt die gebruik maken van de MBS functies om de connectie te maken, de import te regelen en de connectie te verbreken.

 

Connect_MySQL_FM14 (FM Custom Function)

Let( 
[
$$Trace = MBS("Trace");
$$Conn = MBS("SQL.NewConnection");
$result = MBS("SQL.SetClient"; $$Conn; "MySQL");
$result = MBS("SQL.SetConnectionOption"; $$Conn; "MYSQL.LIBS"; "/Library/MySQL/libmysqlclient.18.dylib");
$result = MBS("SQL.SetConnectionOption"; $$Conn; "MYSQL_SECURE_AUTH"; "FALSE");
$result = MBS("SQL.Connect"; $$Conn; "{server}@{database}"; "{user}"; "{pass}"; "MySQL")
]; $result
)

 

CFDB_Import (FM Custom Function)

Let (
   [ $Trace = MBS("Trace");

$Command = MBS("SQL.NewCommand"; $$Conn; " SELECT * From CFDB_View");
$result = MBS("SQL.Execute"; $Command);
$result = MBS("SQL.FetchNext"; $Command);

$id = MBS( "SQL.GetFieldAsNumber"; $Command; "id" );
$submit_time = MBS( "SQL.GetFieldAsNumber"; $Command; "submit_time" );
$form_name = MBS( "SQL.GetFieldAsText"; $Command; "form_name" );
$field_name = MBS( "SQL.GetFieldAsText"; $Command; "field_name" );
$field_value = MBS( "SQL.GetFieldAsText"; $Command; "field_value" );
$field_order = MBS( "SQL.GetFieldAsNumber"; $Command; "field_order" );
$file_name = MBS( "SQL.GetFieldAsText"; $Command; "file_name" );
$file = MBS( "SQL.GetFieldAsContainer"; $Command; "file"; $file_name );

$release = MBS( "SQL.FreeCommand"; $Command );

$update = "update `{database}`.`CFDB_View` SET `processed`=1 where `id`="&$id;
$proces = MBS("SQL.NewCommand"; $$Conn; $update);
$result = MBS("SQL.Execute"; $proces);
$release = MBS( "SQL.FreeCommand"; $proces )

   ]; $result
)

 

Disconnect_MySQL (FM Custom Function)

Let( 
[
$$Trace = MBS("Trace");
$result = MBS( "SQL.Disconnect"; $$Conn )
]; $result
)

 

Hiermee zijn er drie nieuwe functies in FM om verbinding te maken, records te importeren, verbinding te verbreken. De meest belangrijke functie is de MBS( "SQL.GetFieldAsContainer"; $Command; "file"; $file_name ) aangezien dit de BLOB inhoud goed in een container veld zet, met preview! De bestandsnaam die ik in mijn MySQL view genereer is hierbij bepalend om het type bestand aan FM kenbaar te maken.

 

RaRaw Import ContactFormDB MySQL (FM Script)

# Raw Import ContactFormDB MySQL
# ©2016 by MaltaCode
# C-M: 18/05/2016 - 19/05/2016
# -----------------------------------
Set Error Capture [ On ]
Go to Layout [ “WP_ContactFormDB_Import” (WP_ContactFormDB_Import) ]
Loop
Set Variable [ $GetData ; Value: WP_CFDB_Import ] 
Exit Loop If [ $submit_time = 0 ] 
New Record/Request
Set Field [ WP_ContactFormDB_Import::id ; $id ] 
Set Field [ WP_ContactFormDB_Import::submit_time ; $submit_time ] 
Set Field [ WP_ContactFormDB_Import::form_name ; $form_name ] 
Set Field [ WP_ContactFormDB_Import::field_name ; $field_name ] 
Set Field [ WP_ContactFormDB_Import::field_value ; $field_value ] 
Set Field [ WP_ContactFormDB_Import::field_order ; $field_order ] 
Set Field [ WP_ContactFormDB_Import::filename ; $file_name ] 
Set Field [ WP_ContactFormDB_Import::file ; $file ] 
End Loop

 

De versie van MBS die ik heb is wellicht nog niet gepubliceerd op de site van MBS, vraag Christiaan om deze versie. Het goed installeren van de plugin en de MySQL lib die nodig zijn staan goed beschreven op de site van MBS, het is de standaard installatie.

 

Ik hoop dat ik hiermee een hoop mensen help die FM koppelen aan MySQL en niet alleen standaard velden willen importeren maar ook digitale bestanden.

Link naar reactie
  • 0

Dank voor de info.

 

Ja, Christian Schmitz is zeker vlot met dit soort dingen, en je staat ervan te kijken hoeveel overhead FileMaker zelf soms toevoegt aan zo'n conversie. In dit geval de BASE64 decoding vs de routine die MBS gebruikt.

 

Ik heb laatst een test gedaan om uit een lijst met tekstwaarden de duplicaten te filteren. Een customfunctie (gebruikmakend van recursie) deed over 6000 items ongeveer 10 seconden. De MBS plugin deed hetzelfde klusje in 7 milliseconden (1500x zo snel).

 

Jammer dat de plugin niet onder iOS werkt...

Link naar reactie
  • 0

Mooie thread. Bedankt om dit te posten.

 

De 6.2 plug-in met de bovenvermelde functies is niet meer in beta sinds vandaag.

Ik ben al een tijdje heel jaloers aan het kijken naar die plug-in. Wij gebruiken een mic mac van verschillende plug-ins bij klanten en die kunnen bijlange niet wat Christian maakt. Een tweetal weken toch voor mezelf de knoop doorgehakt en een 5 user licentietje gekocht. Was blijkbaar besmettelijk want nu heeft een eerste grote klant ook de beslissing genomen.

Bij die klant gaan we nu alle plug-in calls stilaan converteren naar MBS functies, wat moet resulteren in het gebruik van nog slechts 1 plug-in.

 

Christian ken ik al sinds hij met zijn realbasic plug-in begon. Die man is een fenomeen. Hij geeft prima support en alles is netjes gedocumenteerd, je kan ook snel even chatten via de site als je iets wil vragen.

Link naar reactie
  • 0

Het enige lastige vind ik de documentatie. Er is wel een uitgebreide syntax beschrijving, maar niet een beschrijving in de trant van 'waar kan ik dit voor gebruiken' en 'hoe pak ik dat dan aan'.

 

Bijvoorbeeld je kunt met de MBS plugin allerlei file opraties uitvoeren, zoals verplaatsen van bestanden, aanmaken nieuwe folders, enz. Maar je moet veel verschillende functies aanroepen, terwijl je met de BaseElements plugin aan 1 call genoeg hebt.

Eigenlijk zou er nog een library met custom functies moeten komen om de MBS plugin te 'temmen'.

Link naar reactie
  • 0
Het enige lastige vind ik de documentatie. Er is wel een uitgebreide syntax beschrijving, maar niet een beschrijving in de trant van 'waar kan ik dit voor gebruiken' en 'hoe pak ik dat dan aan'.

Dit pakt bv 360Works veel beter aan met hun ScriptMaster database.

 

Bijvoorbeeld je kunt met de MBS plugin allerlei file opraties uitvoeren, zoals verplaatsen van bestanden, aanmaken nieuwe folders, enz. Maar je moet veel verschillende functies aanroepen, terwijl je met de BaseElements plugin aan 1 call genoeg hebt.

Eigenlijk zou er nog een library met custom functies moeten komen om de MBS plugin te 'temmen'.

 

Ik ben het volledig met je eens, en het was ook mijn reflex om voor de MBS plug-in een pak custom functies klaar te maken die alles een beetje beter bruikbaar zouden maken. Niet alleen custom functies zijn er nodig maar ook een aantal kwaliteits-scripts. Wat Christian als voorbeelden aanbiedt is niet goed genoeg als productie code. Volgens mij is dat ook niet zijn bedoeling en is het aan ons om dat te doen.

Dus... aan de slag...:-) What the Dude does, matters.

 

De MBS site mankeert een beetje dit "wiki" gedeelte waar iedereen een stukje code kan posten en bespreken. Misschien moet we dat hier doen. Het subforum is er alvast al een tijdje. viewforum.php?f=49

ALs we 1 thread per component van de documentatie maken, dan kan dit een gemakkelijk raadpleegbare "1 op 1" toevoeging zijn aan de documentatie. Dit zou dus onder een onderwerp "SQL" vallen en de starter van de thread geniet bekendheid tot het eind van zijn of haar dagen... :-)

Link naar reactie

Doe mee aan dit gesprek

Je kunt dit nu plaatsen en later registreren. Indien je reeds een account hebt, log dan nu in om het bericht te plaatsen met je account.

Gast
Beantwoord deze vraag...

×   Geplakt als verrijkte tekst.   Plak in plaats daarvan als platte tekst

  Er zijn maximaal 75 emoji toegestaan.

×   Je link werd automatisch ingevoegd.   Tonen als normale link

×   Je vorige inhoud werd hersteld.   Leeg de tekstverwerker

×   Je kunt afbeeldingen niet direct plakken. Upload of voeg afbeeldingen vanaf een URL in

×
×
  • Nieuwe aanmaken...