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
* `e4f154e` uawk: possibilité de lancer les versions locale-aware

View File

@ -1 +1 @@
7.0.0
7.1.0

66
sqlcsv
View File

@ -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);
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<BufferedReader> infs,
ArrayList<String> outputs, Options o) throws IOException, SQLException {
ArrayList<String> outputs, Options o, String jdbcUrl) throws IOException, SQLException {
int stcount = 0;
Iterator<String> 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<String> inputs = new ArrayList<String>();
ArrayList<String> outputs = new ArrayList<String>();
@ -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<BufferedReader> infs = new ArrayList<BufferedReader>();
@ -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) {

45
uwatch
View File

@ -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"