 Ok, same thing, completely different, no? It's about base, base is also deep roughness application. Not every time that we hear about dark base. Ok, but, to myself, just to know I'm local, so I take my car, it's morning, it's evening, it's time. I contributed to deep roughness so far with library which is called access to base, access to base. The idea behind was that there are millions of Microsoft Access users. Every user had once to make something in VBA, Visual Basic for Applications. And if he wanted to migrate something to LibreOffice, he had to know and to like, you know, and that was a very high barrier. So I made once and I proposed it to LibreOffice, which I looked at it, to make a basic library which emulates the old API that is available within Visual Basic for Applications for Microsoft Access applications. Two or three years ago, I had to go on a Microsoft site with the presence of 1,000, 1,000 MS Access database files. They are all were built or formatted in Microsoft Access 97 internal format and you know Microsoft. Well, with MS Office 2013, you could not even read them. So I had to do something as a consultant to find a solution and I started scripting something that went inside the databases to produce, well, an idea of what there was inside. And last month, I was convinced that not the same situation but the demand could exist to have some tool that could have a look inside LibreOffice base database files and know what there was inside to document them. That was the idea of base document. I don't know. The concept is the same as before but it was completely different. My aim is to share the ideas here around that. It will be published as an extension on the extension site of LibreOffice and OpenOffice. It will require LibreOffice 6.0 because I put in the access to this library some hidden entries or functionalities that I needed for base document. It should also work on OpenOffice with the access to base 1.8.0 version. Maybe also with older LibreOffice versions in the same situation but this is not worth it. What does base documenter here? It scans an existing base application. Everything it finds in that base application is stored in the repository, the items, of course, labels, queries, whatever and certainly the relations between them. This is essential because every documentation that you make about such an application requires that you can identify impacts when changed to come. And finally it produces a really good report. I have chosen here a certain format for that report but as soon as there exists a repository you can produce any report that you want. If you script something or you want to design something different. The idea here was to produce a report in HTML with all relations between objects identified as hyperlinks so that you can jump from one page to the other just to know whether I have queries using a table what is the table what. So the process is quite easy. The user opens its database file .odb file, starts with a button or menu item, starts the execution of a process. The odb file must be opened without the makers activating it. So the database is scanned, it is the first step and everything is stored in the repository. This is the second step that it will produce the report. You can shame them of course but it is the second step because you can choose you can opt for making the report for instance for all available databases at once. So all the relations will be represented as hyperlinks. This is fundamental in the resumption. And we will use the notation a query uses a table and the table is used by a query. It is of course symmetric. You must be able to identify from a table which are the queries that are using that table and you can jump from the query which are the tables used by the query. So symmetry is important and for impact changes you must be able to go in both directions. So what are the relations that you can identify in such a base application? There are many. Of course you have parent-child relations that are obvious but they are not a topic here but you have a huge number of impacts. And a central point is that you can have anything impacted in procedures. If you write some basic procedure the change is great that you can impact everything that you have in your context. Also a procedure can be impacted because it causes another procedure and also those impacts and respective impacts have to be identified. You have also all the list of the new list of the objects that are managed by this piece of code. Dialogs, forms, controls which are parts of forms or controls with controls that you can have in the forms. Table queries, fields that can be part of tables or queries and procedures. You have also toolbar controls and also software. The repository is very, very simple to table. Table of databases and table of objects. What is relevant here? Well, a number of properties or settings are just stored as an adjacent string. Very easy to solve. You can always store, in fact, anything very easily in a saturated string. So you have a number of fields that are just low voucher fields that you can store adjacent string in here. And you have also the two uses and used by items which is just a comma-separated list of item indexes. So the scan has to go everywhere through the data application to produce that database. Then the database is read to build HTML that I want to show briefly. You will start from table of content. You have here two databases stored in the repository. They are quite complex because you see there a number of items that you write in of each sort. And if I simply click on the list of 15 database tables here, jump to another page. The page has one table with the data that we are looking for. And it's stored in a template where you can put some tokens like you have there in the white box. And you can have a table view of your local table of content. I mean the table of content of the database I'm looking at. And you can have a tree view probably produced, but it's just an all the list of items in HTML. And this makes that I can jump to any of them with basically. And here a very easy list of tables in the name. Then used by, because of course the table never uses something else, but it's often used by another item. And for instance, here I have table article which is used by a query called make table one. Here you have the data about queries. I have a list of queries. The make table is one of them. I have a number of columns here. I can of course go again the column used by, I can load how query is used. It can be a procedure, it can be another query. There is also a SQL beautifier within which you can make and find clickable items like here tables which will be to go back for instance to table article where I can find details about it. Details between the list of items of, sorry, the list of fields within the table and also just to give an idea of statistical data. It's of course optional but you can for instance find how many of these fields are known or what is the row and stream stored in that field or what is the oldest data, the newest data. This is the data field. This is statistical data. You can find also a sample of the data just 50 records at maximum of data just to have an idea of what is contained. Okay, so in the same way you can have forms for information about forms what is specific for forms you can also store screenshots of forms with the table. In the details column here we have also the list of controls that you find in the form if it has here here you have a grid control which has sub controls. Of course for controls and for forms you have also the idea of control source or source that serves as data source for the form. Okay, this gives an idea. I just want to show also that you can identify by this tool a number of items that are missing somewhere but they are not found by the tool. And you have also a full index of all the items found so there are here almost 500 names identified in the application. So I go back to my slides just to say that you can store of course the tables, sorry the data which is in fact identified here by this token here you can put it in a template which makes that you can configure or design your page whichever mode that you want. You can also associate style sheets and so define your style sheets a number of styles to have a nice design. And in fact you can I didn't show it, I want to show here that with styles you can for instance make that your scripts are readable it's about the same styles that I used in the basic IDE so that's how I design the styles but you can design them as you want and also there for instance here you have a goal another procedure with an argument so you have here this of style names that you can use in your template to make it you have also an API in the sense that most of these functions will be executed from some button or menu item but you can also make your own macro to make your own scenario based on this API the most used will be just scan and do this way it's the most easy and does everything you can choose to make your HTML output either with user interface or not just you can of course choose the default but you can also make in your scenario that everything is made without a user interface now that's the back news the performance today for the databases that I showed here of course the databases are quite huge and important and you have usually more items this is the performance today on my own PC it's not the slowest PC that you can find it's a little bit fast so this is the back news the scan takes for the first you see 2 minutes and then 134 generating the HTML pages so I have enough IDs to optimize that and of course it's a work in progress it's not yet published but I hope to make it better and maybe not for the first version what I still have to do now is using the face for the different settings it's not yet made because in the settings you can you can choose do you want a table statistics or not you can switch them off for that one so what is causing the performance is the table statistics and the size of the tables will not be compressed what is and then the passes are quite slow because of the rhythm a short passer a short short and then the basic pass goes another time I have not yet not yet developed the path for keys and tables and I have to test the software on a number of keys that I can find everywhere on forums and I have to test it on serious basic libraries it's 10,000-15,000 bytes of code and in later versions I could include reports which are not included yet I rewrite the passes in Python the only Python part in this piece of code you know really the Python is for the ending of JSON I would like to make it also really firebird instead of SQLDB because the repository is just a standard base file but today firebird lacks for the work is lacks a number of field types I need a long voucher type for instance but it does not exist yet probably planned for future okay thank you my time is