diff --git a/CHANGES.md b/CHANGES.md index f37efd0..68fc0bb 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,9 @@ +## Version 7.1.0 du 10/09/2017-19:20 + +* `f131e21` uwatch: ajout de l'option -r +* `d99718e` cosmetic +* `1aee0cb` maj sqlcsv + ## Version 7.0.0 du 25/08/2017-15:53 * `e4f154e` uawk: possibilité de lancer les versions locale-aware diff --git a/VERSION.txt b/VERSION.txt index 66ce77b..a3fcc71 100644 --- a/VERSION.txt +++ b/VERSION.txt @@ -1 +1 @@ -7.0.0 +7.1.0 diff --git a/sqlcsv b/sqlcsv index a1e832c..91e080c 100755 --- a/sqlcsv +++ b/sqlcsv @@ -49,6 +49,7 @@ import java.util.Properties; import java.util.logging.ConsoleHandler; import java.util.logging.Level; import java.util.logging.Logger; +import java.util.prefs.Preferences; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -572,6 +573,10 @@ public class sqlcsv { "org.hsqldb.jdbcDriver", "org.postgresql.Driver"}; + static final boolean isOracle(String jdbcUrl) { + return jdbcUrl.startsWith("jdbc:oracle:"); + } + static final class Exit extends RuntimeException { private static final long serialVersionUID = 1L; @@ -789,14 +794,25 @@ public class sqlcsv { } } + // requêtes à ignorer, en l'occurence lignes spéciques à sqlplus pour une connexion à Oracle + static final Pattern RE_ORACLE_IGNORE_STMT = Pattern.compile("(?i)set\\b"); + static final Pattern RE_CREATE_STMT = Pattern .compile("(?i)create\\s+(?:or\\s+replace)?(?:procedure|trigger|function|package)"); static final Pattern RE_SEPARATOR = Pattern.compile(";$"); - static String nextStatement(BufferedReader inf) throws IOException { - String line = nextLine(inf); - if (line == null) return null; + static String nextStatement(BufferedReader inf, String jdbcUrl) throws IOException { + boolean ignore; + String line; + do { + ignore = false; + line = nextLine(inf); + if (line == null) return null; + if (isOracle(jdbcUrl) && RE_ORACLE_IGNORE_STMT.matcher(line).lookingAt()) { + ignore = true; + } + } while (ignore); StringBuilder sb = new StringBuilder(); boolean first = true; @@ -889,7 +905,7 @@ public class sqlcsv { static final Pattern RE_NAME_EXT = Pattern.compile("(.+?)(?:(\\d+))?(?:(\\.[^.]+))?"); void executeQueries(Connection conn, Object[] args, ArrayList infs, - ArrayList outputs, Options o) throws IOException, SQLException { + ArrayList outputs, Options o, String jdbcUrl) throws IOException, SQLException { int stcount = 0; Iterator outputIt = outputs.iterator(); String output = null, prevOutput = null, actualOutput = null; @@ -898,7 +914,7 @@ public class sqlcsv { for (BufferedReader inf : infs) { try { while (true) { - String statement = nextStatement(inf); + String statement = nextStatement(inf, jdbcUrl); if (statement == null) break; stcount++; @@ -1052,6 +1068,11 @@ public class sqlcsv { + "\n obligatoire. Si cette option n'est pas fournie, il faut spécifier un" + "\n fichier de configuration avec l'option -C dans lequel *une seule*" + "\n propriété 'CONN.url' est définie." + + "\n Si -C n'est pas spécifié et que -l est spécifié, alors l'identifiant de" + + "\n connexion est enregistré dans les préférences utilisateur. Si ni -C" + + "\n ni -l ne sont spécifiés, alors le dernier identifiant est utilisé s'il" + + "\n existe. L'option -z permet de démarrer comme si aucun identifiant n'avait" + + "\n jamais été enregistré." + "\n -u, --user USER" + "\n -p, --password PASSWORD" + "\n Spécifier un nom de connexion et un mot de passe si l'url ne le fournit" @@ -1106,13 +1127,18 @@ public class sqlcsv { + "\n l'application avec le niveau de log ALL ce qui permet de voir les logs" + "\n concernant le chargement des jar. Un fichier SQL_DEBUG permet d'activer" + "\n la trace de DriverManager. Exemple:" - + "\n mkdir -p ~/.sqlcsv && touch ~/.sqlcsv/{DEBUG,SQL_DEBUG}"); + + "\n mkdir -p ~/.sqlcsv && touch ~/.sqlcsv/{DEBUG,SQL_DEBUG}" + + "\n -v, --verbose" + + "\n Equivalent à --loglevel FINER pour afficher le maximum de messages" + + "\n -z, --reset-prefs" + + "\n Effacer les préférences avant de faire le calcul de l'identifiant par" + + "\n défaut"); return; } String config = null, connid = null, user = null, password = null; Options o = new Options(); - boolean autocommit = false, autoNa = false; + boolean autocommit = false, autoNa = false, resetPrefs = false; String loglevel = null; ArrayList inputs = new ArrayList(); ArrayList outputs = new ArrayList(); @@ -1156,6 +1182,10 @@ public class sqlcsv { o.outputUc = true; } else if (arg.equals("--loglevel")) { loglevel = getArg(args, ++i, "Vous devez spécifier le niveau de logs"); + } else if (arg.equals("-v") || arg.equals("--verbose")) { + loglevel = "FINER"; + } else if (arg.equals("-z") || arg.equals("--reset-prefs")) { + resetPrefs = true; } else if (arg.equals("--")) { i++; break; @@ -1170,6 +1200,19 @@ public class sqlcsv { log.setLevel(Level.parse(loglevel.toUpperCase())); } + Preferences prefs = null; + boolean usePrefs = config == null; + if (resetPrefs || usePrefs) { + prefs = Preferences.userNodeForPackage(sqlcsv.class); + if (resetPrefs) prefs.clear(); + if (usePrefs && connid == null) { + connid = prefs.get("lastConnid", null); + if (connid != null) { + log.fine("Sélection de la valeur par défaut connid=" + connid); + } + } + } + // Charger les propriétés... // essayer depuis le répertoire courant et les répertoires parents jusqu'à $HOME if (config == null) { @@ -1252,7 +1295,14 @@ public class sqlcsv { jdbcUrl = connid; } } - if (jdbcUrl == null) throw new Exit("Vous devez spécifier l'url de connexion"); + if (jdbcUrl == null) { + if (resetPrefs) throw new Exit(); + else throw new Exit("Vous devez spécifier l'url de connexion"); + } + if (usePrefs) { + log.fine("Enregistrement de la valeur connid=" + connid); + prefs.put("lastConnid", connid); + } // Ouvrir les fichiers en entrée ArrayList infs = new ArrayList(); @@ -1298,7 +1348,7 @@ public class sqlcsv { // Exécuter les requêtes try { - executeQueries(conn, null, infs, outputs, o); + executeQueries(conn, null, infs, outputs, o, jdbcUrl); } finally { close(conn); for (BufferedReader inf : infs) { diff --git a/uwatch b/uwatch index 0e6af74..ad6ad06 100755 --- a/uwatch +++ b/uwatch @@ -14,11 +14,16 @@ OPTIONS Afficher l'heure (par défaut) -c, --count Afficher le temps écoulé depuis le lancement de ce script + -r, --rcount + Afficher un décompte depuis DURATION jusqu'à 0 puis terminer le script. + DURATION exprimé en secondes est le premier argument du script et vaut + par défaut ${DEFAULT_DURATION} soit $(($DEFAULT_DURATION / 60)) minutes. -u, --units Avec l'option --count, afficher l'unité: sec., min. ou heures -o, --offset NBSEC Avec l'option --count, spécifier un nombre de secondes à partir duquel - compter + compter. Avec l'option --rcount, le nombre de secondes est soustrait à + DURATION. -s, --step NBSECS[=1] Spécifier la période de rafraichissement de l'affichage -a, --prefix PREFIX @@ -26,12 +31,15 @@ OPTIONS -z, --suffix SUFFIX Spécifier une chaine à afficher après l'heure --cc - Equivalent à -c -s 5 -a 'Connecté sur \$MYHOST depuis ' -z '...' + Equivalent à -c -s 5 -u -a 'Connecté sur \$MYHOST depuis ' -z '...' Permet de garantir une activité sur une connexion SSH utilisée - uniquement pour faire une redirection de port" + uniquement pour faire une redirection de port + --rc + Equivalent à -r -s 1 -u -a 'Attendre ' -z ''" } DEFAULT_STEP=1 +DEFAULT_DURATION=300 what=time units= @@ -43,18 +51,31 @@ args=( --help '$exit_with display_help' -t,--time what=time -c,--count what=count + -r,--rcount what=rcount -u,--units units=1 -o:,--offset: offset= -s:,--step: step= -a:,--prefix: prefix= -z:,--suffix: suffix= --cc '$what=count; units=1; step=5; prefix="Connecté sur $MYHOST depuis "; suffix="..."' + --rc '$what=rcount; units=1; step=1; prefix="Attendre "; suffix=""' ) parse_args "$@"; set -- "${args[@]}" [ -n "$step" ] || step="$DEFAULT_STEP" setx start=date +%s -[ -n "$offset" ] && start=$(($start - $offset)) + +case "$what" in +count) + [ -n "$offset" ] && start=$(($start - $offset)) + ;; +rcount) + duration="${1:-$DEFAULT_DURATION}" + [ -n "$offset" ] && duration=$(($duration - $offset)) + end=$(($start + $duration)) + TZ= setx until=date -d "@$end" +%H:%M:%S + ;; +esac while true; do case "$what" in @@ -73,6 +94,22 @@ while true; do fi [ ${#msg} -eq 2 ] && msg="${msg#0}" ;; + rcount) + setx now=date +%s + if [ $now -ge $end ]; then + echo + break + fi + TZ= setx msg=date -d "@$(($end - $now))" +%H:%M:%S + msg="${msg#00:}"; msg="${msg#00:}" + if [ -n "$units" ]; then + if [ ${#msg} -ge 8 ]; then msg="$msg heures" + elif [ ${#msg} -eq 5 ]; then msg="$msg min" + elif [ ${#msg} -eq 2 ]; then msg="${msg#0} sec" + fi + fi + [ ${#msg} -eq 2 ] && msg="${msg#0}" + msg="$msg (jusqu'à $until)" esac echo -n $'\e[1G\e[K'"$prefix$msg$suffix" sleep "$step"