Intégration de la branche release-7.1.0

This commit is contained in:
Jephté Clain 2017-09-10 19:20:38 +04:00
commit 97851ef4d8
4 changed files with 107 additions and 14 deletions

View File

@ -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 ## Version 7.0.0 du 25/08/2017-15:53
* `e4f154e` uawk: possibilité de lancer les versions locale-aware * `e4f154e` uawk: possibilité de lancer les versions locale-aware

View File

@ -1 +1 @@
7.0.0 7.1.0

68
sqlcsv
View File

@ -49,6 +49,7 @@ import java.util.Properties;
import java.util.logging.ConsoleHandler; import java.util.logging.ConsoleHandler;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import java.util.prefs.Preferences;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@ -572,6 +573,10 @@ public class sqlcsv {
"org.hsqldb.jdbcDriver", "org.hsqldb.jdbcDriver",
"org.postgresql.Driver"}; "org.postgresql.Driver"};
static final boolean isOracle(String jdbcUrl) {
return jdbcUrl.startsWith("jdbc:oracle:");
}
static final class Exit extends RuntimeException { static final class Exit extends RuntimeException {
private static final long serialVersionUID = 1L; 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 static final Pattern RE_CREATE_STMT = Pattern
.compile("(?i)create\\s+(?:or\\s+replace)?(?:procedure|trigger|function|package)"); .compile("(?i)create\\s+(?:or\\s+replace)?(?:procedure|trigger|function|package)");
static final Pattern RE_SEPARATOR = Pattern.compile(";$"); static final Pattern RE_SEPARATOR = Pattern.compile(";$");
static String nextStatement(BufferedReader inf) throws IOException { static String nextStatement(BufferedReader inf, String jdbcUrl) throws IOException {
String line = nextLine(inf); boolean ignore;
if (line == null) return null; 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(); StringBuilder sb = new StringBuilder();
boolean first = true; boolean first = true;
@ -889,7 +905,7 @@ public class sqlcsv {
static final Pattern RE_NAME_EXT = Pattern.compile("(.+?)(?:(\\d+))?(?:(\\.[^.]+))?"); static final Pattern RE_NAME_EXT = Pattern.compile("(.+?)(?:(\\d+))?(?:(\\.[^.]+))?");
void executeQueries(Connection conn, Object[] args, ArrayList<BufferedReader> infs, void executeQueries(Connection conn, Object[] args, ArrayList<BufferedReader> infs,
ArrayList<String> outputs, Options o) throws IOException, SQLException { ArrayList<String> outputs, Options o, String jdbcUrl) throws IOException, SQLException {
int stcount = 0; int stcount = 0;
Iterator<String> outputIt = outputs.iterator(); Iterator<String> outputIt = outputs.iterator();
String output = null, prevOutput = null, actualOutput = null; String output = null, prevOutput = null, actualOutput = null;
@ -898,7 +914,7 @@ public class sqlcsv {
for (BufferedReader inf : infs) { for (BufferedReader inf : infs) {
try { try {
while (true) { while (true) {
String statement = nextStatement(inf); String statement = nextStatement(inf, jdbcUrl);
if (statement == null) break; if (statement == null) break;
stcount++; stcount++;
@ -1052,6 +1068,11 @@ public class sqlcsv {
+ "\n obligatoire. Si cette option n'est pas fournie, il faut spécifier un" + "\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 fichier de configuration avec l'option -C dans lequel *une seule*"
+ "\n propriété 'CONN.url' est définie." + "\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 -u, --user USER"
+ "\n -p, --password PASSWORD" + "\n -p, --password PASSWORD"
+ "\n Spécifier un nom de connexion et un mot de passe si l'url ne le fournit" + "\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 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 concernant le chargement des jar. Un fichier SQL_DEBUG permet d'activer"
+ "\n la trace de DriverManager. Exemple:" + "\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; return;
} }
String config = null, connid = null, user = null, password = null; String config = null, connid = null, user = null, password = null;
Options o = new Options(); Options o = new Options();
boolean autocommit = false, autoNa = false; boolean autocommit = false, autoNa = false, resetPrefs = false;
String loglevel = null; String loglevel = null;
ArrayList<String> inputs = new ArrayList<String>(); ArrayList<String> inputs = new ArrayList<String>();
ArrayList<String> outputs = new ArrayList<String>(); ArrayList<String> outputs = new ArrayList<String>();
@ -1156,6 +1182,10 @@ public class sqlcsv {
o.outputUc = true; o.outputUc = true;
} else if (arg.equals("--loglevel")) { } else if (arg.equals("--loglevel")) {
loglevel = getArg(args, ++i, "Vous devez spécifier le niveau de logs"); 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("--")) { } else if (arg.equals("--")) {
i++; i++;
break; break;
@ -1170,6 +1200,19 @@ public class sqlcsv {
log.setLevel(Level.parse(loglevel.toUpperCase())); 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... // Charger les propriétés...
// essayer depuis le répertoire courant et les répertoires parents jusqu'à $HOME // essayer depuis le répertoire courant et les répertoires parents jusqu'à $HOME
if (config == null) { if (config == null) {
@ -1252,7 +1295,14 @@ public class sqlcsv {
jdbcUrl = connid; 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 // Ouvrir les fichiers en entrée
ArrayList<BufferedReader> infs = new ArrayList<BufferedReader>(); ArrayList<BufferedReader> infs = new ArrayList<BufferedReader>();
@ -1298,7 +1348,7 @@ public class sqlcsv {
// Exécuter les requêtes // Exécuter les requêtes
try { try {
executeQueries(conn, null, infs, outputs, o); executeQueries(conn, null, infs, outputs, o, jdbcUrl);
} finally { } finally {
close(conn); close(conn);
for (BufferedReader inf : infs) { for (BufferedReader inf : infs) {

45
uwatch
View File

@ -14,11 +14,16 @@ OPTIONS
Afficher l'heure (par défaut) Afficher l'heure (par défaut)
-c, --count -c, --count
Afficher le temps écoulé depuis le lancement de ce script 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 -u, --units
Avec l'option --count, afficher l'unité: sec., min. ou heures Avec l'option --count, afficher l'unité: sec., min. ou heures
-o, --offset NBSEC -o, --offset NBSEC
Avec l'option --count, spécifier un nombre de secondes à partir duquel 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] -s, --step NBSECS[=1]
Spécifier la période de rafraichissement de l'affichage Spécifier la période de rafraichissement de l'affichage
-a, --prefix PREFIX -a, --prefix PREFIX
@ -26,12 +31,15 @@ OPTIONS
-z, --suffix SUFFIX -z, --suffix SUFFIX
Spécifier une chaine à afficher après l'heure Spécifier une chaine à afficher après l'heure
--cc --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 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_STEP=1
DEFAULT_DURATION=300
what=time what=time
units= units=
@ -43,18 +51,31 @@ args=(
--help '$exit_with display_help' --help '$exit_with display_help'
-t,--time what=time -t,--time what=time
-c,--count what=count -c,--count what=count
-r,--rcount what=rcount
-u,--units units=1 -u,--units units=1
-o:,--offset: offset= -o:,--offset: offset=
-s:,--step: step= -s:,--step: step=
-a:,--prefix: prefix= -a:,--prefix: prefix=
-z:,--suffix: suffix= -z:,--suffix: suffix=
--cc '$what=count; units=1; step=5; prefix="Connecté sur $MYHOST depuis "; 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[@]}" parse_args "$@"; set -- "${args[@]}"
[ -n "$step" ] || step="$DEFAULT_STEP" [ -n "$step" ] || step="$DEFAULT_STEP"
setx start=date +%s 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 while true; do
case "$what" in case "$what" in
@ -73,6 +94,22 @@ while true; do
fi fi
[ ${#msg} -eq 2 ] && msg="${msg#0}" [ ${#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 esac
echo -n $'\e[1G\e[K'"$prefix$msg$suffix" echo -n $'\e[1G\e[K'"$prefix$msg$suffix"
sleep "$step" sleep "$step"