From 1c397e89992e32f5e82d939a7ddc24a87d0f76d1 Mon Sep 17 00:00:00 2001 From: Jephte CLAIN Date: Mon, 15 Feb 2016 15:09:17 +0400 Subject: [PATCH] =?UTF-8?q?ajout=20des=20fonctions=20awk=20cqsql(),=20sval?= =?UTF-8?q?(),=20cval().=20r=C3=A9organiser=20et=20clarifier=20la=20doc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/ulib/awk | 33 ++++++++++++++++++++++++++++----- lib/ulib/base | 50 ++++++++++++++++++++++++++++++++------------------ 2 files changed, 60 insertions(+), 23 deletions(-) diff --git a/lib/ulib/awk b/lib/ulib/awk index 63afe19..8631c39 100644 --- a/lib/ulib/awk +++ b/lib/ulib/awk @@ -53,10 +53,11 @@ qval(s) --> 'here, \"there\" and '\\''everywhere'\\''.' L'alias quote_value(s) existe pour compatibilité -qsval(s) +sqval(s) comme qval() mais ajouter un espace avant la valeur quotée. ceci permet de construire facilement une ligne de commande, e.g.: - print \"mycmd\" qsval(arg1) qsval(arg2) + print \"mycmd\" sqval(arg1) sqval(arg2) + L'alias qsval(s) existe pour compatibilité qvals() quoter les valeurs \$1..\$NF pour les passer comme argument sur la ligne de @@ -65,10 +66,11 @@ qvals() La ligne qui est affichée pourra être évaluée avec eval dans le shell. L'alias quoted_values(s) existe pour compatibilité -qsvals(s) +sqvals(s) comme qvals() mais ajouter un espace avant la valeur quotée. ceci permet de construire facilement une ligne de commande, e.g.: - print \"mycmd\" qsvals() + print \"mycmd\" sqvals() + L'alias qsvals(s) existe pour compatibilité qsubrepl(s) quoter une valeur pour l'argument r des fonctions sub() et gsub(). Les @@ -87,10 +89,16 @@ qegrep(s) qsql(s) quoter une valeur pour un script sql. la valeur est entourée de quotes, e.g: - quote_sql(\"hello'there\") + qsql(\"hello'there\") --> 'hello''there' L'alias quote_sql(s) existe pour compatibilité +cqsql(s) + comme qsql() mais ajouter une virgule avant la valeur quotée. ceci permet de + construire facilement une requête SQL, e.g: + print \"insert into t(a, b, c) values (\" qsql(a) cqsql(b) cqsql(c) \");\" + --> insert into t(a, b, c) values ('a', 'b', 'c'); + unquote_mysqlcsv(s) Analyser une valeur exportée de MySQL avec mysqlcsv. Les transformations suivantes sont effectuées: @@ -99,6 +107,16 @@ unquote_mysqlcsv(s) \\0 --> \\\\ --> \\ +sval(s) + retourner la valeur s précédée d'un espace si elle est non vide, e.g: + sval(\"\") --> \"\" + sval(\"any\") --> \" any\" + +cval(s) + retourner la valeur s précédée d'une virgule si elle est non vide, e.g: + sval(\"\") --> \"\" + sval(\"any\") --> \",any\" + mkindices(values, indices) créer le tableau indices qui contient les indices du tableau values, de 1 à N, et retourner la valeur N. Il faudra utiliser les valeurs de cette manière: @@ -115,6 +133,11 @@ array_new(dest) array_newsize(dest, size) créer un nouveau tableau de taille size, rempli de chaines vides +array_len(src) + calculer la taille d'un tableau. length(array) a un bug sur GNUawk 3.1.5. + cette fonction est plus lente, mais fonctionne sur toutes les versions de + awk et GNUawk + array_copy(dest, src) faire une copie d'un tableau. Cette fonction nécessite gnuawk, puisqu'elle utilise mkindices(). diff --git a/lib/ulib/base b/lib/ulib/base index bd72148..8f6be8b 100644 --- a/lib/ulib/base +++ b/lib/ulib/base @@ -1863,7 +1863,6 @@ function qhtml(s) { gsub(/", s) @@ -1875,8 +1874,7 @@ function qval(s) {'" gsub(/'/, \"'\\\\''\", s) return \"'\" s \"'\" "'} -function quote_value(s) { return qval(s) } -function qsval(s) { +function sqval(s) { return " " qval(s) } function qvals( i, line) { @@ -1887,36 +1885,33 @@ function qvals( i, line) { } return line } -function quoted_values() { return qvals() } -function qsvals() { +function sqvals() { return " " qvals() } function qregexp(s) { gsub(/[[\\.^$*+?()|{]/, "\\\\&", s) return s } -function quote_regexp(s) { return qregexp(s) } function qsubrepl(s) { gsub(/\\/, "\\\\", s) gsub(/&/, "\\\\&", s) return s } -function quote_subrepl(s) { return qsubrepl(s) } function qgrep(s) { gsub(/[[\\.^$*]/, "\\\\&", s) return s } -function quote_grep(s) { return qgrep(s) } function qegrep(s) { gsub(/[[\\.^$*+?()|{]/, "\\\\&", s) return s } -function quote_egrep(s) { return qegrep(s) } function qsql(s) {'" gsub(/'/, \"''\", s) return \"'\" s \"'\" "'} -function quote_sql(s) { return qsql(s) } +function cqsql(s) { + return "," qsql(s) +} function unquote_mysqlcsv(s) { gsub(/\\n/, "\n", s) gsub(/\\t/, "\t", s) @@ -1924,6 +1919,25 @@ function unquote_mysqlcsv(s) { gsub(/\\\\/, "\\", s) return s } +function sval(s) { + if (s == "") return s + else return " " s +} +function cval(s) { + if (s == "") return s + else return "," s +} +# aliases pour compatibilité +function quote_html(s) { return qhtml(s) } +function quote_value(s) { return qval(s) } +function qsval(s) { return sqval(s) } +function quoted_values() { return qvals() } +function qsvals(s) { return sqvals(s) } +function quote_regexp(s) { return qregexp(s) } +function quote_subrepl(s) { return qsubrepl(s) } +function quote_grep(s) { return qgrep(s) } +function quote_egrep(s) { return qegrep(s) } +function quote_sql(s) { return qsql(s) } function __parse_date_fr(date, parts, y, m, d) { if (match(date, /([0-9][0-9]?)\/([0-9][0-9]?)\/([0-9][0-9][0-9][0-9])/, parts)) { @@ -1970,6 +1984,14 @@ function date_add(date, nbdays, serial) { return strftime("%d/%m/%Y", serial) } +function mkindices(values, indices, i, j) { + array_new(indices) + j = 1 + for (i in values) { + indices[j++] = int(i) + } + return asort(indices) +} function array_new(dest) { dest[0] = 0 # forcer awk à considérer dest comme un tableau delete dest @@ -1991,14 +2013,6 @@ function array_len(values, count, i) { } return count } -function mkindices(values, indices, i, j) { - array_new(indices) - j = 1 - for (i in values) { - indices[j++] = int(i) - } - return asort(indices) -} function array_copy(dest, src, count, indices, i) { array_new(dest) count = mkindices(src, indices)