summaryrefslogtreecommitdiff
path: root/support/ratexdb/README
blob: 86938720a46011f18f146204f4850ba45f687b2c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
ratexdb Version 0.14
Database Access in LaTeX
Copyright (C) 2007-2010 Robin Höns, Integranova GmbH

#    This program is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation, either version 3 of the License, or
#    (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
#
#    For more information see the web pages
#
#    Robin Höns: http://www.hoens.net/robin
#    Integranova and the Programming Machine:
#                http://www.programmiermaschine.de
#                http://www.care-t.com


1. Why ratexdb?

So there I was, wanting to do database reports. MS reporting services
gave me tendovaginitis, so why not use Latex, I thought? Quickly I
found latexdb by Hans-Georg Eßer, and I liked the idea very much.
(http://privat.hgesser.com/software/latexdb/)

However, I needed it under Windows with an ODBC data source, and 
latexdb is written in Python and Bash. My attempts to get it to run
failed, and I decided it would be more fun to rewrite it in Ruby and
include some improvements on the way.


2. I know latexdb, and I'm in a hurry. What are the improvements over
   latexdb?

- You can connect to a wide variety of data sources, as supported by
  the ruby-dbi package; see http://ruby-dbi.rubyforge.org/

- One source code file only, one language, should port easily to other
  systems.

- Latexdb writes a series of output files for nested queries. Ratexdb
  writes one output file only, nested queries are done by recursion.

- Added the \texdbif{##query}{latex stuff} command: Include "latex
  stuff" only if the query returns at least one row. This is useful
  for table headings, which can be omitted if there is no data anyway.

- In database results, Latex special characters (\, _, $, &, #, {, }
  and %) are replaced by appropriate Latex commands.

- Every variable can be included in the Latex source in one of three
  flavours:
  ##varname in Latex source, replaces Latex special characters,
  $$varname in SQL queries, replaces ' by '',
  &&varname in SQL queries, accepts numeric input only.
  The latter two are helpful to protect against SQL injection. The
  $$varname variant is meant for string constants in SQL, the
  &&varname variant for integer constants (like primary keys).

- The database results can be post-processed by regular expression
  search and replace.

- Ratexdb allows command line arguments, which can be referenced in
  the Latex source by variable names ##1, ##2, etc.

- Added the \texdbcommand{database command}, which sends SQL commands
  directly to the database.


3. What do I need?

You just need Latex and Ruby. I used Miktex and Ruby 1.8.6.


4. I am not in a hurry. How do I use it?

It's not difficult. I propose you read the very good tutorial of
latexdb at http://privat.hgesser.com/software/latexdb/ first.
There are only a few differences:

4.1. \texdbconnection

As in Latexdb, this command should not be split among several lines.
The syntax is different, though: It is the same syntax as in the Ruby
DBI package, e.g.:
\texdbconnection{dbi:odbc:mydatasource}
\texdbconnection{dbi:mysql:database,username,password}
\texdbconnection{dbi:sqlite:database}

Where mydatasource is the name of the ODBC data source or database is
the name of the database.
See http://www.kitebird.com/articles/ruby-dbi.html

I only used ODBC. I'd be happy to hear about your experience with
other databases.


4.2. \texdbdef

This command works like in Latexdb. It may be split among more than
one line, with the exception, that a closing brace should be
immediately followed by the opening brace of the following block. So,
no line breaks or other white space between them.

Also, like in Latexdb, variables should be prefix free, to avoid
confusions.

There are some additions:

4.2.1. Reference to variables in SQL

If you reference a previous database result (in nested queries) or a
command line parameter, you should not refer to it as ##var, as in
Latexdb, because then all Latex special characters will be replaced. 
But you are not in Latex, you are in SQL! So, you should write $$var
or &&var, depending on the syntax.

&&var should be used for numerical or GUID values. For example:

select first_name, last_name from person where id_person = &&idperson

The variable may contain an optional sign (+ or -), followed by
hexadecimal digits. If it contains other characters, an error is
issued.

$$var should be used for strings. E.g.:

select first_name, last_name from person where last_name ='$$lastname'

It can contain any value, but the apostroph ' will be replaced by ''. 
So, if your person is from the O';Delete family, coming from the
village of Person;--, it may well be that last_name is "O';Delete from
person;--", which could have disastrous effects when the ' is not
doubled. Search the web for SQL injection for more information.

If possible, you should prefer the &&var syntax, which is probably
safer than $$var.

4.2.2. Regular expression postprocessing

When defining a variable name, you can append a series of
"/regexp/replacement" pairs. These replacements are performed when
inserting the value in the Latex file.

Suppose your table contains a column "sex", which contains a single
"m" or "f". But you'd like to see "male" or "female" in the Latex
result. You can refer to the variable like this:

\texdbdef{##sexample}{select sex from person}{##sex/m/male/f/female}

Another example: Say, the database contains timestamp values, which
are returned in this format: 2007-11-12 10:33:36.807000000

A bit too much information, isn't it? At least, we'd like to cut off
at the point. This is done by defining the variable like this:

##timestamp/(.*)\.(.*)/\1

(To be read: First any string, then a point, then a second string, to
be replaced by the first string only.)

Regular expressions are a very powerful tool. If you don't know them,
look them up on the web.

Since version 0.12, the regular expression replace strings may contain
Latex commands. The special characters in these will not be replaced.
For example:

\texdbdef{##sexample}{select sex from 
person}{##sex/\Am\Z/\textbf{male}/\Af\Z/\textbf{female}}

(Note the \A and \Z which stand for beginning and end of the
string. Without these, "m" would be replaced by "\textbf{male}" and
afterwards by "\textb\textbf{female}{male}"!)

4.3. \texdbfor

This works just like in Latexdb.

4.4. \texdbif

This is a new command that does not exist in Latexdb. It processes a
Latex block if the given query returns at least one row. This is
useful for tabular heads which should not even appear when there is no
data at all.

Here's an example:

\texdbif{##q3}{
\subsection*{File attachments}

\begin{tabular}{lr}
  Name & Size \\
\hline
\texdbfor{##q3}{##att_name & ##att_size \\ }
\end{tabular}
}

4.5. \texdbcommand

This allows to send non-query SQL commands to the database. It is
especially useful for "SET" statements. E.g. if you wish to access a
MySQL database in UTF-8 mode, you can add this line to the TeX file:

\texdbcommand{SET NAMES utf8}

Of course, this command is only allowed after the \texdbconnection,
otherwise an error is issued.


5. Invoking ratexdb.rb

Ratexdb is called like this:

ratexdb.rb [-l|-p] [-d] <texfile.tex> [par1] [par2]...

If you give the -l parameter, the resulting texfile1.tex is processed
with latex, and the resulting texfile1.dvi is renamed as texfile.dvi.

If you give the -p parameter, the resulting texfile1.tex is processed
with pdflatex, and the resulting texfile1.pdf is renamed as
texfile.pdf.

If you give neither of these, only texfile1.tex is generated.

The -d argument turns on a rudimentary debug mode; some debug output
will be written to the file ratexdb.txt.

The source file name should always end with .tex!

Behind the name of the .tex file, you can give optional parameters,
which can be referred to in the tex file as ##1 (or $$1, &&1), ##2
etc. This is useful to generate a report for a special row, the ID of
which can be given on the command line.


6. Contact

Please, if you have a question, find a bug or like to propose an
improvement, contact me! See my web page at http://www.hoens.net/robin
for my mail address. It is really not difficult to guess, just my
first name "@" the domain mentioned above. Sorry for the guessing
game, you know what those spambots are like.


7. Acknowledgements

Many thanks to my employer, Integranova, for making software
development a breeze with the programming machine, and for letting me
publish this script under GPL.

Many thanks to Hans-Georg Eßer for LatexDb.

Many thanks to Oscar van Eijk and his SQLTeX 
http://oveas.com/freeware/overige/sqltex
for inspiring the LaTeX characters change in version 0.13.

Many thanks to François Boone for helpful comments and bugfixes.

8. Release history

2010-09-30 ratexdb 0.14

Added \texdbcommand.
Replaced ftools by FileUtils.
Removed an umlaut which seemed to give trouble.

2010-03-03 ratexdb 0.13

Added "~" to LaTeX special characters, and changed "\" replacement
from "$\backslash$" to "\ensuremath{\backslash}".

After a \texdb... command, the first character after the last closing
} was lost. Fixed.

2008-08-01 ratexdb 0.12

Changed ordering in postprocessing: First replace the special
characters, then the regular expressions. Like this, the regular
expressions can contain LaTeX commands.

Fixed bug in command line arguments parsing.

2008-06-24 ratexdb 0.11

Changed line breaks from "\r\n" to "\n" to make it work on Unix and Mac.

2007-11-29 ratexdb 0.1

Initial release.