MAJ V2
Projet d'école BTS (2018) MAJ: Reprise du code et amélioration, sécurisation, réparation de BUGs et centralisation des formulaires, remplassement de la BDD par MariaDB ... A finaliser : - les Jbuttons.Values, - Centralisation des listes - Optimisation du code - Gestion des cours ...
This commit is contained in:
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry kind="src" path=""/>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER">
|
||||
<attributes>
|
||||
<attribute name="module" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry kind="lib" path="C:/Users/christian/eclipse-workspace/LesEcuriesdelaBoissiereJAVA_Script/mariadb-java-client-2.7.4.jar">
|
||||
<attributes>
|
||||
<attribute name="module" value="true"/>
|
||||
</attributes>
|
||||
</classpathentry>
|
||||
<classpathentry kind="output" path=""/>
|
||||
</classpath>
|
||||
@@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>Ecurie_ccunatbrule</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
||||
@@ -0,0 +1,55 @@
|
||||
package controleur;
|
||||
|
||||
public class Cheval {
|
||||
private int id, age;
|
||||
private String nom, sexe, robe, type, race, proprietaire, image;
|
||||
public Cheval()
|
||||
{//ADD
|
||||
this.id=this.age=0;
|
||||
this.nom=this.sexe=this.proprietaire=this.robe=this.type=this.image="";
|
||||
}
|
||||
public Cheval (int id, String nom, String sexe, String robe, String type, String race, String proprietaire, int age, String image)
|
||||
{//ALL
|
||||
this.id= id;
|
||||
this.nom = nom;
|
||||
this.sexe = sexe;
|
||||
this.robe = robe;
|
||||
this.type = type;
|
||||
this.race = race;
|
||||
this.proprietaire = proprietaire;
|
||||
this.age = age;
|
||||
this.image = image;
|
||||
}
|
||||
public Cheval (String nom, String sexe, String robe, String type, String race, String proprietaire, int age)
|
||||
{//ADD
|
||||
this.nom = nom;
|
||||
this.sexe = sexe;
|
||||
this.robe = robe;
|
||||
this.type = type;
|
||||
this.race = race;
|
||||
this.proprietaire = proprietaire;
|
||||
this.age = age;
|
||||
}
|
||||
public Cheval (String nom)
|
||||
{//DELETE
|
||||
this.nom = nom;
|
||||
}
|
||||
public int getId() { return id; }
|
||||
public String getNom() { return nom; }
|
||||
public String getSexe() { return sexe; }
|
||||
public String getRobe() { return robe; }
|
||||
public String getType() { return type; }
|
||||
public String getRace() { return race; }
|
||||
public String getProprietaire() { return proprietaire; }
|
||||
public int getAge() { return age; }
|
||||
public String getImage() { return image; }
|
||||
public void setId(int id) { this.id = id; }
|
||||
public void setNom(String nom) { this.nom = nom; }
|
||||
public void setSexe(String sexe) { this.sexe = sexe; }
|
||||
public void setRobe(String robe) { this.robe = robe; }
|
||||
public void setType(String type) { this.type = type; }
|
||||
public void setRace(String race) { this.race = race; }
|
||||
public void setProprietaire(String proprietaire) { this.proprietaire = proprietaire; }
|
||||
public void setAge(int age) { this.age = age; }
|
||||
public void setImage(String image) { this.image = image; }
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
package controleur;
|
||||
|
||||
public class Cours
|
||||
{
|
||||
private int idcours;
|
||||
private String datecours, heuredebut, heurefin;
|
||||
public Cours()
|
||||
{
|
||||
this.idcours=0;
|
||||
this.datecours = this.heuredebut=this.heurefin="";
|
||||
}
|
||||
public Cours (int idcours, String datecours, String heuredebut, String heurefin)
|
||||
{
|
||||
this.idcours= idcours;
|
||||
this.datecours = datecours;
|
||||
this.heuredebut = heuredebut;
|
||||
this.heurefin = heurefin;
|
||||
}
|
||||
public Cours ( String datecours, String heuredebut, String heurefin)
|
||||
{
|
||||
this.idcours= 0;
|
||||
this.datecours = datecours;
|
||||
this.heuredebut = heuredebut;
|
||||
this.heurefin = heurefin;
|
||||
}
|
||||
public int getIdCours() {
|
||||
return idcours;
|
||||
}
|
||||
public void setIdCours(int idcours) {
|
||||
this.idcours = idcours;
|
||||
}
|
||||
public String getDateCours() {
|
||||
return datecours;
|
||||
}
|
||||
public void setDateCours(String datecours) {
|
||||
this.datecours = datecours;
|
||||
}
|
||||
public String getHeureDebut() {
|
||||
return heuredebut;
|
||||
}
|
||||
public void setHeureDebut(String heuredebut) {
|
||||
this.heuredebut = heuredebut;
|
||||
}
|
||||
public String getHeureFin() {
|
||||
return heurefin;
|
||||
}
|
||||
public void setHeureFin(String heurefin) {
|
||||
this.heurefin = heurefin;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
package controleur;
|
||||
|
||||
public class Eleve
|
||||
{
|
||||
private int id, privilege, age, galop;
|
||||
private String record, pseudo, prenom, nom, sexe, adresse, mdp, mail, imageeleve;
|
||||
public Eleve() {//ALL
|
||||
this.id=this.privilege=this.age=this.galop=0;
|
||||
this.record=this.pseudo=this.prenom=this.nom=this.sexe=this.adresse=this.mail="";
|
||||
}
|
||||
public Eleve (int id, int privilege, String record, String pseudo, String prenom, String nom, String sexe, int age, String adresse, String mdp, String mail, int galop, String imageeleve)
|
||||
{//ALL
|
||||
this.id= id;
|
||||
this.privilege = privilege;
|
||||
this.record = record;
|
||||
this.pseudo = pseudo;
|
||||
this.prenom = prenom;
|
||||
this.nom = nom;
|
||||
this.sexe = sexe;
|
||||
this.age = age;
|
||||
this.adresse = adresse;
|
||||
this.mdp = mdp;
|
||||
this.mail = mail;
|
||||
this.galop = galop;
|
||||
this.imageeleve = imageeleve;
|
||||
}
|
||||
public Eleve (String prenom, String nom, String sexe, int age, String adresse, String mail, int galop)
|
||||
{//ADD & Modify
|
||||
this.prenom = prenom;
|
||||
this.nom = nom;
|
||||
this.sexe = sexe;
|
||||
this.age = age;
|
||||
this.adresse = adresse;
|
||||
this.mail = mail;
|
||||
this.galop = galop;
|
||||
}
|
||||
public Eleve (String mail) {//DELETE
|
||||
this.mail = mail;
|
||||
}
|
||||
public int getId() { return id; }
|
||||
public int getPrivilege() { return privilege; }
|
||||
public String getRecord() { return record; }
|
||||
public String getPseudo() { return pseudo; }
|
||||
public String getPrenom() { return prenom; }
|
||||
public String getNom() { return nom; }
|
||||
public String getSexe() { return sexe; }
|
||||
public int getAge() { return age; }
|
||||
public String getAdresse() { return adresse; }
|
||||
public String getMdp() { return mdp; }
|
||||
public String getMail() { return mail; }
|
||||
public int getGalop() { return galop; }
|
||||
public String getImageEleve() { return imageeleve; }
|
||||
public void setid(int id) { this.id = id; }
|
||||
public void setPrivilege(int privilege) { this.privilege = privilege; }
|
||||
public void setrecord(String record) { this.record = record; }
|
||||
public void setPseudo(String pseudo) { this.pseudo = pseudo; }
|
||||
public void setPrenom(String prenom) { this.prenom = prenom; }
|
||||
public void setNom(String nom) { this.nom = nom; }
|
||||
public void setSexe(String sexe) { this.sexe = sexe; }
|
||||
public void setAge(int age) { this.age = age; }
|
||||
public void setAdresse(String adresse) { this.adresse = adresse; }
|
||||
public void setMdp(String mdp) { this.mdp = mdp; }
|
||||
public void setMail(String mail) { this.mail = mail; }
|
||||
public void setGalop(int galop) { this.galop = galop; }
|
||||
public void setImageEleve(String imageeleve) { this.imageeleve = imageeleve; }
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
package controleur;
|
||||
|
||||
public class Formateur
|
||||
{
|
||||
private int idformateur, privilege, age, galop;
|
||||
private String login, prenom, nom, sexe, mail, mdp ;
|
||||
public Formateur()
|
||||
{//ALL
|
||||
this.idformateur=this.privilege=this.age=this.galop=0;
|
||||
this.login=this.prenom=this.nom=this.sexe=this.mail=this.mdp="";
|
||||
}
|
||||
public Formateur (int idformateur, String login, int privilege, String prenom, String nom, int age, int galop, String sexe, String mail, String mdp)
|
||||
{//ALL
|
||||
this.idformateur= idformateur;
|
||||
this.login = login;
|
||||
this.privilege = privilege;
|
||||
this.prenom = prenom;
|
||||
this.nom = nom;
|
||||
this.age = age;
|
||||
this.galop = galop;
|
||||
this.sexe = sexe;
|
||||
this.mail = mail;
|
||||
this.mdp = mdp;
|
||||
}
|
||||
public Formateur(String prenom,String nom, int age, int galop, String sexe, String mail, String mdp)
|
||||
{//ADD
|
||||
this.prenom = prenom;
|
||||
this.nom = nom;
|
||||
this.age = age;
|
||||
this.galop = galop;
|
||||
this.sexe = sexe;
|
||||
this.mail = mail;
|
||||
this.mdp = mdp;
|
||||
}
|
||||
public Formateur(String mail)
|
||||
{//DELETE
|
||||
this.mail = mail;
|
||||
}
|
||||
public int getId() { return idformateur; }
|
||||
public String getLogin() { return login; }
|
||||
public int getPrivilege() { return privilege; }
|
||||
public String getPrenom() { return prenom; }
|
||||
public String getNom() { return nom; }
|
||||
public int getAge() { return age; }
|
||||
public int getGalop() { return galop;}
|
||||
public String getSexe() {return sexe;}
|
||||
public String getMail() { return mail; }
|
||||
public String getMdp() { return mdp; }
|
||||
public void setId(int idformateur) { this.idformateur = idformateur; }
|
||||
public void setLogin(String login) { this.login = login; }
|
||||
public void setPrivilege(int privilege) { this.privilege = privilege; }
|
||||
public void setPrenom(String prenom) { this.prenom = prenom; }
|
||||
public void setNom(String nom) { this.nom = nom; }
|
||||
public void setAge(int age) { this.age = age; }
|
||||
public void setGalop(int galop) {this.galop = galop; }
|
||||
public void setSexe(String sexe) {this.sexe = sexe; }
|
||||
public void setMail(String mail) { this.mail = mail; }
|
||||
public void setMdp(String mdp) { this.mdp = mdp; }
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
package controleur;
|
||||
|
||||
import vue.Connexion;
|
||||
|
||||
public class Gestion
|
||||
{
|
||||
private static Connexion uneConnexion;
|
||||
public Gestion()
|
||||
{
|
||||
uneConnexion = new Connexion();
|
||||
uneConnexion.rendreVisible(true);
|
||||
}
|
||||
|
||||
public static void rendreVisible(boolean val)
|
||||
{
|
||||
uneConnexion.rendreVisible(val);
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
new Gestion();
|
||||
}
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 16 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 14 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 12 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 43 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 7.7 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 14 KiB |
@@ -0,0 +1,52 @@
|
||||
package modele;
|
||||
|
||||
import java.sql.Connection;
|
||||
import java.sql.DriverManager;
|
||||
import java.sql.SQLException;
|
||||
import java.sql.Statement;
|
||||
|
||||
public class BDD {
|
||||
private String serveur, nombdd, user, mdp;
|
||||
private Connection maConnexion;
|
||||
|
||||
public BDD() {
|
||||
this.serveur = "localhost";
|
||||
this.nombdd = "Ecurie";
|
||||
this.user = "USER";
|
||||
this.mdp = "MDP";
|
||||
this.maConnexion = null;
|
||||
}
|
||||
public void chargerPilote() {
|
||||
// vérifie la présence du pilote JDBC MySQL
|
||||
try {
|
||||
Class.forName("org.mariadb.jdbc.Driver");
|
||||
}
|
||||
catch(ClassNotFoundException exp) {
|
||||
System.out.println("Abscence du pilote JDBC !");
|
||||
}
|
||||
}
|
||||
public void seConnecter() {
|
||||
// connexion au serveur de la BDD
|
||||
this.chargerPilote();
|
||||
String url = "jdbc:mariadb://" + this.serveur + "/" + this.nombdd;
|
||||
try {
|
||||
this.maConnexion = DriverManager.getConnection(url, this.user, this.mdp);
|
||||
}
|
||||
catch(SQLException exp) {
|
||||
System.out.println("Impossible de se connecter à " + url);
|
||||
}
|
||||
}
|
||||
public void seDeconnecter() {
|
||||
// déconnexion au serveur de la BDD
|
||||
try {
|
||||
if(this.maConnexion != null) this.maConnexion.close();
|
||||
}
|
||||
catch(SQLException exp) {
|
||||
System.out.println("La déconnexion a échoué !");
|
||||
}
|
||||
}
|
||||
public Connection getMaConnexion()
|
||||
{
|
||||
return this.maConnexion;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,107 @@
|
||||
package modele;
|
||||
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.sql.Statement;
|
||||
import java.util.ArrayList;
|
||||
import controleur.Cheval;
|
||||
|
||||
public class ModeleCheval {
|
||||
public static ArrayList<Cheval> selectAll() {
|
||||
ArrayList<Cheval> lesChevaux = new ArrayList<Cheval>();
|
||||
String requete = "select * from Cheval;";
|
||||
try {
|
||||
BDD uneBDD = new BDD();
|
||||
uneBDD.seConnecter();
|
||||
Statement unStat = uneBDD.getMaConnexion().createStatement();
|
||||
ResultSet unRes = unStat.executeQuery(requete);
|
||||
while(unRes.next()) {
|
||||
int id = unRes.getInt("idcheval");
|
||||
String nom = unRes.getString("nom");
|
||||
String sexe = unRes.getString("sexe");
|
||||
String robe = unRes.getString("robe");
|
||||
String type = unRes.getString("type");
|
||||
String race = unRes.getString("race");
|
||||
String proprietaire = unRes.getString("proprietaire");
|
||||
int age = unRes.getInt("age");
|
||||
String image = unRes.getString("imagecheval");
|
||||
Cheval unCheval = new Cheval(id, nom, sexe, robe, type, race, proprietaire, age, image);
|
||||
lesChevaux.add(unCheval);
|
||||
}
|
||||
unStat.close();
|
||||
unRes.close();
|
||||
uneBDD.seDeconnecter();
|
||||
}
|
||||
catch(SQLException exp) {
|
||||
System.out.println("Erreur d'execution de la requete " + requete);
|
||||
}
|
||||
return lesChevaux;
|
||||
}
|
||||
public static Cheval selectWhere(String nom) {
|
||||
String requete = "select * from Cheval where nom='" + nom + "';";
|
||||
Cheval unCheval = null;
|
||||
try {
|
||||
BDD uneBDD = new BDD();
|
||||
uneBDD.seConnecter();
|
||||
|
||||
Statement unStat = uneBDD.getMaConnexion().createStatement();
|
||||
ResultSet unRes = unStat.executeQuery(requete);
|
||||
if(unRes.next()) {
|
||||
int id = unRes.getInt("idcheval");
|
||||
//Nom
|
||||
String sexe = unRes.getString("sexe");
|
||||
String robe = unRes.getString("robe");
|
||||
String type = unRes.getString("type");
|
||||
String race = unRes.getString("race");
|
||||
String proprietaire = unRes.getString("proprietaire");
|
||||
int age = unRes.getInt("age");
|
||||
String image = unRes.getString("imagecheval");
|
||||
unCheval = new Cheval(id, nom, sexe, robe, type, race, proprietaire, age, image);
|
||||
}
|
||||
unStat.close();
|
||||
unRes.close();
|
||||
uneBDD.seDeconnecter();
|
||||
}
|
||||
catch(SQLException exp) {
|
||||
System.out.println("Erreur d'execution de la requete " + requete);
|
||||
}
|
||||
return unCheval;
|
||||
}
|
||||
public static void insert(Cheval unCheval) {
|
||||
String requete = "insert into Cheval (nom, sexe, robe, type, race, proprietaire, age) values ('"
|
||||
+ unCheval.getNom() + "', '"
|
||||
+ unCheval.getSexe() + "', '"
|
||||
+ unCheval.getRobe() + "', '"
|
||||
+ unCheval.getType() + "', '"
|
||||
+ unCheval.getRace() + "', '"
|
||||
+ unCheval.getProprietaire() + "', '"
|
||||
+ unCheval.getAge() + "');";
|
||||
/*+ unCheval.getImage()+ "');";*/
|
||||
try {
|
||||
BDD uneBDD = new BDD();
|
||||
uneBDD.seConnecter();
|
||||
Statement unStat = uneBDD.getMaConnexion().createStatement();
|
||||
unStat.execute(requete);
|
||||
unStat.close();
|
||||
uneBDD.seDeconnecter();
|
||||
}
|
||||
catch(SQLException exp) {
|
||||
System.out.println("Erreur d'execution de la requete " + requete);
|
||||
}
|
||||
}
|
||||
public static void delete(String nom) {
|
||||
String requete = "delete from Cheval where nom='" + nom + "';";
|
||||
try {
|
||||
BDD uneBDD = new BDD();
|
||||
uneBDD.seConnecter();
|
||||
|
||||
Statement unStat = uneBDD.getMaConnexion().createStatement();
|
||||
unStat.execute(requete);
|
||||
unStat.close();
|
||||
uneBDD.seDeconnecter();
|
||||
}
|
||||
catch(SQLException exp) {
|
||||
System.out.println("Erreur d'execution de la requete " + requete);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,95 @@
|
||||
package modele;
|
||||
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.sql.Statement;
|
||||
import java.util.ArrayList;
|
||||
import controleur.Cours;
|
||||
|
||||
public class ModeleCours
|
||||
{
|
||||
public static ArrayList<Cours> selectAll()
|
||||
{
|
||||
ArrayList<Cours> lesCours = new ArrayList<Cours>();
|
||||
String requete = "select * from Cours;";
|
||||
try {
|
||||
BDD uneBDD = new BDD();
|
||||
uneBDD.seConnecter();
|
||||
Statement unStat = uneBDD.getMaConnexion().createStatement();
|
||||
ResultSet unRes = unStat.executeQuery(requete);
|
||||
while(unRes.next()) {
|
||||
int idcours = unRes.getInt("idcours");
|
||||
String datecours = unRes.getString("datecours");
|
||||
String heuredebut = unRes.getString("heuredebut");
|
||||
String heurefin = unRes.getString("heurefin");
|
||||
Cours unCours = new Cours(idcours, datecours, heuredebut, heurefin);
|
||||
lesCours.add(unCours);
|
||||
}
|
||||
unStat.close();
|
||||
unRes.close();
|
||||
uneBDD.seDeconnecter();
|
||||
}
|
||||
catch(SQLException exp) {
|
||||
System.out.println("Erreur d'execution de la requete " + requete);
|
||||
}
|
||||
return lesCours;
|
||||
}
|
||||
public static void insert(Cours unCours)
|
||||
{
|
||||
String requete = "insert into Cours (datecours, heuredebut, heurefin ) values ('"
|
||||
+ unCours.getDateCours() + "', '"
|
||||
+ unCours.getHeureDebut() + "', '"
|
||||
+ unCours.getHeureFin() + "');";
|
||||
try {
|
||||
BDD uneBDD = new BDD();
|
||||
uneBDD.seConnecter();
|
||||
|
||||
Statement unStat = uneBDD.getMaConnexion().createStatement();
|
||||
unStat.execute(requete);
|
||||
unStat.close();
|
||||
uneBDD.seDeconnecter();
|
||||
}
|
||||
catch(SQLException exp)
|
||||
{
|
||||
System.out.println("Erreur d'execution de la requete " + requete);
|
||||
}
|
||||
}
|
||||
public static void delete(String datecours, String heuredebut) {
|
||||
String requete = "delete from Cours where datecours='" + datecours + "AND heuredebut='" + heuredebut + "';";
|
||||
try {
|
||||
BDD uneBDD = new BDD();
|
||||
uneBDD.seConnecter();
|
||||
|
||||
Statement unStat = uneBDD.getMaConnexion().createStatement();
|
||||
unStat.execute(requete);
|
||||
unStat.close();
|
||||
uneBDD.seDeconnecter();
|
||||
}
|
||||
catch(SQLException exp) {
|
||||
System.out.println("Erreur d'execution de la requete " + requete);
|
||||
}
|
||||
}
|
||||
public static Cours selectWhere(String datecours, String heuredebut)
|
||||
{
|
||||
String requete = "select * from Cours where datecours='" + datecours + "' and heuredebut='" + heuredebut + "';";
|
||||
Cours unCours = null;
|
||||
try {
|
||||
BDD uneBDD = new BDD();
|
||||
uneBDD.seConnecter();
|
||||
Statement unStat = uneBDD.getMaConnexion().createStatement();
|
||||
ResultSet unRes = unStat.executeQuery(requete);
|
||||
if(unRes.next())
|
||||
{
|
||||
String heurefin = unRes.getString("heurefin");
|
||||
unCours = new Cours(datecours, heuredebut, heurefin);
|
||||
}
|
||||
unStat.close();
|
||||
unRes.close();
|
||||
uneBDD.seDeconnecter();
|
||||
}
|
||||
catch(SQLException exp) {
|
||||
System.out.println("Erreur d'execution de la requete " + requete);
|
||||
}
|
||||
return unCours;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,151 @@
|
||||
package modele;
|
||||
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.sql.Statement;
|
||||
import java.util.ArrayList;
|
||||
import controleur.Eleve;
|
||||
|
||||
public class ModeleEleve
|
||||
{
|
||||
public static ArrayList<Eleve> selectAll() {
|
||||
ArrayList<Eleve> lesEleves = new ArrayList<Eleve>();
|
||||
String requete = "select * from compteeleve;";
|
||||
try {
|
||||
BDD uneBDD = new BDD();
|
||||
uneBDD.seConnecter();
|
||||
Statement unStat = uneBDD.getMaConnexion().createStatement();
|
||||
ResultSet unRes = unStat.executeQuery(requete);
|
||||
while(unRes.next()) {
|
||||
int id = unRes.getInt("ideleve");
|
||||
int privilege = unRes.getInt("privilege");
|
||||
String record = unRes.getString("dateenregistre");
|
||||
String pseudo = unRes.getString("pseudo");
|
||||
String prenom = unRes.getString("prenom");
|
||||
String nom = unRes.getString("nom");
|
||||
String sexe = unRes.getString("sexe");
|
||||
int age = unRes.getInt("age");
|
||||
String adresse = unRes.getString("adresse");
|
||||
String mdp = unRes.getString("mdp");
|
||||
String mail = unRes.getString("adressemail");
|
||||
int galop = unRes.getInt("galop");
|
||||
String image = unRes.getString("imageeleve");
|
||||
Eleve unEleve = new Eleve(id, privilege, record, pseudo, prenom, nom, sexe, age, adresse, mdp, mail, galop, image);
|
||||
lesEleves.add(unEleve);
|
||||
}
|
||||
unStat.close();
|
||||
unRes.close();
|
||||
uneBDD.seDeconnecter();
|
||||
}
|
||||
catch(SQLException exp) {
|
||||
System.out.println("Erreur d'execution de la requete " + requete);
|
||||
}
|
||||
return lesEleves;
|
||||
}
|
||||
public static Eleve selectWhere(String mail) {
|
||||
String requete = "select * from compteeleve where adressemail='" + mail + "';";
|
||||
Eleve unEleve = null;
|
||||
try {
|
||||
BDD uneBDD = new BDD();
|
||||
uneBDD.seConnecter();
|
||||
Statement unStat = uneBDD.getMaConnexion().createStatement();
|
||||
ResultSet unRes = unStat.executeQuery(requete);
|
||||
if(unRes.next()) {
|
||||
int id = unRes.getInt("ideleve");
|
||||
int privilege = unRes.getInt("privilege");
|
||||
String record = unRes.getString("dateenregistre");
|
||||
String pseudo = unRes.getString("pseudo");
|
||||
String prenom = unRes.getString("prenom");
|
||||
String nom = unRes.getString("nom");
|
||||
String sexe = unRes.getString("sexe");
|
||||
int age = unRes.getInt("age");
|
||||
String adresse = unRes.getString("adresse");
|
||||
String mdp = unRes.getString("mdp");
|
||||
//adressemail
|
||||
int galop = unRes.getInt("galop");
|
||||
String image = unRes.getString("imageeleve");
|
||||
unEleve = new Eleve(id, privilege, record, pseudo, prenom, nom, sexe, age, adresse, mdp, mail, galop, image);
|
||||
}
|
||||
unStat.close();
|
||||
unRes.close();
|
||||
uneBDD.seDeconnecter();
|
||||
}
|
||||
catch(SQLException exp) {
|
||||
System.out.println("Erreur d'execution de la requete " + requete);
|
||||
}
|
||||
return unEleve;
|
||||
}
|
||||
public static void insert(Eleve unEleve) {
|
||||
String requete = "insert into CompteEleve (privilege, dateenregistre, pseudo, prenom, nom, sexe, age, adresse, mdp, adressemail, galop, imageeleve) values ('"
|
||||
+ "2', NOW(), 'NEW', '"
|
||||
+ unEleve.getPrenom() + "', '"
|
||||
+ unEleve.getNom() + "', '"
|
||||
+ unEleve.getSexe() + "', "
|
||||
+ unEleve.getAge() + ", '"
|
||||
+ unEleve.getAdresse() + "', '"
|
||||
+ "CCB', '"
|
||||
+ unEleve.getMail() + "', "
|
||||
+ unEleve.getGalop() + ", '"
|
||||
+ "./images/avatars/img_user.jpg');";
|
||||
try {
|
||||
BDD uneBDD = new BDD();
|
||||
uneBDD.seConnecter();
|
||||
|
||||
Statement unStat = uneBDD.getMaConnexion().createStatement();
|
||||
unStat.execute(requete);
|
||||
unStat.close();
|
||||
uneBDD.seDeconnecter();
|
||||
}
|
||||
catch(SQLException exp) {
|
||||
System.out.println("Erreur d'execution de la requete " + requete);
|
||||
}
|
||||
}
|
||||
public static void update(Eleve unEleve, String mail) {
|
||||
String valuePrenom = unEleve.getPrenom();
|
||||
String valueNom = unEleve.getNom();
|
||||
String valueSexe = unEleve.getSexe();
|
||||
String valueAge = String.valueOf(unEleve.getAge());
|
||||
String valueGalop = String.valueOf(unEleve.getGalop());
|
||||
String valueAdresse = unEleve.getAdresse();
|
||||
//adressemail
|
||||
if (unEleve.getPrenom().equals("")) { valuePrenom = ""; }
|
||||
else { valuePrenom = ", prenom = '"+ unEleve.getPrenom() +"'"; }
|
||||
if (unEleve.getNom().equals("")) { valueNom = ""; }
|
||||
else { valueNom = ", nom = '"+ unEleve.getNom() +"'"; }
|
||||
if (unEleve.getSexe().equals("")) { valueSexe = ""; }
|
||||
else { valueSexe = ", sexe = '"+ unEleve.getSexe() +"'"; }
|
||||
if (String.valueOf(unEleve.getAge()).equals("")) { valueAge = ""; }
|
||||
else { valueAge = ", age = "+ unEleve.getAge(); }
|
||||
if (unEleve.getAdresse().equals("")) { valueAdresse = ""; }
|
||||
else { valueAdresse = ", adresse = '"+ unEleve.getAdresse() +"'"; }
|
||||
if (String.valueOf(unEleve.getGalop()).equals("")) { valueGalop = ""; }
|
||||
else { valueGalop = ", galop = "+ unEleve.getGalop(); }
|
||||
String requete = "update compteeleve set adressemail ='"+ unEleve.getMail() +"'" + valuePrenom + valueNom + valueSexe + valueAge + valueAdresse + valueGalop + " where adressemail='"+ mail +"';";
|
||||
try {
|
||||
BDD uneBDD = new BDD();
|
||||
uneBDD.seConnecter();
|
||||
Statement unStat = uneBDD.getMaConnexion().createStatement();
|
||||
unStat.execute(requete);
|
||||
unStat.close();
|
||||
uneBDD.seDeconnecter();
|
||||
}
|
||||
catch(SQLException exp) {
|
||||
System.out.println("Erreur d'execution de la requete " + requete);
|
||||
}
|
||||
}
|
||||
public static void delete(String mail) {
|
||||
String requete = "delete from CompteEleve where adressemail='" + mail + "';";
|
||||
try {
|
||||
BDD uneBDD = new BDD();
|
||||
uneBDD.seConnecter();
|
||||
|
||||
Statement unStat = uneBDD.getMaConnexion().createStatement();
|
||||
unStat.execute(requete);
|
||||
unStat.close();
|
||||
uneBDD.seDeconnecter();
|
||||
}
|
||||
catch(SQLException exp) {
|
||||
System.out.println("Erreur d'execution de la requete " + requete);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,109 @@
|
||||
package modele;
|
||||
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.sql.Statement;
|
||||
import java.util.ArrayList;
|
||||
import controleur.Formateur;
|
||||
|
||||
public class ModeleFormateur
|
||||
{
|
||||
public static ArrayList<Formateur> selectAll() {
|
||||
ArrayList<Formateur> lesFormateurs = new ArrayList<Formateur>();
|
||||
String requete = "select * from Formateur;";
|
||||
try {
|
||||
BDD uneBDD = new BDD();
|
||||
uneBDD.seConnecter();
|
||||
Statement unStat = uneBDD.getMaConnexion().createStatement();
|
||||
ResultSet unRes = unStat.executeQuery(requete);
|
||||
while(unRes.next()) {
|
||||
int idformateur = unRes.getInt("idformateur");
|
||||
String login = unRes.getString("login");
|
||||
int privilege = unRes.getInt("privilege");
|
||||
String prenom = unRes.getString("prenom");
|
||||
String nom = unRes.getString("nom");
|
||||
int age = unRes.getInt("age");
|
||||
int galop = unRes.getInt("galop");
|
||||
String sexe = unRes.getString("sexe");
|
||||
String mail = unRes.getString("adressemail");
|
||||
String mdp = unRes.getString("mdp");
|
||||
Formateur unFormateur = new Formateur(idformateur, login, privilege, prenom, nom, age, galop, sexe, mail, mdp);
|
||||
lesFormateurs.add(unFormateur);
|
||||
}
|
||||
unStat.close();
|
||||
unRes.close();
|
||||
uneBDD.seDeconnecter();
|
||||
}
|
||||
catch(SQLException exp) {
|
||||
System.out.println("Erreur d'execution de la requete " + requete);
|
||||
}
|
||||
return lesFormateurs;
|
||||
}
|
||||
public static Formateur selectWhere(String mail, String mdp) {
|
||||
String requete = "select * from Formateur where adressemail='" + mail + "' and mdp='" + mdp + "';";
|
||||
Formateur unFormateur = null;
|
||||
try {
|
||||
BDD uneBDD = new BDD();
|
||||
uneBDD.seConnecter();
|
||||
Statement unStat = uneBDD.getMaConnexion().createStatement();
|
||||
ResultSet unRes = unStat.executeQuery(requete);
|
||||
if(unRes.next())
|
||||
{
|
||||
int idformateur = unRes.getInt("idformateur");
|
||||
String login = unRes.getString("login");
|
||||
int privilege = unRes.getInt("privilege");
|
||||
String prenom = unRes.getString("prenom");
|
||||
String nom = unRes.getString("nom");
|
||||
int age = unRes.getInt("age");
|
||||
int galop = unRes.getInt("galop");
|
||||
String sexe = unRes.getString("sexe");
|
||||
// adressemail & mdp
|
||||
unFormateur = new Formateur(idformateur, login, privilege, prenom, nom, age, galop, sexe, mail, mdp);
|
||||
}
|
||||
unStat.close();
|
||||
unRes.close();
|
||||
uneBDD.seDeconnecter();
|
||||
}
|
||||
catch(SQLException exp) {
|
||||
System.out.println("Erreur d'execution de la requete " + requete);
|
||||
}
|
||||
return unFormateur;
|
||||
}
|
||||
public static void insert(Formateur unFormateur) {
|
||||
String requete = "insert into Formateur (login, privilege, prenom, nom, age, galop, sexe, adressemail, mdp) values ('"
|
||||
+ unFormateur.getLogin() + "', '"
|
||||
+ unFormateur.getPrivilege() + "', '"
|
||||
+ unFormateur.getPrenom() + "', '"
|
||||
+ unFormateur.getNom() + "', '"
|
||||
+ unFormateur.getAge() + "', '"
|
||||
+ unFormateur.getGalop() + "', '"
|
||||
+ unFormateur.getSexe() + "', '"
|
||||
+ unFormateur.getMail() + "', '"
|
||||
+ unFormateur.getMdp() + "');";
|
||||
try {
|
||||
BDD uneBDD = new BDD();
|
||||
uneBDD.seConnecter();
|
||||
Statement unStat = uneBDD.getMaConnexion().createStatement();
|
||||
unStat.execute(requete);
|
||||
unStat.close();
|
||||
uneBDD.seDeconnecter();
|
||||
}
|
||||
catch(SQLException exp) {
|
||||
System.out.println("Erreur d'execution de la requete " + requete);
|
||||
}
|
||||
}
|
||||
public static void delete(String mail) {
|
||||
String requete = "delete from Formateur where adressemail='" + mail + "';";
|
||||
try {
|
||||
BDD uneBDD = new BDD();
|
||||
uneBDD.seConnecter();
|
||||
Statement unStat = uneBDD.getMaConnexion().createStatement();
|
||||
unStat.execute(requete);
|
||||
unStat.close();
|
||||
uneBDD.seDeconnecter();
|
||||
}
|
||||
catch(SQLException exp) {
|
||||
System.out.println("Erreur d'execution de la requete " + requete);
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,4 @@
|
||||
build-date: 2021-06-08 16:39:29 +0000
|
||||
os-info: Linux i386 4.1.12-124.48.6.el6uek.x86_64
|
||||
compiler: javac 1.8.0_241
|
||||
build-tool: Apache Ant(TM) version 1.10.7 compiled on September 1 2019
|
||||
@@ -0,0 +1,5 @@
|
||||
version: 8.0.26
|
||||
branch: release/8.0.26
|
||||
date: 2021-06-08 14:49:03 +0100
|
||||
commit: 9aae1e450989d62c06616c1dcda3e404ef84df70
|
||||
short: 9aae1e45
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,28 @@
|
||||
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
|
||||
|
||||
This is a release of MySQL Connector/J, a JDBC Type 4 driver for MySQL that
|
||||
also supports the new X DevAPI.
|
||||
|
||||
License information can be found in the LICENSE file.
|
||||
|
||||
This distribution may include materials developed by third parties.
|
||||
For license and attribution notices for these materials, please refer to the
|
||||
LICENSE file.
|
||||
|
||||
For more information on MySQL Connector/J, visit
|
||||
https://dev.mysql.com/doc/connector-j/8.0/en/
|
||||
|
||||
For additional downloads and the source of MySQL Connector/J, visit
|
||||
https://dev.mysql.com/downloads/
|
||||
|
||||
MySQL Connector/J is brought to you by the MySQL team at Oracle.
|
||||
|
||||
Notice:
|
||||
- In order to use the logging capabilities provided by the default
|
||||
implementation com.mysql.cj.log.Slf4JLogger, it is required to add one or
|
||||
more jars for Simple Logging Facade for Java (SLF4J) to your CLASSPATH.
|
||||
- To use the X DevAPI features in Connector/J, you also need the external
|
||||
library protobuf-java, which you can download manually from the official
|
||||
Maven repository and add it to the CLASSPATH, or use Maven's automatic
|
||||
dependency resolution features by adding a dependency to "GroupId: mysql"
|
||||
and "ArtifactId: mysql-connector-java" to your project's pom.xml file.
|
||||
File diff suppressed because it is too large
Load Diff
+84
@@ -0,0 +1,84 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2020, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package documentation;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.TreeMap;
|
||||
|
||||
import com.mysql.cj.exceptions.MysqlErrorNumbers;
|
||||
|
||||
/**
|
||||
* Creates XML file describing mapping of MySQL error #'s to SQL92 and X/Open states.
|
||||
*/
|
||||
public class ErrorMappingsDocGenerator {
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
dumpSqlStatesMappingsAsXml();
|
||||
}
|
||||
|
||||
public static void dumpSqlStatesMappingsAsXml() throws Exception {
|
||||
TreeMap<Integer, Integer> allErrorNumbers = new TreeMap<>();
|
||||
Map<Object, String> mysqlErrorNumbersToNames = new HashMap<>();
|
||||
|
||||
// Integer errorNumber = null;
|
||||
|
||||
//
|
||||
// First create a list of all 'known' error numbers that are mapped.
|
||||
//
|
||||
for (Integer errorNumber : MysqlErrorNumbers.mysqlToSql99State.keySet()) {
|
||||
allErrorNumbers.put(errorNumber, errorNumber);
|
||||
}
|
||||
|
||||
//
|
||||
// Now create a list of the actual MySQL error numbers we know about
|
||||
//
|
||||
java.lang.reflect.Field[] possibleFields = MysqlErrorNumbers.class.getDeclaredFields();
|
||||
|
||||
for (int i = 0; i < possibleFields.length; i++) {
|
||||
String fieldName = possibleFields[i].getName();
|
||||
|
||||
if (fieldName.startsWith("ER_")) {
|
||||
mysqlErrorNumbersToNames.put(possibleFields[i].get(null), fieldName);
|
||||
}
|
||||
}
|
||||
|
||||
System.out.println("<ErrorMappings>");
|
||||
|
||||
for (Integer errorNumber : allErrorNumbers.keySet()) {
|
||||
String sql92State = MysqlErrorNumbers.mysqlToSql99(errorNumber.intValue());
|
||||
|
||||
System.out.println(" <ErrorMapping mysqlErrorNumber=\"" + errorNumber + "\" mysqlErrorName=\"" + mysqlErrorNumbersToNames.get(errorNumber)
|
||||
+ "\" legacySqlState=\"" + "" + "\" sql92SqlState=\"" + ((sql92State == null) ? "" : sql92State) + "\"/>");
|
||||
}
|
||||
|
||||
System.out.println("</ErrorMappings>");
|
||||
}
|
||||
}
|
||||
+143
@@ -0,0 +1,143 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2020, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package documentation;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.TreeMap;
|
||||
|
||||
import com.mysql.cj.conf.PropertyDefinition;
|
||||
import com.mysql.cj.conf.PropertyDefinitions;
|
||||
|
||||
/**
|
||||
* Creates docbook table of connection properties from ConnectionProperties class.
|
||||
*/
|
||||
public class PropertiesDocGenerator {
|
||||
|
||||
public static void main(String[] args) {
|
||||
System.out.println(exposeAsXml());
|
||||
}
|
||||
|
||||
static class XmlMap {
|
||||
protected Map<Integer, Map<String, PropertyDefinition<?>>> ordered = new TreeMap<>();
|
||||
protected Map<String, PropertyDefinition<?>> alpha = new TreeMap<>();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a description of the connection properties as an XML document.
|
||||
*
|
||||
* @return the connection properties as an XML document.
|
||||
*/
|
||||
public static String exposeAsXml() {
|
||||
StringBuilder xmlBuf = new StringBuilder();
|
||||
xmlBuf.append("<ConnectionProperties>");
|
||||
|
||||
int numCategories = PropertyDefinitions.PROPERTY_CATEGORIES.length;
|
||||
|
||||
Map<String, XmlMap> propertyListByCategory = new HashMap<>();
|
||||
|
||||
for (int i = 0; i < numCategories; i++) {
|
||||
propertyListByCategory.put(PropertyDefinitions.PROPERTY_CATEGORIES[i], new XmlMap());
|
||||
}
|
||||
|
||||
for (PropertyDefinition<?> pdef : PropertyDefinitions.PROPERTY_KEY_TO_PROPERTY_DEFINITION.values()) {
|
||||
XmlMap sortMaps = propertyListByCategory.get(pdef.getCategory());
|
||||
int orderInCategory = pdef.getOrder();
|
||||
|
||||
if (orderInCategory == Integer.MIN_VALUE) {
|
||||
sortMaps.alpha.put(pdef.getName(), pdef);
|
||||
} else {
|
||||
Integer order = Integer.valueOf(orderInCategory);
|
||||
Map<String, PropertyDefinition<?>> orderMap = sortMaps.ordered.get(order);
|
||||
|
||||
if (orderMap == null) {
|
||||
orderMap = new TreeMap<>();
|
||||
sortMaps.ordered.put(order, orderMap);
|
||||
}
|
||||
|
||||
orderMap.put(pdef.getName(), pdef);
|
||||
}
|
||||
}
|
||||
|
||||
for (int j = 0; j < numCategories; j++) {
|
||||
XmlMap sortMaps = propertyListByCategory.get(PropertyDefinitions.PROPERTY_CATEGORIES[j]);
|
||||
|
||||
xmlBuf.append("\n <PropertyCategory name=\"");
|
||||
xmlBuf.append(PropertyDefinitions.PROPERTY_CATEGORIES[j]);
|
||||
xmlBuf.append("\">");
|
||||
|
||||
for (Map<String, PropertyDefinition<?>> orderedEl : sortMaps.ordered.values()) {
|
||||
for (PropertyDefinition<?> pdef : orderedEl.values()) {
|
||||
xmlBuf.append("\n <Property name=\"");
|
||||
xmlBuf.append(pdef.getName());
|
||||
|
||||
xmlBuf.append("\" default=\"");
|
||||
if (pdef.getDefaultValue() != null) {
|
||||
xmlBuf.append(pdef.getDefaultValue());
|
||||
}
|
||||
xmlBuf.append("\" sortOrder=\"");
|
||||
xmlBuf.append(pdef.getOrder());
|
||||
xmlBuf.append("\" since=\"");
|
||||
xmlBuf.append(pdef.getSinceVersion());
|
||||
xmlBuf.append("\">\n");
|
||||
xmlBuf.append(" ");
|
||||
String escapedDescription = pdef.getDescription();
|
||||
escapedDescription = escapedDescription.replace("&", "&").replace("<", "<").replace(">", ">");
|
||||
|
||||
xmlBuf.append(escapedDescription);
|
||||
xmlBuf.append("\n </Property>");
|
||||
}
|
||||
}
|
||||
|
||||
for (PropertyDefinition<?> pdef : sortMaps.alpha.values()) {
|
||||
xmlBuf.append("\n <Property name=\"");
|
||||
xmlBuf.append(pdef.getName());
|
||||
|
||||
xmlBuf.append("\" default=\"");
|
||||
if (pdef.getDefaultValue() != null) {
|
||||
xmlBuf.append(pdef.getDefaultValue());
|
||||
}
|
||||
|
||||
xmlBuf.append("\" sortOrder=\"alpha\" since=\"");
|
||||
xmlBuf.append(pdef.getSinceVersion());
|
||||
xmlBuf.append("\">\n");
|
||||
xmlBuf.append(" ");
|
||||
xmlBuf.append(pdef.getDescription());
|
||||
xmlBuf.append("\n </Property>");
|
||||
}
|
||||
|
||||
xmlBuf.append("\n </PropertyCategory>");
|
||||
}
|
||||
|
||||
xmlBuf.append("\n</ConnectionProperties>");
|
||||
|
||||
return xmlBuf.toString();
|
||||
}
|
||||
}
|
||||
+139
@@ -0,0 +1,139 @@
|
||||
/*
|
||||
* Copyright (c) 2017, 2020, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package instrumentation;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
import com.mysql.cj.conf.BooleanPropertyDefinition;
|
||||
import com.mysql.cj.conf.EnumPropertyDefinition;
|
||||
import com.mysql.cj.conf.IntegerPropertyDefinition;
|
||||
import com.mysql.cj.conf.LongPropertyDefinition;
|
||||
import com.mysql.cj.conf.MemorySizePropertyDefinition;
|
||||
import com.mysql.cj.conf.PropertyDefinition;
|
||||
import com.mysql.cj.conf.PropertyDefinitions;
|
||||
import com.mysql.cj.conf.StringPropertyDefinition;
|
||||
import com.mysql.cj.jdbc.MysqlDataSource;
|
||||
|
||||
import javassist.ClassPool;
|
||||
import javassist.CtClass;
|
||||
import javassist.CtMethod;
|
||||
import javassist.CtNewMethod;
|
||||
import javassist.bytecode.DuplicateMemberException;
|
||||
|
||||
public class AddMethods {
|
||||
private static boolean verbose = false;
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
|
||||
System.out.println("Applying AddMethods.");
|
||||
|
||||
verbose = "true".equalsIgnoreCase(args[1]);
|
||||
|
||||
ClassPool pool = ClassPool.getDefault();
|
||||
pool.insertClassPath(args[0]);
|
||||
|
||||
sysOut("---");
|
||||
CtClass clazz = pool.get(MysqlDataSource.class.getName());
|
||||
sysOut("Add properties setters/getters to " + clazz.getName());
|
||||
addPropertiesGettersSetters(clazz, PropertyDefinitions.PROPERTY_KEY_TO_PROPERTY_DEFINITION.values());
|
||||
clazz.writeFile(args[0]);
|
||||
|
||||
}
|
||||
|
||||
private static void sysOut(String s) {
|
||||
if (verbose) {
|
||||
System.out.println(s);
|
||||
}
|
||||
}
|
||||
|
||||
private static void addPropertiesGettersSetters(CtClass clazz, Collection<PropertyDefinition<?>> propertyDefinitions) throws Exception {
|
||||
for (PropertyDefinition<?> def : propertyDefinitions) {
|
||||
if (def.getCategory().equals(PropertyDefinitions.CATEGORY_XDEVAPI)) {
|
||||
continue;
|
||||
}
|
||||
String pname = def.hasCcAlias() ? def.getCcAlias() : def.getName();
|
||||
|
||||
if (def instanceof StringPropertyDefinition) {
|
||||
addGetter(clazz, pname, String.class.getName(), "getStringRuntimeProperty");
|
||||
addSetter(clazz, pname, String.class.getName(), "setStringRuntimeProperty");
|
||||
|
||||
} else if (def instanceof BooleanPropertyDefinition) {
|
||||
addGetter(clazz, pname, Boolean.TYPE.getName(), "getBooleanRuntimeProperty");
|
||||
addSetter(clazz, pname, Boolean.TYPE.getName(), "setBooleanRuntimeProperty");
|
||||
|
||||
} else if (def instanceof IntegerPropertyDefinition) {
|
||||
addGetter(clazz, pname, Integer.TYPE.getName(), "getIntegerRuntimeProperty");
|
||||
addSetter(clazz, pname, Integer.TYPE.getName(), "setIntegerRuntimeProperty");
|
||||
|
||||
} else if (def instanceof LongPropertyDefinition) {
|
||||
addGetter(clazz, pname, Long.TYPE.getName(), "getLongRuntimeProperty");
|
||||
addSetter(clazz, pname, Long.TYPE.getName(), "setLongRuntimeProperty");
|
||||
|
||||
} else if (def instanceof MemorySizePropertyDefinition) {
|
||||
addGetter(clazz, pname, Integer.TYPE.getName(), "getMemorySizeRuntimeProperty");
|
||||
addSetter(clazz, pname, Integer.TYPE.getName(), "setMemorySizeRuntimeProperty");
|
||||
|
||||
} else if (def instanceof EnumPropertyDefinition<?>) {
|
||||
addGetter(clazz, pname, String.class.getName(), "getEnumRuntimeProperty");
|
||||
addSetter(clazz, pname, "java.lang.String", "setEnumRuntimeProperty");
|
||||
|
||||
} else {
|
||||
throw new Exception("Unknown " + def.getName() + " property type.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void addGetter(CtClass clazz, String pname, String paramType, String getPropertyMethod) throws Exception {
|
||||
String mname = "get" + pname.substring(0, 1).toUpperCase() + pname.substring(1);
|
||||
String mbody = "public " + paramType + " " + mname + "() throws java.sql.SQLException { return " + getPropertyMethod + "(\"" + pname + "\");}";
|
||||
sysOut(mbody);
|
||||
try {
|
||||
CtMethod m = CtNewMethod.make(mbody, clazz);
|
||||
clazz.addMethod(m);
|
||||
sysOut(m.toString());
|
||||
} catch (DuplicateMemberException ex) {
|
||||
// ignore
|
||||
}
|
||||
}
|
||||
|
||||
private static void addSetter(CtClass clazz, String pname, String paramType, String setPropertyMethod) throws Exception {
|
||||
String mname = "set" + pname.substring(0, 1).toUpperCase() + pname.substring(1);
|
||||
String mbody = "public void " + mname + "(" + paramType + " value) throws java.sql.SQLException { " + setPropertyMethod + "(\"" + pname
|
||||
+ "\", value);}";
|
||||
sysOut(mbody);
|
||||
try {
|
||||
CtMethod m = CtNewMethod.make(mbody, clazz);
|
||||
clazz.addMethod(m);
|
||||
sysOut(m.toString());
|
||||
} catch (DuplicateMemberException ex) {
|
||||
// ignore
|
||||
}
|
||||
}
|
||||
}
|
||||
+193
@@ -0,0 +1,193 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 2020, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package instrumentation;
|
||||
|
||||
import java.sql.Savepoint;
|
||||
import java.util.Map;
|
||||
|
||||
import com.mysql.cj.jdbc.ConnectionImpl;
|
||||
import com.mysql.cj.jdbc.ConnectionWrapper;
|
||||
|
||||
import javassist.ClassPool;
|
||||
import javassist.CtClass;
|
||||
import javassist.CtMethod;
|
||||
|
||||
public class CommonChecks {
|
||||
private static boolean verbose = false;
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
|
||||
System.out.println("Applying CommonChecks.");
|
||||
|
||||
verbose = "true".equalsIgnoreCase(args[1]);
|
||||
|
||||
ClassPool pool = ClassPool.getDefault();
|
||||
pool.insertClassPath(args[0]);
|
||||
|
||||
// params classes
|
||||
CtClass ctClazz = pool.get(Class.class.getName());
|
||||
//CtClass ctClob = pool.get(java.sql.Clob.class.getName());
|
||||
//CtClass ctBindValue = pool.get(BindValue.class.getName());
|
||||
CtClass ctBool = pool.get(boolean.class.getName());
|
||||
//CtClass ctBoolArray = pool.get(boolean[].class.getName());
|
||||
//CtClass ctByteArray2 = pool.get(byte[][].class.getName());
|
||||
//CtClass ctBuffer = pool.get(Buffer.class.getName());
|
||||
//CtClass ctExecutor = pool.get(Executor.class.getName());
|
||||
//CtClass ctFieldArray = pool.get(Field[].class.getName());
|
||||
CtClass ctInt = pool.get(int.class.getName());
|
||||
CtClass ctIntArray = pool.get(int[].class.getName());
|
||||
//CtClass ctInputStreamArray = pool.get(InputStream[].class.getName());
|
||||
//CtClass ctLong = pool.get(long.class.getName());
|
||||
CtClass ctMap = pool.get(Map.class.getName());
|
||||
//CtClass ctMysqlSavepoint = pool.get(MysqlSavepoint.class.getName());
|
||||
CtClass ctObjectArray = pool.get(Object[].class.getName());
|
||||
//CtClass ctProperties = pool.get(Properties.class.getName());
|
||||
//CtClass ctReader = pool.get(Reader.class.getName());
|
||||
CtClass ctSavepoint = pool.get(Savepoint.class.getName());
|
||||
//CtClass ctStatement = pool.get(Statement.class.getName());
|
||||
CtClass ctString = pool.get(String.class.getName());
|
||||
CtClass ctStringArray = pool.get(String[].class.getName());
|
||||
|
||||
CtClass clazz = pool.get(ConnectionImpl.class.getName());
|
||||
// addClosedCheck(clazz.getDeclaredMethod("changeUser", new CtClass[] { ctString, ctString }));
|
||||
addClosedCheck(clazz.getDeclaredMethod("clientPrepareStatement", new CtClass[] { ctString, ctInt, ctInt, ctBool }));
|
||||
// addClosedCheck(clazz.getDeclaredMethod("commit", new CtClass[] {}));
|
||||
addClosedCheck(clazz.getDeclaredMethod("createStatement", new CtClass[] { ctInt, ctInt }));
|
||||
// addClosedCheck(clazz.getDeclaredMethod("getMetaData", new CtClass[] { ctBool, ctBool }));
|
||||
// addClosedCheck(clazz.getDeclaredMethod("getNetworkTimeout", new CtClass[] {}));
|
||||
// addClosedCheck(clazz.getDeclaredMethod("getSchema", new CtClass[] {}));
|
||||
// addClosedCheck(clazz.getDeclaredMethod("isAutoCommitNonDefaultOnServer", new CtClass[] {}));
|
||||
// addClosedCheck(clazz.getDeclaredMethod("isServerLocal", new CtClass[] {}));
|
||||
addClosedCheck(clazz.getDeclaredMethod("isWrapperFor", new CtClass[] { ctClazz }));
|
||||
// addClosedCheck(clazz.getDeclaredMethod("prepareStatement", new CtClass[] { ctString, ctInt, ctInt }));
|
||||
// addClosedCheck(clazz.getDeclaredMethod("rollback", new CtClass[] {}));
|
||||
// addClosedCheck(clazz.getDeclaredMethod("rollback", new CtClass[] { ctSavepoint }));
|
||||
// addClosedCheck(clazz.getDeclaredMethod("setAutoCommit", new CtClass[] { ctBool }));
|
||||
// addClosedCheck(clazz.getDeclaredMethod("setCatalog", new CtClass[] { ctString }));
|
||||
// addClosedCheck(clazz.getDeclaredMethod("setNetworkTimeout", new CtClass[] { ctExecutor, ctInt }));
|
||||
addClosedCheck(clazz.getDeclaredMethod("setReadOnly", new CtClass[] { ctBool }));
|
||||
// addClosedCheck(clazz.getDeclaredMethod("setSavepoint", new CtClass[] { ctMysqlSavepoint }));
|
||||
// addClosedCheck(clazz.getDeclaredMethod("setSchema", new CtClass[] { ctString }));
|
||||
// addClosedCheck(clazz.getDeclaredMethod("setTransactionIsolation", new CtClass[] { ctInt }));
|
||||
addClosedCheck(clazz.getDeclaredMethod("versionMeetsMinimum", new CtClass[] { ctInt, ctInt, ctInt }));
|
||||
clazz.writeFile(args[0]);
|
||||
|
||||
clazz = pool.get(ConnectionWrapper.class.getName());
|
||||
addClosedCheck(clazz.getDeclaredMethod("changeUser", new CtClass[] { ctString, ctString }));
|
||||
addClosedCheck(clazz.getDeclaredMethod("clientPrepare", new CtClass[] { ctString }));
|
||||
addClosedCheck(clazz.getDeclaredMethod("clientPrepare", new CtClass[] { ctString, ctInt, ctInt }));
|
||||
addClosedCheck(clazz.getDeclaredMethod("clientPrepareStatement", new CtClass[] { ctString }));
|
||||
addClosedCheck(clazz.getDeclaredMethod("clientPrepareStatement", new CtClass[] { ctString, ctInt }));
|
||||
addClosedCheck(clazz.getDeclaredMethod("clientPrepareStatement", new CtClass[] { ctString, ctIntArray }));
|
||||
addClosedCheck(clazz.getDeclaredMethod("clientPrepareStatement", new CtClass[] { ctString, ctStringArray }));
|
||||
addClosedCheck(clazz.getDeclaredMethod("clientPrepareStatement", new CtClass[] { ctString, ctInt, ctInt }));
|
||||
addClosedCheck(clazz.getDeclaredMethod("clientPrepareStatement", new CtClass[] { ctString, ctInt, ctInt, ctInt }));
|
||||
addClosedCheck(clazz.getDeclaredMethod("commit", new CtClass[] {}));
|
||||
addClosedCheck(clazz.getDeclaredMethod("clearWarnings", new CtClass[] {}));
|
||||
addClosedCheck(clazz.getDeclaredMethod("createArrayOf", new CtClass[] { ctString, ctObjectArray }));
|
||||
addClosedCheck(clazz.getDeclaredMethod("createBlob", new CtClass[] {}));
|
||||
addClosedCheck(clazz.getDeclaredMethod("createClob", new CtClass[] {}));
|
||||
addClosedCheck(clazz.getDeclaredMethod("createNClob", new CtClass[] {}));
|
||||
addClosedCheck(clazz.getDeclaredMethod("createStatement", new CtClass[] {}));
|
||||
addClosedCheck(clazz.getDeclaredMethod("createStatement", new CtClass[] { ctInt, ctInt }));
|
||||
addClosedCheck(clazz.getDeclaredMethod("createStatement", new CtClass[] { ctInt, ctInt, ctInt }));
|
||||
addClosedCheck(clazz.getDeclaredMethod("createSQLXML", new CtClass[] {}));
|
||||
addClosedCheck(clazz.getDeclaredMethod("createStruct", new CtClass[] { ctString, ctObjectArray }));
|
||||
addClosedCheck(clazz.getDeclaredMethod("getAutoCommit", new CtClass[] {}));
|
||||
addClosedCheck(clazz.getDeclaredMethod("getCatalog", new CtClass[] {}));
|
||||
addClosedCheck(clazz.getDeclaredMethod("getClientInfo", new CtClass[] {}));
|
||||
addClosedCheck(clazz.getDeclaredMethod("getClientInfo", new CtClass[] { ctString }));
|
||||
addClosedCheck(clazz.getDeclaredMethod("getDatabase", new CtClass[] {}));
|
||||
addClosedCheck(clazz.getDeclaredMethod("getHoldability", new CtClass[] {}));
|
||||
// addClosedCheck(clazz.getDeclaredMethod("getProcessHost", new CtClass[] {}));
|
||||
addClosedCheck(clazz.getDeclaredMethod("getMetaData", new CtClass[] {}));
|
||||
// addClosedCheck(clazz.getDeclaredMethod("getNetworkTimeout", new CtClass[] {}));
|
||||
addClosedCheck(clazz.getDeclaredMethod("getTransactionIsolation", new CtClass[] {}));
|
||||
addClosedCheck(clazz.getDeclaredMethod("getTypeMap", new CtClass[] {}));
|
||||
addClosedCheck(clazz.getDeclaredMethod("getWarnings", new CtClass[] {}));
|
||||
addClosedCheck(clazz.getDeclaredMethod("isReadOnly", new CtClass[] {}));
|
||||
addClosedCheck(clazz.getDeclaredMethod("isReadOnly", new CtClass[] { ctBool }));
|
||||
//addClosedCheck(clazz.getDeclaredMethod("isWrapperFor", new CtClass[] { ctClazz }));
|
||||
addClosedCheck(clazz.getDeclaredMethod("nativeSQL", new CtClass[] { ctString }));
|
||||
addClosedCheck(clazz.getDeclaredMethod("prepareCall", new CtClass[] { ctString }));
|
||||
addClosedCheck(clazz.getDeclaredMethod("prepareCall", new CtClass[] { ctString, ctInt, ctInt }));
|
||||
addClosedCheck(clazz.getDeclaredMethod("prepareCall", new CtClass[] { ctString, ctInt, ctInt, ctInt }));
|
||||
addClosedCheck(clazz.getDeclaredMethod("prepareStatement", new CtClass[] { ctString }));
|
||||
addClosedCheck(clazz.getDeclaredMethod("prepareStatement", new CtClass[] { ctString, ctInt }));
|
||||
// addClosedCheck(clazz.getDeclaredMethod("prepareStatement", new CtClass[] { ctString, ctStringArray }));
|
||||
addClosedCheck(clazz.getDeclaredMethod("prepareStatement", new CtClass[] { ctString, ctIntArray }));
|
||||
addClosedCheck(clazz.getDeclaredMethod("prepareStatement", new CtClass[] { ctString, ctInt, ctInt }));
|
||||
addClosedCheck(clazz.getDeclaredMethod("prepareStatement", new CtClass[] { ctString, ctInt, ctInt, ctInt }));
|
||||
addClosedCheck(clazz.getDeclaredMethod("prepareStatement", new CtClass[] { ctString, ctStringArray }));
|
||||
addClosedCheck(clazz.getDeclaredMethod("releaseSavepoint", new CtClass[] { ctSavepoint }));
|
||||
addClosedCheck(clazz.getDeclaredMethod("resetServerState", new CtClass[] {}));
|
||||
addClosedCheck(clazz.getDeclaredMethod("rollback", new CtClass[] {}));
|
||||
addClosedCheck(clazz.getDeclaredMethod("rollback", new CtClass[] { ctSavepoint }));
|
||||
addClosedCheck(clazz.getDeclaredMethod("serverPrepareStatement", new CtClass[] { ctString }));
|
||||
addClosedCheck(clazz.getDeclaredMethod("serverPrepareStatement", new CtClass[] { ctString, ctInt }));
|
||||
addClosedCheck(clazz.getDeclaredMethod("serverPrepareStatement", new CtClass[] { ctString, ctIntArray }));
|
||||
addClosedCheck(clazz.getDeclaredMethod("serverPrepareStatement", new CtClass[] { ctString, ctStringArray }));
|
||||
addClosedCheck(clazz.getDeclaredMethod("serverPrepareStatement", new CtClass[] { ctString, ctInt, ctInt }));
|
||||
addClosedCheck(clazz.getDeclaredMethod("serverPrepareStatement", new CtClass[] { ctString, ctInt, ctInt, ctInt }));
|
||||
addClosedCheck(clazz.getDeclaredMethod("setAutoCommit", new CtClass[] { ctBool }));
|
||||
addClosedCheck(clazz.getDeclaredMethod("setCatalog", new CtClass[] { ctString }));
|
||||
// addClosedCheck(clazz.getDeclaredMethod("setClientInfo", new CtClass[] { ctString, ctString }));
|
||||
// addClosedCheck(clazz.getDeclaredMethod("setClientInfo", new CtClass[] { ctProperties }));
|
||||
addClosedCheck(clazz.getDeclaredMethod("setDatabase", new CtClass[] { ctString }));
|
||||
addClosedCheck(clazz.getDeclaredMethod("setHoldability", new CtClass[] { ctInt }));
|
||||
// addClosedCheck(clazz.getDeclaredMethod("setNetworkTimeout", new CtClass[] { ctExecutor, ctInt }));
|
||||
addClosedCheck(clazz.getDeclaredMethod("setReadOnly", new CtClass[] { ctBool }));
|
||||
addClosedCheck(clazz.getDeclaredMethod("setSavepoint", new CtClass[] {}));
|
||||
addClosedCheck(clazz.getDeclaredMethod("setSavepoint", new CtClass[] { ctString }));
|
||||
addClosedCheck(clazz.getDeclaredMethod("setSchema", new CtClass[] { ctString }));
|
||||
addClosedCheck(clazz.getDeclaredMethod("setTransactionIsolation", new CtClass[] { ctInt }));
|
||||
addClosedCheck(clazz.getDeclaredMethod("setTypeMap", new CtClass[] { ctMap }));
|
||||
addClosedCheck(clazz.getDeclaredMethod("shutdownServer", new CtClass[] {}));
|
||||
//addClosedCheck(clazz.getDeclaredMethod("versionMeetsMinimum", new CtClass[] { ctInt, ctInt, ctInt }));
|
||||
clazz.writeFile(args[0]);
|
||||
|
||||
//clazz = pool.get(MultiHostMySQLConnection.class.getName());
|
||||
//addClosedCheck(clazz.getDeclaredMethod("isWrapperFor", new CtClass[] { ctClazz }));
|
||||
//clazz.writeFile(args[0]);
|
||||
|
||||
}
|
||||
|
||||
private static void addClosedCheck(CtMethod m) throws Exception {
|
||||
sysOut(m.toString());
|
||||
m.insertBefore("checkClosed();");
|
||||
}
|
||||
|
||||
private static void sysOut(String s) {
|
||||
if (verbose) {
|
||||
System.out.println(s);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
+734
@@ -0,0 +1,734 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 2020, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package instrumentation;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.sql.Savepoint;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
import java.util.TreeMap;
|
||||
|
||||
import com.mysql.cj.QueryBindings;
|
||||
import com.mysql.cj.exceptions.CJException;
|
||||
import com.mysql.cj.jdbc.Blob;
|
||||
import com.mysql.cj.jdbc.BlobFromLocator;
|
||||
import com.mysql.cj.jdbc.CallableStatement;
|
||||
import com.mysql.cj.jdbc.CallableStatement.CallableStatementParamInfo;
|
||||
import com.mysql.cj.jdbc.ClientPreparedStatement;
|
||||
import com.mysql.cj.jdbc.Clob;
|
||||
import com.mysql.cj.jdbc.ConnectionImpl;
|
||||
import com.mysql.cj.jdbc.ConnectionWrapper;
|
||||
import com.mysql.cj.jdbc.DatabaseMetaData;
|
||||
import com.mysql.cj.jdbc.DatabaseMetaDataUsingInfoSchema;
|
||||
import com.mysql.cj.jdbc.JdbcConnection;
|
||||
import com.mysql.cj.jdbc.JdbcStatement;
|
||||
import com.mysql.cj.jdbc.MysqlConnectionPoolDataSource;
|
||||
import com.mysql.cj.jdbc.MysqlDataSource;
|
||||
import com.mysql.cj.jdbc.MysqlParameterMetadata;
|
||||
import com.mysql.cj.jdbc.MysqlPooledConnection;
|
||||
import com.mysql.cj.jdbc.MysqlSQLXML;
|
||||
import com.mysql.cj.jdbc.MysqlSavepoint;
|
||||
import com.mysql.cj.jdbc.MysqlXAConnection;
|
||||
import com.mysql.cj.jdbc.MysqlXADataSource;
|
||||
import com.mysql.cj.jdbc.MysqlXid;
|
||||
import com.mysql.cj.jdbc.NClob;
|
||||
import com.mysql.cj.jdbc.NonRegisteringDriver;
|
||||
import com.mysql.cj.jdbc.ServerPreparedStatement;
|
||||
import com.mysql.cj.jdbc.StatementImpl;
|
||||
import com.mysql.cj.jdbc.SuspendableXAConnection;
|
||||
import com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping;
|
||||
import com.mysql.cj.jdbc.ha.LoadBalancedConnection;
|
||||
import com.mysql.cj.jdbc.ha.LoadBalancedMySQLConnection;
|
||||
import com.mysql.cj.jdbc.ha.MultiHostMySQLConnection;
|
||||
import com.mysql.cj.jdbc.ha.ReplicationConnection;
|
||||
import com.mysql.cj.jdbc.ha.ReplicationMySQLConnection;
|
||||
import com.mysql.cj.jdbc.result.ResultSetImpl;
|
||||
import com.mysql.cj.jdbc.result.ResultSetInternalMethods;
|
||||
import com.mysql.cj.jdbc.result.ResultSetMetaData;
|
||||
import com.mysql.cj.jdbc.result.UpdatableResultSet;
|
||||
import com.mysql.cj.protocol.ColumnDefinition;
|
||||
import com.mysql.cj.protocol.Message;
|
||||
|
||||
import javassist.ClassPool;
|
||||
import javassist.CtClass;
|
||||
import javassist.CtMethod;
|
||||
import javassist.NotFoundException;
|
||||
|
||||
public class TranslateExceptions {
|
||||
|
||||
private static CtClass runTimeException = null;
|
||||
private static ClassPool pool = ClassPool.getDefault();
|
||||
private static Map<String, List<CtMethod>> processed = new TreeMap<>();
|
||||
|
||||
private static String EXCEPTION_INTERCEPTOR_GETTER = "getExceptionInterceptor()";
|
||||
private static String EXCEPTION_INTERCEPTOR_MEMBER = "this.exceptionInterceptor";
|
||||
private static boolean verbose = false;
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
|
||||
System.out.println("Applying TranslateExceptions.");
|
||||
|
||||
verbose = "true".equalsIgnoreCase(args[1]);
|
||||
|
||||
pool.insertClassPath(args[0]);
|
||||
processed.clear();
|
||||
|
||||
runTimeException = pool.get(CJException.class.getName());
|
||||
|
||||
// params classes
|
||||
//CtClass ctServerPreparedQueryBindValue = pool.get(ServerPreparedQueryBindValue.class.getName());
|
||||
CtClass ctQueryBindings = pool.get(QueryBindings.class.getName());
|
||||
CtClass ctByteArray = pool.get(byte[].class.getName());
|
||||
CtClass ctColumnDefinition = pool.get(ColumnDefinition.class.getName());
|
||||
|
||||
CtClass ctLongArray = pool.get(long[].class.getName());
|
||||
//CtClass ctInputStream = pool.get(InputStream.class.getName());
|
||||
CtClass ctJdbcConnection = pool.get(JdbcConnection.class.getName());
|
||||
CtClass ctMysqlSavepoint = pool.get(MysqlSavepoint.class.getName());
|
||||
//CtClass ctPacketPayload = pool.get(PacketPayload.class.getName());
|
||||
CtClass ctProperties = pool.get(Properties.class.getName());
|
||||
CtClass ctResultSet = pool.get(ResultSet.class.getName());
|
||||
CtClass ctResultSetInternalMethods = pool.get(ResultSetInternalMethods.class.getName());
|
||||
CtClass ctStatement = pool.get(java.sql.Statement.class.getName());
|
||||
CtClass ctStatementImpl = pool.get(StatementImpl.class.getName());
|
||||
CtClass ctString = pool.get(String.class.getName());
|
||||
|
||||
CtClass ctMessageBody = pool.get(Message.class.getName());
|
||||
|
||||
// class we want to instrument
|
||||
CtClass clazz;
|
||||
|
||||
/*
|
||||
* java.sql.Blob
|
||||
*/
|
||||
// com.mysql.cj.jdbc.Blob implements java.sql.Blob, OutputStreamWatcher
|
||||
clazz = pool.get(Blob.class.getName());
|
||||
instrumentJdbcMethods(clazz, java.sql.Blob.class, false, EXCEPTION_INTERCEPTOR_MEMBER);
|
||||
clazz.writeFile(args[0]);
|
||||
|
||||
// com.mysql.cj.jdbc.BlobFromLocator implements java.sql.Blob
|
||||
clazz = pool.get(BlobFromLocator.class.getName());
|
||||
instrumentJdbcMethods(clazz, java.sql.Blob.class, false, EXCEPTION_INTERCEPTOR_MEMBER);
|
||||
clazz.writeFile(args[0]);
|
||||
|
||||
/*
|
||||
* java.sql.CallableStatement
|
||||
*/
|
||||
// com.mysql.cj.jdbc.CallableStatement extends PreparedStatement implements java.sql.CallableStatement
|
||||
clazz = pool.get(CallableStatement.class.getName());
|
||||
instrumentJdbcMethods(clazz, java.sql.CallableStatement.class, false, EXCEPTION_INTERCEPTOR_GETTER);
|
||||
instrumentJdbcMethods(clazz, JdbcStatement.class, true, EXCEPTION_INTERCEPTOR_GETTER);
|
||||
// non-JDBC
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("checkIsOutputParam", new CtClass[] { CtClass.intType }), EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("checkParameterIndexBounds", new CtClass[] { CtClass.intType }), EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("checkReadOnlyProcedure", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("convertGetProcedureColumnsToInternalDescriptors", new CtClass[] { ctResultSet }),
|
||||
EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("determineParameterTypes", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("fakeParameterTypes", new CtClass[] { CtClass.booleanType }), EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("fixParameterName", new CtClass[] { ctString }), EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("generateParameterMap", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("getNamedParamIndex", new CtClass[] { ctString, CtClass.booleanType }),
|
||||
EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("getOutputParameters", new CtClass[] { CtClass.intType }), EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("mapOutputParameterIndexToRsIndex", new CtClass[] { CtClass.intType }),
|
||||
EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("retrieveOutParams", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("setInOutParamsOnServer", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("setOutParams", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER);
|
||||
clazz.writeFile(args[0]);
|
||||
|
||||
/*
|
||||
* com.mysql.cj.jdbc.StatementWrapper extends WrapperBase implements Statement
|
||||
*/
|
||||
// TODO: Does it's own typical exception wrapping, could be instrumented with different catch method
|
||||
|
||||
/*
|
||||
* com.mysql.cj.jdbc.PreparedStatementWrapper extends StatementWrapper implements PreparedStatement
|
||||
*/
|
||||
// TODO: Does it's own typical exception wrapping, could be instrumented with different catch method
|
||||
|
||||
/*
|
||||
* com.mysql.cj.jdbc.CallableStatementWrapper extends PreparedStatementWrapper implements CallableStatement
|
||||
*/
|
||||
// TODO: Does it's own typical exception wrapping, could be instrumented with different catch method
|
||||
|
||||
/*
|
||||
* java.sql.Clob
|
||||
*/
|
||||
// com.mysql.cj.jdbc.Clob implements java.sql.Clob, OutputStreamWatcher, WriterWatcher
|
||||
clazz = pool.get(Clob.class.getName());
|
||||
instrumentJdbcMethods(clazz, java.sql.Clob.class, false, EXCEPTION_INTERCEPTOR_MEMBER);
|
||||
clazz.writeFile(args[0]);
|
||||
|
||||
/*
|
||||
*
|
||||
* java.sql.Connection extends java.sql.Wrapper
|
||||
* ----> com.mysql.cj.jdbc.JdbcConnection extends java.sql.Connection, MysqlConnection
|
||||
* ----------> com.mysql.cj.jdbc.ConnectionImpl
|
||||
* ----------> com.mysql.cj.jdbc.LoadBalancedConnection extends JdbcConnection
|
||||
* -------------> com.mysql.cj.jdbc.LoadBalancedMySQLConnection extends MultiHostMySQLConnection implements LoadBalancedConnection
|
||||
* ----------> com.mysql.cj.jdbc.MultiHostMySQLConnection
|
||||
* -------> com.mysql.cj.jdbc.ReplicationConnection implements JdbcConnection, PingTarget
|
||||
* -------> com.mysql.cj.jdbc.ConnectionWrapper
|
||||
*/
|
||||
// ConnectionImpl extends AbstractJdbcConnection implements JdbcConnection
|
||||
clazz = pool.get(ConnectionImpl.class.getName());
|
||||
instrumentJdbcMethods(clazz, JdbcConnection.class, false, EXCEPTION_INTERCEPTOR_GETTER);
|
||||
// non-JDBC
|
||||
catchRuntimeException(clazz,
|
||||
clazz.getDeclaredMethod("clientPrepareStatement", new CtClass[] { ctString, CtClass.intType, CtClass.intType, CtClass.booleanType }),
|
||||
EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("createNewIO", new CtClass[] { CtClass.booleanType }), EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("getMetaData", new CtClass[] { CtClass.booleanType, CtClass.booleanType }),
|
||||
EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("handleAutoCommitDefaults", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("setSavepoint", new CtClass[] { ctMysqlSavepoint }), EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("versionMeetsMinimum", new CtClass[] { CtClass.intType, CtClass.intType, CtClass.intType }),
|
||||
EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("rollbackNoChecks", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("setupServerForTruncationChecks", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER);
|
||||
clazz.writeFile(args[0]);
|
||||
|
||||
// com.mysql.cj.jdbc.LoadBalancedMySQLConnection extends MultiHostMySQLConnection implements LoadBalancedConnection
|
||||
clazz = pool.get(LoadBalancedMySQLConnection.class.getName());
|
||||
instrumentJdbcMethods(clazz, LoadBalancedConnection.class, false, EXCEPTION_INTERCEPTOR_GETTER);
|
||||
clazz.writeFile(args[0]);
|
||||
|
||||
// MultiHostMySQLConnection implements JdbcConnection
|
||||
clazz = pool.get(MultiHostMySQLConnection.class.getName());
|
||||
instrumentJdbcMethods(clazz, JdbcConnection.class, false, EXCEPTION_INTERCEPTOR_GETTER);
|
||||
clazz.writeFile(args[0]);
|
||||
|
||||
// com.mysql.cj.jdbc.ReplicationConnection implements JdbcConnection, PingTarget
|
||||
clazz = pool.get(ReplicationMySQLConnection.class.getName());
|
||||
instrumentJdbcMethods(clazz, ReplicationConnection.class, false, EXCEPTION_INTERCEPTOR_GETTER);
|
||||
clazz.writeFile(args[0]);
|
||||
|
||||
// ConnectionWrapper extends WrapperBase implements JdbcConnection
|
||||
clazz = pool.get(ConnectionWrapper.class.getName());
|
||||
instrumentJdbcMethods(clazz, JdbcConnection.class, false, EXCEPTION_INTERCEPTOR_MEMBER);
|
||||
// non-JDBC
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("clientPrepare", new CtClass[] { ctString }), EXCEPTION_INTERCEPTOR_MEMBER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("clientPrepare", new CtClass[] { ctString, CtClass.intType, CtClass.intType }),
|
||||
EXCEPTION_INTERCEPTOR_MEMBER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("setClientInfo", new CtClass[] { ctString, ctString }), EXCEPTION_INTERCEPTOR_MEMBER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("setClientInfo", new CtClass[] { ctProperties }), EXCEPTION_INTERCEPTOR_MEMBER);
|
||||
clazz.writeFile(args[0]);
|
||||
|
||||
/*
|
||||
* java.sql.DatabaseMetaData extends java.sql.Wrapper
|
||||
*/
|
||||
// com.mysql.cj.jdbc.DatabaseMetaData implements java.sql.DatabaseMetaData
|
||||
clazz = pool.get(DatabaseMetaData.class.getName());
|
||||
instrumentJdbcMethods(clazz, java.sql.DatabaseMetaData.class, false, EXCEPTION_INTERCEPTOR_GETTER);
|
||||
clazz.writeFile(args[0]);
|
||||
|
||||
// com.mysql.cj.jdbc.DatabaseMetaDataUsingInfoSchema extends DatabaseMetaData
|
||||
clazz = pool.get(DatabaseMetaDataUsingInfoSchema.class.getName());
|
||||
instrumentJdbcMethods(clazz, java.sql.DatabaseMetaData.class, false, EXCEPTION_INTERCEPTOR_GETTER);
|
||||
clazz.writeFile(args[0]);
|
||||
|
||||
/*
|
||||
* java.sql.Driver
|
||||
*/
|
||||
// com.mysql.cj.jdbc.Driver extends NonRegisteringDriver implements java.sql.Driver
|
||||
clazz = pool.get(NonRegisteringDriver.class.getName());
|
||||
instrumentJdbcMethods(clazz, java.sql.Driver.class);
|
||||
clazz.writeFile(args[0]);
|
||||
|
||||
/*
|
||||
* java.sql.NClob
|
||||
*/
|
||||
// com.mysql.cj.jdbc.NClob extends Clob implements java.sql.NClob
|
||||
clazz = pool.get(NClob.class.getName());
|
||||
instrumentJdbcMethods(clazz, java.sql.NClob.class);
|
||||
clazz.writeFile(args[0]);
|
||||
|
||||
/*
|
||||
* java.sql.ParameterMetaData extends java.sql.Wrapper
|
||||
*/
|
||||
// com.mysql.cj.jdbc.CallableStatement.CallableStatementParamInfo implements ParameterMetaData
|
||||
clazz = pool.get(CallableStatementParamInfo.class.getName());
|
||||
instrumentJdbcMethods(clazz, java.sql.ParameterMetaData.class);
|
||||
clazz.writeFile(args[0]);
|
||||
|
||||
// com.mysql.cj.jdbc.MysqlParameterMetadata implements ParameterMetaData
|
||||
clazz = pool.get(MysqlParameterMetadata.class.getName());
|
||||
instrumentJdbcMethods(clazz, java.sql.ParameterMetaData.class, false, EXCEPTION_INTERCEPTOR_MEMBER);
|
||||
clazz.writeFile(args[0]);
|
||||
|
||||
/*
|
||||
* java.sql.PreparedStatement extends java.sql.Statement (java.sql.Statement extends java.sql.Wrapper)
|
||||
*/
|
||||
// com.mysql.cj.jdbc.PreparedStatement extends com.mysql.cj.jdbc.StatementImpl implements java.sql.PreparedStatement
|
||||
clazz = pool.get(ClientPreparedStatement.class.getName());
|
||||
instrumentJdbcMethods(clazz, java.sql.PreparedStatement.class, false, EXCEPTION_INTERCEPTOR_GETTER);
|
||||
instrumentJdbcMethods(clazz, JdbcStatement.class, true, EXCEPTION_INTERCEPTOR_GETTER);
|
||||
// non-JDBC
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("asSql", new CtClass[] { CtClass.booleanType }), EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("checkBounds", new CtClass[] { CtClass.intType, CtClass.intType }), EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("checkReadOnlySafeStatement", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("executeBatchedInserts", new CtClass[] { CtClass.intType }), EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("executeBatchSerially", new CtClass[] { CtClass.intType }), EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz,
|
||||
clazz.getDeclaredMethod("executeInternal",
|
||||
new CtClass[] { CtClass.intType, ctMessageBody, CtClass.booleanType, CtClass.booleanType, ctColumnDefinition, CtClass.booleanType }),
|
||||
EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("executePreparedBatchAsMultiStatement", new CtClass[] { CtClass.intType }),
|
||||
EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("executeUpdateInternal", new CtClass[] { CtClass.booleanType, CtClass.booleanType }),
|
||||
EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("executeUpdateInternal", new CtClass[] { ctQueryBindings, CtClass.booleanType }),
|
||||
EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("generateMultiStatementForBatch", new CtClass[] { CtClass.intType }),
|
||||
EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("getBytesRepresentation", new CtClass[] { CtClass.intType }), EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("getParameterBindings", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("initializeFromParseInfo", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("isNull", new CtClass[] { CtClass.intType }), EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("isSelectQuery", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("prepareBatchedInsertSQL", new CtClass[] { ctJdbcConnection, CtClass.intType }),
|
||||
EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz,
|
||||
clazz.getDeclaredMethod("setBytes", new CtClass[] { CtClass.intType, ctByteArray, CtClass.booleanType, CtClass.booleanType }),
|
||||
EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("setRetrieveGeneratedKeys", new CtClass[] { CtClass.booleanType }), EXCEPTION_INTERCEPTOR_GETTER);
|
||||
clazz.writeFile(args[0]);
|
||||
|
||||
/*
|
||||
* com.mysql.cj.jdbc.ServerPreparedStatement extends PreparedStatement
|
||||
*/
|
||||
clazz = pool.get(ServerPreparedStatement.class.getName());
|
||||
instrumentJdbcMethods(clazz, java.sql.PreparedStatement.class, false, EXCEPTION_INTERCEPTOR_GETTER);
|
||||
instrumentJdbcMethods(clazz, JdbcStatement.class, true, EXCEPTION_INTERCEPTOR_GETTER);
|
||||
// non-JDBC
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("getBinding", new CtClass[] { CtClass.intType, CtClass.booleanType }),
|
||||
EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz,
|
||||
clazz.getDeclaredMethod("executeInternal",
|
||||
new CtClass[] { CtClass.intType, ctMessageBody, CtClass.booleanType, CtClass.booleanType, ctColumnDefinition, CtClass.booleanType }),
|
||||
EXCEPTION_INTERCEPTOR_GETTER);
|
||||
//catchRuntimeException(clazz, clazz.getDeclaredMethod("canRewriteAsMultiValueInsertAtSqlLevel", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("realClose", new CtClass[] { CtClass.booleanType, CtClass.booleanType }),
|
||||
EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("serverExecute", new CtClass[] { CtClass.intType, CtClass.booleanType, ctColumnDefinition }),
|
||||
EXCEPTION_INTERCEPTOR_GETTER);
|
||||
//catchRuntimeException(clazz, clazz.getDeclaredMethod("serverLongData", new CtClass[] { CtClass.intType, ctServerPreparedQueryBindValue }),
|
||||
// EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("serverPrepare", new CtClass[] { ctString }), EXCEPTION_INTERCEPTOR_GETTER);
|
||||
clazz.writeFile(args[0]);
|
||||
|
||||
/*
|
||||
* java.sql.ResultSet extends java.sql.Wrapper
|
||||
*/
|
||||
// com.mysql.cj.jdbc.ResultSetImpl implements com.mysql.cj.jdbc.ResultSetInternalMethods (extends java.sql.ResultSet)
|
||||
clazz = pool.get(ResultSetImpl.class.getName());
|
||||
instrumentJdbcMethods(clazz, ResultSetInternalMethods.class, false, EXCEPTION_INTERCEPTOR_GETTER);
|
||||
clazz.writeFile(args[0]);
|
||||
|
||||
// com.mysql.cj.jdbc.UpdatableResultSet extends ResultSetImpl
|
||||
clazz = pool.get(UpdatableResultSet.class.getName());
|
||||
instrumentJdbcMethods(clazz, ResultSetInternalMethods.class, false, EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("generateStatements", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER);
|
||||
clazz.writeFile(args[0]);
|
||||
|
||||
/*
|
||||
* java.sql.ResultSetMetaData extends java.sql.Wrapper
|
||||
*/
|
||||
// com.mysql.cj.jdbc.ResultSetMetaData implements java.sql.ResultSetMetaData
|
||||
clazz = pool.get(ResultSetMetaData.class.getName());
|
||||
instrumentJdbcMethods(clazz, java.sql.ResultSetMetaData.class, false, EXCEPTION_INTERCEPTOR_MEMBER);
|
||||
clazz.writeFile(args[0]);
|
||||
|
||||
/*
|
||||
* java.sql.Savepoint
|
||||
*/
|
||||
// com.mysql.cj.jdbc.MysqlSavepoint implements java.sql.Savepoint
|
||||
clazz = pool.get(MysqlSavepoint.class.getName());
|
||||
instrumentJdbcMethods(clazz, Savepoint.class, false, EXCEPTION_INTERCEPTOR_MEMBER);
|
||||
clazz.writeFile(args[0]);
|
||||
|
||||
/*
|
||||
* java.sql.Statement extends java.sql.Wrapper
|
||||
*/
|
||||
// com.mysql.cj.jdbc.StatementImpl implements com.mysql.cj.jdbc.Statement (extends java.sql.Statement)
|
||||
clazz = pool.get(StatementImpl.class.getName());
|
||||
instrumentJdbcMethods(clazz, JdbcStatement.class, false, EXCEPTION_INTERCEPTOR_GETTER);
|
||||
// non-JDBC
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("createResultSetUsingServerFetch", new CtClass[] { ctString }), EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("doPingInstead", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("executeInternal", new CtClass[] { ctString, CtClass.booleanType }), EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz,
|
||||
clazz.getDeclaredMethod("executeBatchUsingMultiQueries", new CtClass[] { CtClass.booleanType, CtClass.intType, CtClass.intType }),
|
||||
EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("executeUpdateInternal", new CtClass[] { ctString, CtClass.booleanType, CtClass.booleanType }),
|
||||
EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("executeSimpleNonQuery", new CtClass[] { ctJdbcConnection, ctString }),
|
||||
EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("generatePingResultSet", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("getBatchedGeneratedKeys", new CtClass[] { CtClass.intType }), EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("getBatchedGeneratedKeys", new CtClass[] { ctStatement }), EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("getGeneratedKeysInternal", new CtClass[] { CtClass.longType }), EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("getLastInsertID", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("getLongUpdateCount", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("getOpenResultSetCount", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("getResultSetInternal", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("processMultiCountsAndKeys", new CtClass[] { ctStatementImpl, CtClass.intType, ctLongArray }),
|
||||
EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("removeOpenResultSet", new CtClass[] { ctResultSetInternalMethods }),
|
||||
EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("resetCancelledState", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("setHoldResultsOpenOverClose", new CtClass[] { CtClass.booleanType }),
|
||||
EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("setResultSetConcurrency", new CtClass[] { CtClass.intType }), EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("useServerFetch", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("checkCancelTimeout", new CtClass[] {}), EXCEPTION_INTERCEPTOR_GETTER);
|
||||
clazz.writeFile(args[0]);
|
||||
|
||||
/*
|
||||
* java.sql.SQLXML
|
||||
*/
|
||||
// com.mysql.cj.jdbc.MysqlSQLXML implements SQLXML
|
||||
clazz = pool.get(MysqlSQLXML.class.getName());
|
||||
instrumentJdbcMethods(clazz, java.sql.SQLXML.class, false, EXCEPTION_INTERCEPTOR_MEMBER);
|
||||
clazz.writeFile(args[0]);
|
||||
|
||||
/*
|
||||
* javax.sql.ConnectionPoolDataSource
|
||||
*/
|
||||
// MysqlConnectionPoolDataSource extends MysqlDataSource implements ConnectionPoolDataSource
|
||||
clazz = pool.get(MysqlConnectionPoolDataSource.class.getName());
|
||||
instrumentJdbcMethods(clazz, javax.sql.ConnectionPoolDataSource.class);
|
||||
clazz.writeFile(args[0]);
|
||||
|
||||
/*
|
||||
* javax.sql.DataSource
|
||||
*/
|
||||
// MysqlDataSource extends JdbcPropertySetImpl implements DataSource, Referenceable, Serializable, JdbcPropertySet
|
||||
clazz = pool.get(MysqlDataSource.class.getName());
|
||||
instrumentJdbcMethods(clazz, javax.sql.DataSource.class);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("getStringRuntimeProperty", new CtClass[] { ctString }), null);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("setStringRuntimeProperty", new CtClass[] { ctString, ctString }), null);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("getBooleanRuntimeProperty", new CtClass[] { ctString }), null);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("setBooleanRuntimeProperty", new CtClass[] { ctString, CtClass.booleanType }), null);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("getIntegerRuntimeProperty", new CtClass[] { ctString }), null);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("setIntegerRuntimeProperty", new CtClass[] { ctString, CtClass.intType }), null);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("getLongRuntimeProperty", new CtClass[] { ctString }), null);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("setLongRuntimeProperty", new CtClass[] { ctString, CtClass.longType }), null);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("getMemorySizeRuntimeProperty", new CtClass[] { ctString }), null);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("setMemorySizeRuntimeProperty", new CtClass[] { ctString, CtClass.intType }), null);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("getEnumRuntimeProperty", new CtClass[] { ctString }), null);
|
||||
catchRuntimeException(clazz, clazz.getDeclaredMethod("setEnumRuntimeProperty", new CtClass[] { ctString, ctString }), null);
|
||||
clazz.writeFile(args[0]);
|
||||
|
||||
/*
|
||||
* javax.sql.PooledConnection
|
||||
*/
|
||||
// com.mysql.cj.jdbc.MysqlPooledConnection
|
||||
clazz = pool.get(MysqlPooledConnection.class.getName());
|
||||
instrumentJdbcMethods(clazz, javax.sql.PooledConnection.class, false, EXCEPTION_INTERCEPTOR_MEMBER);
|
||||
clazz.writeFile(args[0]);
|
||||
|
||||
/*
|
||||
* javax.sql.XAConnection
|
||||
* javax.transaction.xa.XAResource
|
||||
*/
|
||||
// com.mysql.cj.jdbc.MysqlXAConnection extends MysqlPooledConnection implements XAConnection, XAResource
|
||||
clazz = pool.get(MysqlXAConnection.class.getName());
|
||||
instrumentJdbcMethods(clazz, javax.sql.XAConnection.class);
|
||||
clazz.writeFile(args[0]);
|
||||
|
||||
// com.mysql.cj.jdbc.SuspendableXAConnection extends MysqlPooledConnection implements XAConnection, XAResource
|
||||
clazz = pool.get(SuspendableXAConnection.class.getName());
|
||||
instrumentJdbcMethods(clazz, javax.sql.XAConnection.class);
|
||||
clazz.writeFile(args[0]);
|
||||
|
||||
/*
|
||||
* javax.sql.XADataSource
|
||||
*/
|
||||
// com.mysql.cj.jdbc.MysqlXADataSource extends MysqlDataSource implements javax.sql.XADataSource
|
||||
clazz = pool.get(MysqlXADataSource.class.getName());
|
||||
instrumentJdbcMethods(clazz, javax.sql.DataSource.class);
|
||||
instrumentJdbcMethods(clazz, javax.sql.XADataSource.class);
|
||||
clazz.writeFile(args[0]);
|
||||
|
||||
/*
|
||||
* javax.transaction.xa.Xid
|
||||
*/
|
||||
// com.mysql.cj.jdbc.MysqlXid implements Xid
|
||||
clazz = pool.get(MysqlXid.class.getName());
|
||||
instrumentJdbcMethods(clazz, javax.transaction.xa.Xid.class);
|
||||
clazz.writeFile(args[0]);
|
||||
|
||||
/*
|
||||
* TODO:
|
||||
* java.sql.DataTruncation
|
||||
*/
|
||||
// com.mysql.cj.jdbc.exceptions.MysqlDataTruncation extends DataTruncation
|
||||
|
||||
/*
|
||||
* TODO:
|
||||
* java.sql.SQLException
|
||||
*/
|
||||
// com.mysql.cj.jdbc.exceptions.NotUpdatable extends SQLException
|
||||
// com.mysql.cj.jdbc.exceptions.OperationNotSupportedException extends SQLException
|
||||
// com.mysql.cj.jdbc.exceptions.PacketTooBigException extends SQLException
|
||||
|
||||
/*
|
||||
* TODO:
|
||||
* java.sql.SQLNonTransientException
|
||||
*/
|
||||
// com.mysql.cj.jdbc.exceptions.MySQLQueryInterruptedException extends SQLNonTransientException
|
||||
// com.mysql.cj.jdbc.exceptions.MySQLStatementCancelledException extends SQLNonTransientException
|
||||
|
||||
/*
|
||||
* TODO:
|
||||
* java.sql.SQLRecoverableException
|
||||
*/
|
||||
// com.mysql.cj.jdbc.exceptions.CommunicationsException extends SQLRecoverableException implements StreamingNotifiable
|
||||
// ---> com.mysql.cj.jdbc.exceptions.ConnectionFeatureNotAvailableException extends CommunicationsException
|
||||
|
||||
/*
|
||||
* TODO:
|
||||
* java.sql.SQLTransientException
|
||||
* ---> java.sql.SQLTimeoutException
|
||||
*/
|
||||
// com.mysql.cj.jdbc.exceptions.MySQLTimeoutException extends SQLTimeoutException
|
||||
|
||||
/*
|
||||
* TODO:
|
||||
* java.sql.SQLTransientException
|
||||
* ---> java.sql.SQLTransactionRollbackException
|
||||
*/
|
||||
// com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException extends SQLTransactionRollbackException implements DeadlockTimeoutRollbackMarker
|
||||
|
||||
/*
|
||||
* TODO:
|
||||
* com.mysql.cj.jdbc.MysqlXAException extends javax.transaction.xa.XAException
|
||||
*/
|
||||
|
||||
/*
|
||||
* These classes have no implementations in c/J:
|
||||
*
|
||||
* java.sql.Array
|
||||
* java.sql.BatchUpdateException
|
||||
* java.sql.ClientInfoStatus
|
||||
* java.sql.Date
|
||||
* java.sql.DriverManager
|
||||
* java.sql.DriverPropertyInfo
|
||||
* java.sql.PseudoColumnUsage
|
||||
* java.sql.Ref
|
||||
* java.sql.RowId
|
||||
* java.sql.RowIdLifetime
|
||||
* java.sql.SQLClientInfoException
|
||||
* java.sql.SQLData
|
||||
* java.sql.SQLDataException
|
||||
* java.sql.SQLFeatureNotSupportedException
|
||||
* java.sql.SQLInput
|
||||
* java.sql.SQLIntegrityConstraintViolationException
|
||||
* java.sql.SQLInvalidAuthorizationSpecException
|
||||
* java.sql.SQLNonTransientConnectionException
|
||||
* java.sql.SQLOutput
|
||||
* java.sql.SQLPermission
|
||||
* java.sql.SQLSyntaxErrorException
|
||||
* java.sql.SQLTransientConnectionException
|
||||
* java.sql.SQLWarning
|
||||
* java.sql.Struct
|
||||
* java.sql.Time
|
||||
* java.sql.Timestamp
|
||||
* java.sql.Types
|
||||
*
|
||||
* javax.sql.CommonDataSource
|
||||
* javax.sql.ConnectionEvent
|
||||
* javax.sql.ConnectionEventListener
|
||||
* javax.sql.RowSet
|
||||
* javax.sql.RowSetEvent
|
||||
* javax.sql.RowSetInternal
|
||||
* javax.sql.RowSetListener
|
||||
* javax.sql.RowSetMetaData
|
||||
* javax.sql.RowSetReader
|
||||
* javax.sql.RowSetWriter
|
||||
* javax.sql.StatementEvent
|
||||
* javax.sql.StatementEventListener
|
||||
*
|
||||
* javax.sql.rowset.BaseRowSet
|
||||
* javax.sql.rowset.CachedRowSet
|
||||
* javax.sql.rowset.FilteredRowSet
|
||||
* javax.sql.rowset.JdbcRowSet
|
||||
* javax.sql.rowset.Joinable
|
||||
* javax.sql.rowset.JoinRowSet
|
||||
* javax.sql.rowset.Predicate
|
||||
* javax.sql.rowset.RowSetFactory
|
||||
* javax.sql.rowset.RowSetMetaDataImpl
|
||||
* javax.sql.rowset.RowSetProvider
|
||||
* javax.sql.rowset.RowSetWarning
|
||||
* javax.sql.rowset.WebRowSet
|
||||
*
|
||||
* javax.sql.rowset.serial.SerialArray
|
||||
* javax.sql.rowset.serial.SerialBlob
|
||||
* javax.sql.rowset.serial.SerialClob
|
||||
* javax.sql.rowset.serial.SerialDatalink
|
||||
* javax.sql.rowset.serial.SerialException
|
||||
* javax.sql.rowset.serial.SerialJavaObject
|
||||
* javax.sql.rowset.serial.SerialRef
|
||||
* javax.sql.rowset.serial.SerialStruct
|
||||
* javax.sql.rowset.serial.SQLInputImpl
|
||||
* javax.sql.rowset.serial.SQLOutputImpl
|
||||
*
|
||||
* javax.sql.rowset.spi.SyncFactory
|
||||
* javax.sql.rowset.spi.SyncFactoryException
|
||||
* javax.sql.rowset.spi.SyncProvider
|
||||
* javax.sql.rowset.spi.SyncProviderException
|
||||
* javax.sql.rowset.spi.SyncResolver
|
||||
* javax.sql.rowset.spi.TransactionalWriter
|
||||
* javax.sql.rowset.spi.XmlReader
|
||||
* javax.sql.rowset.spi.XmlWriter
|
||||
*/
|
||||
}
|
||||
|
||||
private static void instrumentJdbcMethods(CtClass cjClazz, Class<?> jdbcClass) throws Exception {
|
||||
instrumentJdbcMethods(cjClazz, jdbcClass, false, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Instruments methods of cjClazz defined in jdbcClass.
|
||||
*
|
||||
* @param cjClazz
|
||||
* CtClass to be instrumented.
|
||||
* @param jdbcClass
|
||||
* Class from JDBC specification where methods descriptors to be get.
|
||||
* @param declaredMethodsOnly
|
||||
* true - instrument methods declared in this class, false - also instrument inherited methods
|
||||
* @param exceptionInterceptorStr
|
||||
* exception interceptor reference as a string
|
||||
* @throws Exception
|
||||
* if an error occurs
|
||||
*/
|
||||
private static void instrumentJdbcMethods(CtClass cjClazz, Class<?> jdbcClass, boolean declaredMethodsOnly, String exceptionInterceptorStr)
|
||||
throws Exception {
|
||||
sysOutPrintln("---");
|
||||
sysOutPrintln(cjClazz.getName());
|
||||
|
||||
Method[] methods;
|
||||
if (declaredMethodsOnly) {
|
||||
// instrument methods declared in this class which throws SQLException
|
||||
methods = jdbcClass.getDeclaredMethods();
|
||||
} else {
|
||||
// instrument all methods, declared in this class and it's superclasses, which throws SQLException
|
||||
methods = jdbcClass.getMethods();
|
||||
}
|
||||
|
||||
for (Method method : methods) {
|
||||
CtMethod ctm = null;
|
||||
String prefix = "SKIPPED: ";
|
||||
for (Class<?> exc : method.getExceptionTypes()) {
|
||||
if (exc.equals(SQLException.class)) {
|
||||
prefix = "INSTRUMENTING... ";
|
||||
String jdbcClassName = method.getName();
|
||||
List<CtClass> params = new LinkedList<>();
|
||||
for (Class<?> param : method.getParameterTypes()) {
|
||||
params.add(pool.get(param.getName()));
|
||||
}
|
||||
try {
|
||||
ctm = cjClazz.getDeclaredMethod(jdbcClassName, params.toArray(new CtClass[0]));
|
||||
} catch (NotFoundException ex) {
|
||||
// Just ignoring because the only reason is that the method is implemented in superclass
|
||||
prefix = "NOT FOUND: ";
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
sysOutPrint(prefix);
|
||||
sysOutPrint(method.toGenericString());
|
||||
if (ctm != null) {
|
||||
if (catchRuntimeException(cjClazz, ctm, exceptionInterceptorStr, false)) {
|
||||
sysOutPrint(" ... DONE.");
|
||||
} else {
|
||||
sysOutPrint(" ... ALREADY PROCESSED!!!");
|
||||
}
|
||||
}
|
||||
sysOutPrintln("");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static void catchRuntimeException(CtClass clazz, CtMethod m, String exceptionInterceptorStr) throws Exception {
|
||||
catchRuntimeException(clazz, m, exceptionInterceptorStr, true);
|
||||
}
|
||||
|
||||
private static boolean catchRuntimeException(CtClass clazz, CtMethod m, String exceptionInterceptorStr, boolean log) throws Exception {
|
||||
if (isProcessed(clazz.getClassFile().getName(), m)) {
|
||||
if (log) {
|
||||
sysOutPrintln("ALREADY PROCESSED!!! " + m);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
if (log) {
|
||||
sysOutPrintln(m + ", " + exceptionInterceptorStr);
|
||||
}
|
||||
if (exceptionInterceptorStr == null) {
|
||||
m.addCatch("{throw " + SQLExceptionsMapping.class.getName() + ".translateException(ex);}", runTimeException, "ex");
|
||||
} else {
|
||||
m.addCatch("{throw " + SQLExceptionsMapping.class.getName() + ".translateException(ex, " + exceptionInterceptorStr + ");}", runTimeException, "ex");
|
||||
}
|
||||
processed.get(clazz.getClassFile().getName()).add(m);
|
||||
return true;
|
||||
}
|
||||
|
||||
private static boolean isProcessed(String fileName, CtMethod m) throws Exception {
|
||||
List<CtMethod> methods = processed.get(fileName);
|
||||
if (methods != null) {
|
||||
if (methods.contains(m)) {
|
||||
return true;
|
||||
}
|
||||
} else {
|
||||
processed.put(fileName, new LinkedList<CtMethod>());
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private static void sysOutPrint(String s) {
|
||||
if (verbose) {
|
||||
System.out.print(s);
|
||||
}
|
||||
}
|
||||
|
||||
private static void sysOutPrintln(String s) {
|
||||
if (verbose) {
|
||||
System.out.println(s);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>misc</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.m2e.core.maven2Builder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>org.eclipse.m2e.core.maven2Nature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
||||
+66
@@ -0,0 +1,66 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
Copyright (c) 2019, 2020, Oracle and/or its affiliates.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License, version 2.0, as published by the
|
||||
Free Software Foundation.
|
||||
|
||||
This program is also distributed with certain software (including but not
|
||||
limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
particular file or component or in included license documentation. The
|
||||
authors of MySQL hereby grant you an additional permission to link the
|
||||
program and your derivative works with the separately licensed software that
|
||||
they have included with MySQL.
|
||||
|
||||
Without limiting anything contained in the foregoing, this file, which is
|
||||
part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
version 1.0, a copy of which can be found at
|
||||
http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
|
||||
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, version 2.0,
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along with
|
||||
this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
-->
|
||||
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
|
||||
<Product Id="*" Name="MySQL Connector J" Language="1033" Version="$(var.ProductVersion)" Manufacturer="Oracle Corporation" UpgradeCode="a887f346-5f02-4cf1-bb85-bf34b4c5f248">
|
||||
<Package InstallerVersion="200" Compressed="yes" />
|
||||
<Upgrade Id="574f7b74-d753-4965-995d-2de6a79afd01">
|
||||
<UpgradeVersion OnlyDetect="no"
|
||||
Minimum="6.0.0"
|
||||
IncludeMinimum="yes"
|
||||
Maximum="8.0.12"
|
||||
IncludeMaximum="yes"
|
||||
Property="OLDERVERSIONBEINGUPGRADED_OLD"/>
|
||||
</Upgrade>
|
||||
<Upgrade Id="a887f346-5f02-4cf1-bb85-bf34b4c5f248">
|
||||
<UpgradeVersion OnlyDetect="no"
|
||||
Minimum="8.0.13"
|
||||
IncludeMinimum="yes"
|
||||
Maximum="$(var.ProductVersion)"
|
||||
Property="OLDERVERSIONBEINGUPGRADED"
|
||||
IncludeMaximum="yes" />
|
||||
</Upgrade>
|
||||
<Media Id="1" Cabinet="media1.cab" EmbedCab="yes" />
|
||||
<Directory Id="TARGETDIR" Name="SourceDir">
|
||||
<Directory Id="ProgramFilesFolder">
|
||||
<Directory Id="MySQL" Name="MySQL">
|
||||
<Directory Id="INSTALLLOCATION" Name="MySQL Connector J 8.0">
|
||||
<!-- Components Autogenerated using the WiX tool named Heat. See the Project properties for cmd line. -->
|
||||
</Directory>
|
||||
</Directory>
|
||||
</Directory>
|
||||
</Directory>
|
||||
<Feature Id="ProductFeature" Title="wix_solution" Level="1">
|
||||
<ComponentGroupRef Id="ConnJZipContents"/>
|
||||
</Feature>
|
||||
<InstallExecuteSequence>
|
||||
<RemoveExistingProducts After="InstallInitialize" />
|
||||
</InstallExecuteSequence>
|
||||
</Product>
|
||||
</Wix>
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
@PRODUCT_NAME@@PRODUCT_SUFFIX@ (@MYSQL_CJ_VERSION@@MYSQL_CJ_VERSION_SNAPSHOT@@DEB_VERSION_SUFFIX@@ID_RELEASE@) @CODENAME@; urgency=low
|
||||
|
||||
* For release notes, please refer to https://dev.mysql.com/doc/relnotes/connector-j/8.0/en/
|
||||
|
||||
-- @MAINTAINER_EMAIL@ @PACKAGE_TIMESTAMP@
|
||||
+1
@@ -0,0 +1 @@
|
||||
9
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
Source: @PRODUCT_NAME@@PRODUCT_SUFFIX@
|
||||
Section: database
|
||||
Priority: optional
|
||||
Maintainer: Oracle MySQL Product Engineering Team <mysql-build@oss.oracle.com>
|
||||
Standards-Version: 3.9.2
|
||||
Build-Depends: debhelper (>= 8.9.4)
|
||||
Homepage: http://dev.mysql.com/downloads/connector/j/
|
||||
|
||||
Package: @PRODUCT_NAME@@PRODUCT_SUFFIX@
|
||||
Section: database
|
||||
Architecture: all
|
||||
Depends: ${shlibs:Depends}, ${misc:Depends}
|
||||
Description: MySQL Connector/J
|
||||
Standardized MySQL database driver for Java
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
||||
Upstream-Name: @PRODUCT@
|
||||
Upstream-Contact: MySQL Release Engineering <mysql-build@oss.oracle.com>
|
||||
Source: http://dev.mysql.com/
|
||||
|
||||
Files: *
|
||||
Copyright: 2002, 2021, Oracle and/or its affiliates.
|
||||
License:
|
||||
For licensing information see the LICENSE file in this distribution.
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
dist/toArchive/@PACKAGE_NAME@/@PRODUCT_NAME@@PRODUCT_SUFFIX@-@VERSION_FULL@.jar usr/share/java
|
||||
|
||||
#legal
|
||||
dist/toArchive/@PACKAGE_NAME@/@LIC_FILE@ usr/share/doc/@PRODUCT_NAME@@PRODUCT_SUFFIX@
|
||||
dist/toArchive/@PACKAGE_NAME@/README usr/share/doc/@PRODUCT_NAME@@PRODUCT_SUFFIX@
|
||||
dist/toArchive/@PACKAGE_NAME@/CHANGES usr/share/doc/@PRODUCT_NAME@@PRODUCT_SUFFIX@
|
||||
dist/toArchive/@PACKAGE_NAME@/INFO_SRC usr/share/doc/@PRODUCT_NAME@@PRODUCT_SUFFIX@
|
||||
dist/toArchive/@PACKAGE_NAME@/INFO_BIN usr/share/doc/@PRODUCT_NAME@@PRODUCT_SUFFIX@
|
||||
+77
@@ -0,0 +1,77 @@
|
||||
#!/usr/bin/make -f
|
||||
# Copyright (c) 2016, 2020, Oracle and/or its affiliates.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under
|
||||
# the terms of the GNU General Public License, version 2.0, as published by the
|
||||
# Free Software Foundation.
|
||||
#
|
||||
# This program is also distributed with certain software (including but not
|
||||
# limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
# particular file or component or in included license documentation. The
|
||||
# authors of MySQL hereby grant you an additional permission to link the
|
||||
# program and your derivative works with the separately licensed software that
|
||||
# they have included with MySQL.
|
||||
#
|
||||
# Without limiting anything contained in the foregoing, this file, which is
|
||||
# part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
# version 1.0, a copy of which can be found at
|
||||
# http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
#
|
||||
# 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, version 2.0,
|
||||
# for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along with
|
||||
# this program; if not, write to the Free Software Foundation, Inc.,
|
||||
# 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
upstream_version := $(shell dpkg-parsechangelog | sed -n -e'/^Version: / { s/Version: //; s/-[^-]\+$$//; p }')
|
||||
base_version = $(shell echo $(upstream_version) | sed -e's/r[0-9]\+$$//')
|
||||
|
||||
ANT_COMMON_OPTIONS=\
|
||||
-Dcom.mysql.cj.build.dir.driver=build/driver \
|
||||
-Dcom.mysql.cj.extra.libs=@WITH_JARDEPS@ \
|
||||
-Dcom.mysql.cj.build.driver.version.status=@MYSQL_CJ_VERSION_STATUS@ \
|
||||
-Dcom.mysql.cj.build.driver.version.extra=@MYSQL_CJ_VERSION_EXTRA@ \
|
||||
-Dcom.mysql.cj.build.driver.version.snapshot=@MYSQL_CJ_VERSION_SNAPSHOT@ \
|
||||
-Dcom.mysql.cj.build.driver.extraName=@PRODUCT_SUFFIX@ \
|
||||
-Dcom.mysql.cj.dist.licenseUrl=@MYSQL_CJ_LICENSEURL@ \
|
||||
-Djava.awt.headless=true
|
||||
|
||||
ifeq ($(ANT_HOME),)
|
||||
ANT_CMD=ant
|
||||
else
|
||||
ANT_CMD=$(ANT_HOME)/bin/ant
|
||||
endif
|
||||
|
||||
ANT_OPTS=-Xmx512M
|
||||
|
||||
ifneq ($(JAVA_HOME),)
|
||||
ANT_JAVA_OPT=-Dcom.mysql.cj.build.jdk=$(JAVA_HOME)
|
||||
endif
|
||||
|
||||
ifneq ($(COMMERCIAL),)
|
||||
ANT_COM_OPT=-Dcom.mysql.cj.build.commercial=true
|
||||
endif
|
||||
|
||||
%:
|
||||
#dh $@ --with autoreconf
|
||||
dh $@
|
||||
|
||||
override_dh_auto_configure:
|
||||
|
||||
override_dh_auto_build:
|
||||
echo $(PATH)
|
||||
echo $(JAVA_HOME)
|
||||
$(ANT_CMD) \
|
||||
$(ANT_COMMON_OPTIONS) \
|
||||
$(ANT_JAVA_OPT) \
|
||||
$(ANT_COM_OPT) \
|
||||
full-package-no-sources
|
||||
|
||||
override_dh_auto_clean:
|
||||
$(ANT_CMD) $(ANT_COMMON_OPTIONS) clean
|
||||
|
||||
override_dh_installchangelogs:
|
||||
dh_installchangelogs -XCHANGES
|
||||
+1
@@ -0,0 +1 @@
|
||||
3.0 (quilt)
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
version=3
|
||||
http://mysql.osuosl.org/Downloads/@PRODUCT_NAME@-(.+)\.tar\.gz
|
||||
@@ -0,0 +1,67 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<!--
|
||||
Copyright (c) 2006, 2020, Oracle and/or its affiliates.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License, version 2.0, as published by the
|
||||
Free Software Foundation.
|
||||
|
||||
This program is also distributed with certain software (including but not
|
||||
limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
particular file or component or in included license documentation. The
|
||||
authors of MySQL hereby grant you an additional permission to link the
|
||||
program and your derivative works with the separately licensed software that
|
||||
they have included with MySQL.
|
||||
|
||||
Without limiting anything contained in the foregoing, this file, which is
|
||||
part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
version 1.0, a copy of which can be found at
|
||||
http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
|
||||
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, version 2.0,
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along with
|
||||
this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
-->
|
||||
<project>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>mysql</groupId>
|
||||
<artifactId>mysql-connector-java</artifactId>
|
||||
<version>@MYSQL_CJ_VERSION@</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>MySQL Connector/J</name>
|
||||
<description>JDBC Type 4 driver for MySQL</description>
|
||||
|
||||
<licenses>
|
||||
<license>
|
||||
<name>The GNU General Public License, v2 with FOSS exception</name>
|
||||
<distribution>repo</distribution>
|
||||
<comments>For detailed license information see the LICENSE file in this distribution.</comments>
|
||||
</license>
|
||||
</licenses>
|
||||
|
||||
<url>http://dev.mysql.com/doc/connector-j/en/</url>
|
||||
|
||||
<scm>
|
||||
<connection>scm:git:git@github.com:mysql/mysql-connector-j.git</connection>
|
||||
<url>https://github.com/mysql/mysql-connector-j</url>
|
||||
</scm>
|
||||
|
||||
<organization>
|
||||
<name>Oracle Corporation</name>
|
||||
<url>http://www.oracle.com</url>
|
||||
</organization>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.google.protobuf</groupId>
|
||||
<artifactId>protobuf-java</artifactId>
|
||||
<version>3.11.4</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
+197
@@ -0,0 +1,197 @@
|
||||
# Copyright (c) 2017, 2020, Oracle and/or its affiliates.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it under
|
||||
# the terms of the GNU General Public License, version 2.0, as published by the
|
||||
# Free Software Foundation.
|
||||
#
|
||||
# This program is also distributed with certain software (including but not
|
||||
# limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
# particular file or component or in included license documentation. The
|
||||
# authors of MySQL hereby grant you an additional permission to link the
|
||||
# program and your derivative works with the separately licensed software that
|
||||
# they have included with MySQL.
|
||||
#
|
||||
# Without limiting anything contained in the foregoing, this file, which is
|
||||
# part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
# version 1.0, a copy of which can be found at
|
||||
# http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
#
|
||||
# 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, version 2.0,
|
||||
# for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along with
|
||||
# this program; if not, write to the Free Software Foundation, Inc.,
|
||||
# 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
# You can pass these options to "rpmbuild"
|
||||
#
|
||||
# --define="commercial <nonempty>"
|
||||
# --define="with_ant <path>"
|
||||
# --define="with_java <path>"
|
||||
# --define="with_jardeps <path>"
|
||||
# --define="with_docs <path>"
|
||||
#
|
||||
# The 'with_docs' option should have a path that points out
|
||||
#
|
||||
# <docs-base>/en/html/connector-j.html
|
||||
# <docs-base>/en/html/mvl.css (not really used)
|
||||
# <docs-base>/en/pdf/connector-j.pdf
|
||||
# <docs-base>/en/txt/connector-j.txt
|
||||
|
||||
# Some linux distributions doesn't set the "dist" macro. There is a
|
||||
# list how to identify dists here
|
||||
# https://en.opensuse.org/openSUSE:Build_Service_cross_distribution_howto
|
||||
|
||||
# SuSE will not set "dist", others do
|
||||
%if 0%{?suse_version} == 1315
|
||||
%global dist .sles12
|
||||
%global sles12 1
|
||||
%endif
|
||||
|
||||
%if 0%{?suse_version} == 1500
|
||||
%global dist .sl15
|
||||
%global sles15 1
|
||||
%endif
|
||||
|
||||
%if 0%{?commercial:1}
|
||||
%global lic_tag Commercial
|
||||
%else
|
||||
%global lic_tag GPLv2
|
||||
%endif
|
||||
|
||||
Summary: Standardized MySQL database driver for Java
|
||||
Name: @MYSQL_CJ_EXTENDED_PROD_NAME@
|
||||
Version: @MYSQL_CJ_VERSION_NUMERIC@
|
||||
Release: @MYSQL_CJ_RPM_RELEASE_FULL@%{?dist}
|
||||
Epoch: 1
|
||||
License: %{lic_tag}
|
||||
Group: Development/Libraries
|
||||
URL: http://dev.mysql.com/downloads/connector/j/
|
||||
Source0: https://cdn.mysql.com/Downloads/Connector-J/@MYSQL_CJ_FULL_PROD_NAME@.tar.gz
|
||||
|
||||
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
||||
BuildArch: noarch
|
||||
|
||||
%if 0%{?commercial:1}
|
||||
Obsoletes: mysql-connector-java < %{version}-%{release}
|
||||
Provides: mysql-connector-java = %{version}-%{release}
|
||||
%endif
|
||||
|
||||
%if 0%{!?with_ant:1}
|
||||
BuildRequires: ant
|
||||
%endif
|
||||
|
||||
%if 0%{!?with_java:1}
|
||||
BuildRequires: java-devel >= 1:1.8.0
|
||||
%endif
|
||||
|
||||
%if 0%{?sles12:1} || 0%{?sles15:1}
|
||||
Requires: java-headless >= 1.8.0
|
||||
%else
|
||||
Requires: java-headless >= 1:1.8.0
|
||||
%endif
|
||||
|
||||
%description
|
||||
MySQL provides connectivity for client applications developed in the
|
||||
Java programming language with @MYSQL_CJ_DISPLAY_PROD_NAME@, a driver that
|
||||
implements the [Java Database Connectivity (JDBC) API]
|
||||
(http://www.oracle.com/technetwork/java/javase/jdbc/).
|
||||
|
||||
@MYSQL_CJ_DISPLAY_PROD_NAME@ @MYSQL_CJ_VERSION_SERIES@ is a JDBC Type 4 driver that is compatible with
|
||||
the [JDBC 4.2](http://docs.oracle.com/javase/8/docs/technotes/guides/jdbc/)
|
||||
specification. The Type 4 designation means that the driver is a pure
|
||||
Java implementation of the MySQL protocol and does not rely on the
|
||||
MySQL client libraries.
|
||||
|
||||
For detailed information please visit the official
|
||||
[@MYSQL_CJ_DISPLAY_PROD_NAME@ documentation]
|
||||
(http://dev.mysql.com/doc/connector-j/en/).
|
||||
|
||||
%prep
|
||||
%setup -q -n @MYSQL_CJ_FULL_PROD_NAME@
|
||||
|
||||
%build
|
||||
COMMON_OPTIONS="\
|
||||
-Dcom.mysql.cj.build.dir.driver=build/driver
|
||||
-Dcom.mysql.cj.extra.libs=%{with_jardeps} \
|
||||
-Dcom.mysql.cj.build.driver.version.status=@MYSQL_CJ_VERSION_STATUS@ \
|
||||
-Dcom.mysql.cj.build.driver.version.extra=@MYSQL_CJ_VERSION_EXTRA@ \
|
||||
-Dcom.mysql.cj.build.driver.version.snapshot=@MYSQL_CJ_VERSION_SNAPSHOT@ \
|
||||
-Dcom.mysql.cj.build.driver.extraName=@MYSQL_CJ_EXTRA_NAME@ \
|
||||
-Dcom.mysql.cj.dist.licenseUrl=@MYSQL_CJ_LICENSEURL@ \
|
||||
-Djava.awt.headless=true"
|
||||
|
||||
%if 0%{?with_ant:1}
|
||||
export ANT_HOME=%{with_ant}
|
||||
export ANT_CMD="${ANT_HOME}/bin/ant"
|
||||
%else
|
||||
export ANT_CMD="ant"
|
||||
%endif
|
||||
|
||||
export ANT_OPTS=-Xmx512M
|
||||
|
||||
%if 0%{?with_java:1}
|
||||
export JAVA_HOME=%{with_java}
|
||||
export PATH=${JAVA_HOME}/bin:$PATH
|
||||
COMMON_OPTIONS="${COMMON_OPTIONS} -Dcom.mysql.cj.build.jdk=${JAVA_HOME}"
|
||||
%endif
|
||||
|
||||
%if 0%{?commercial:1}
|
||||
COMMON_OPTIONS="${COMMON_OPTIONS} -Dcom.mysql.cj.build.commercial=true"
|
||||
%endif
|
||||
|
||||
# Get the file revision-info.properties again because it was excluded
|
||||
# from SOURCES
|
||||
cp %{_tmppath}/@MYSQL_CJ_FULL_PROD_NAME@/revision-info.properties .
|
||||
|
||||
${ANT_CMD} \
|
||||
${COMMON_OPTIONS} \
|
||||
full-package-no-sources
|
||||
|
||||
# We use the 'full-package-no-sources' as there are changes done only
|
||||
# when creating a package, 'dist' is not enough. To make it a bit easier
|
||||
# in the install step, we rename the directory with the content
|
||||
mv dist/toArchive/@PACKAGE_NAME@ package-content
|
||||
|
||||
# The 'package' target doesn't copy the HTML or PDF doc like 'dist',
|
||||
# we copy it here
|
||||
%if 0%{?with_docs:1}
|
||||
mkdir -p package-content/docs
|
||||
cp %{with_docs}/en/html/connector-j.html package-content/docs/
|
||||
cp %{with_docs}/en/html/mvl.css package-content/docs/
|
||||
cp %{with_docs}/en/pdf/connector-j.pdf package-content/docs/
|
||||
cp %{with_docs}/en/txt/connector-j.txt package-content/docs/
|
||||
%endif
|
||||
|
||||
%install
|
||||
install -d -m 0755 %{buildroot}%{_javadir}
|
||||
install -p -m 0644 package-content/@MYSQL_CJ_FULL_PROD_NAME@.jar %{buildroot}%{_javadir}/%{name}.jar
|
||||
|
||||
%clean
|
||||
rm -rf %{buildroot}
|
||||
|
||||
%files
|
||||
%doc package-content/CHANGES
|
||||
# EL6 doesn't like 'license' macro here, so we use 'doc'
|
||||
%doc package-content/LICENSE
|
||||
%doc package-content/README
|
||||
%doc package-content/INFO_BIN
|
||||
%doc package-content/INFO_SRC
|
||||
|
||||
%if 0%{?with_docs:1}
|
||||
# README.txt is a rename of "connector-j.txt"
|
||||
%doc package-content/docs/connector-j.txt
|
||||
%doc package-content/docs/connector-j.pdf
|
||||
%doc package-content/docs/connector-j.html
|
||||
%doc package-content/docs/mvl.css
|
||||
%endif
|
||||
|
||||
%{_javadir}/%{name}.jar
|
||||
|
||||
%changelog
|
||||
* Mon Nov 27 2017 MySQL Release Engineering <mysql-build@oss.oracle.com> - 8.0.9-1
|
||||
- Set more in "build.xml"
|
||||
* Tue Mar 14 2017 MySQL Release Engineering <mysql-build@oss.oracle.com> - 6.0.7-1
|
||||
- initial package
|
||||
+84
@@ -0,0 +1,84 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 2020, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package demo.x.devapi;
|
||||
|
||||
import com.mysql.cj.xdevapi.Collection;
|
||||
import com.mysql.cj.xdevapi.DbDoc;
|
||||
import com.mysql.cj.xdevapi.DbDocImpl;
|
||||
import com.mysql.cj.xdevapi.DocResult;
|
||||
import com.mysql.cj.xdevapi.JsonNumber;
|
||||
import com.mysql.cj.xdevapi.JsonString;
|
||||
import com.mysql.cj.xdevapi.Schema;
|
||||
import com.mysql.cj.xdevapi.Session;
|
||||
import com.mysql.cj.xdevapi.SessionFactory;
|
||||
|
||||
/*
|
||||
* Sample program showing how to use Connector/J's Dev API support.
|
||||
*/
|
||||
public class DevApiSample {
|
||||
public static void main(String[] args) {
|
||||
Session session = new SessionFactory().getSession("mysqlx://localhost:33060/test?user=user&password=password1234");
|
||||
System.err.println("Connected!");
|
||||
Schema schema = session.getDefaultSchema();
|
||||
System.err.println("Default schema is: " + schema);
|
||||
|
||||
documentWalkthrough(schema);
|
||||
}
|
||||
|
||||
public static void documentWalkthrough(Schema schema) {
|
||||
// document walthrough
|
||||
Collection coll = schema.createCollection("myBooks", /* reuseExisting? */ true);
|
||||
DbDoc newDoc = new DbDocImpl().add("isbn", new JsonString().setValue("12345"));
|
||||
newDoc.add("title", new JsonString().setValue("Effi Briest"));
|
||||
newDoc.add("author", new JsonString().setValue("Theodor Fontane"));
|
||||
newDoc.add("currentlyReadingPage", new JsonNumber().setValue(String.valueOf(42)));
|
||||
coll.add(newDoc).execute();
|
||||
|
||||
// note: "$" prefix for document paths is optional. "$.title.somethingElse[0]" is the same as "title.somethingElse[0]" in document expressions
|
||||
DocResult docs = coll.find("$.title = 'Effi Briest' and $.currentlyReadingPage > 10").execute();
|
||||
DbDoc book = docs.next();
|
||||
System.err.println("Currently reading " + ((JsonString) book.get("title")).getString() + " on page "
|
||||
+ ((JsonNumber) book.get("currentlyReadingPage")).getInteger());
|
||||
|
||||
// increment the page number and fetch it again
|
||||
coll.modify("$.isbn = 12345").set("$.currentlyReadingPage", ((JsonNumber) book.get("currentlyReadingPage")).getInteger() + 1).execute();
|
||||
|
||||
docs = coll.find("$.title = 'Effi Briest' and $.currentlyReadingPage > 10").execute();
|
||||
book = docs.next();
|
||||
System.err.println("Currently reading " + ((JsonString) book.get("title")).getString() + " on page "
|
||||
+ ((JsonNumber) book.get("currentlyReadingPage")).getInteger());
|
||||
|
||||
// remove the doc
|
||||
coll.remove("true").execute();
|
||||
System.err.println("Number of books in collection: " + coll.count());
|
||||
|
||||
schema.dropCollection(coll.getName());
|
||||
}
|
||||
}
|
||||
+3417
File diff suppressed because it is too large
Load Diff
+4175
File diff suppressed because it is too large
Load Diff
+26227
File diff suppressed because it is too large
Load Diff
+3274
File diff suppressed because it is too large
Load Diff
+6854
File diff suppressed because it is too large
Load Diff
+2568
File diff suppressed because it is too large
Load Diff
+11117
File diff suppressed because it is too large
Load Diff
+5885
File diff suppressed because it is too large
Load Diff
+4575
File diff suppressed because it is too large
Load Diff
+5600
File diff suppressed because it is too large
Load Diff
+3212
File diff suppressed because it is too large
Load Diff
+1972
File diff suppressed because it is too large
Load Diff
+40
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 2020, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
/**
|
||||
* Message classes used for serialization with Google Protocol Buffers to support the X Protocol. Classes are generated using <i>protoc</i> like so:
|
||||
*
|
||||
* <pre>
|
||||
* protoc --java_out=PATH/src/generated/java --proto_path=PATH_TO_IMPORTS -I=PATH_TO_MYSQL_REPO/rapid/plugin/x/protocol PATH_TO_MYSQL_REPO/rapid/plugin/x/protocol/*.proto
|
||||
* </pre>
|
||||
*
|
||||
* @since 6.0
|
||||
*/
|
||||
|
||||
package com.mysql.cj.x.protobuf;
|
||||
+46
@@ -0,0 +1,46 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 2020, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package com.mysql.jdbc;
|
||||
|
||||
import java.sql.SQLException;
|
||||
|
||||
/**
|
||||
* Backwards compatibility to support apps that call <code>Class.forName("com.mysql.jdbc.Driver");</code>.
|
||||
*/
|
||||
public class Driver extends com.mysql.cj.jdbc.Driver {
|
||||
public Driver() throws SQLException {
|
||||
super();
|
||||
}
|
||||
|
||||
static {
|
||||
System.err.println("Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. "
|
||||
+ "The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.");
|
||||
}
|
||||
}
|
||||
+98
@@ -0,0 +1,98 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2020, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package com.mysql.jdbc;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.Socket;
|
||||
import java.net.SocketException;
|
||||
import java.util.Properties;
|
||||
|
||||
/**
|
||||
* Interface to allow pluggable socket creation in the driver
|
||||
*
|
||||
* @deprecated Use {@link com.mysql.cj.protocol.SocketFactory} instead.
|
||||
*/
|
||||
@Deprecated
|
||||
public interface SocketFactory {
|
||||
|
||||
/**
|
||||
* Called by the driver after issuing the MySQL protocol handshake and
|
||||
* reading the results of the handshake.
|
||||
*
|
||||
* @throws SocketException
|
||||
* if a socket error occurs
|
||||
* @throws IOException
|
||||
* if an I/O error occurs
|
||||
*
|
||||
* @return the socket to use after the handshake
|
||||
*/
|
||||
Socket afterHandshake() throws SocketException, IOException;
|
||||
|
||||
/**
|
||||
* Called by the driver before issuing the MySQL protocol handshake. Should
|
||||
* return the socket instance that should be used during the handshake.
|
||||
*
|
||||
* @throws SocketException
|
||||
* if a socket error occurs
|
||||
* @throws IOException
|
||||
* if an I/O error occurs
|
||||
*
|
||||
* @return the socket to use before the handshake
|
||||
*/
|
||||
Socket beforeHandshake() throws SocketException, IOException;
|
||||
|
||||
/**
|
||||
* Creates a new socket using the given properties. Properties are parsed by
|
||||
* the driver from the URL. All properties other than sensitive ones (user
|
||||
* and password) are passed to this method. The driver will instantiate the
|
||||
* socket factory with the class name given in the property
|
||||
* "socketFactory", where the standard is <code>com.mysql.jdbc.StandardSocketFactory</code> Implementing classes
|
||||
* are responsible for handling synchronization of this method (if needed).
|
||||
*
|
||||
* @param host
|
||||
* the hostname passed in the JDBC URL. It will be a single
|
||||
* hostname, as the driver parses multi-hosts (for failover) and
|
||||
* calls this method for each host connection attempt.
|
||||
*
|
||||
* @param portNumber
|
||||
* the port number to connect to (if required).
|
||||
*
|
||||
* @param props
|
||||
* properties passed to the driver via the URL and/or properties
|
||||
* instance.
|
||||
*
|
||||
* @return a socket connected to the given host
|
||||
* @throws SocketException
|
||||
* if a socket error occurs
|
||||
* @throws IOException
|
||||
* if an I/O error occurs
|
||||
*/
|
||||
Socket connect(String host, int portNumber, Properties props) throws SocketException, IOException;
|
||||
}
|
||||
+79
@@ -0,0 +1,79 @@
|
||||
/*
|
||||
* Copyright (c) 2018, 2021, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package com.mysql.jdbc;
|
||||
|
||||
import java.io.Closeable;
|
||||
import java.io.IOException;
|
||||
|
||||
import com.mysql.cj.conf.PropertySet;
|
||||
import com.mysql.cj.log.Log;
|
||||
import com.mysql.cj.protocol.ServerSession;
|
||||
import com.mysql.cj.protocol.SocketConnection;
|
||||
import com.mysql.cj.protocol.SocketFactory;
|
||||
import com.mysql.cj.protocol.StandardSocketFactory;
|
||||
|
||||
/**
|
||||
* Wraps the legacy com.mysql.jdbc.SocketFactory implementations so they can be used as {@link SocketFactory}
|
||||
*/
|
||||
public class SocketFactoryWrapper extends StandardSocketFactory implements SocketFactory {
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
com.mysql.jdbc.SocketFactory socketFactory;
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
public SocketFactoryWrapper(Object legacyFactory) {
|
||||
this.socketFactory = (com.mysql.jdbc.SocketFactory) legacyFactory;
|
||||
}
|
||||
|
||||
@SuppressWarnings({ "deprecation", "unchecked" })
|
||||
@Override
|
||||
public <T extends Closeable> T connect(String hostname, int portNumber, PropertySet pset, int loginTimeout) throws IOException {
|
||||
this.rawSocket = this.socketFactory.connect(hostname, portNumber, pset.exposeAsProperties());
|
||||
return (T) this.rawSocket;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public <T extends Closeable> T performTlsHandshake(SocketConnection socketConnection, ServerSession serverSession, Log log) throws IOException {
|
||||
return (T) super.performTlsHandshake(socketConnection, serverSession, log);
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
@Override
|
||||
public void beforeHandshake() throws IOException {
|
||||
this.socketFactory.beforeHandshake();
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
@Override
|
||||
public void afterHandshake() throws IOException {
|
||||
this.socketFactory.afterHandshake();
|
||||
}
|
||||
}
|
||||
+88
@@ -0,0 +1,88 @@
|
||||
/*
|
||||
* Copyright (c) 2017, 2020, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package com.mysql.cj;
|
||||
|
||||
import java.util.LinkedList;
|
||||
|
||||
import com.mysql.cj.util.StringUtils;
|
||||
|
||||
public class AppendingBatchVisitor implements BatchVisitor {
|
||||
LinkedList<byte[]> statementComponents = new LinkedList<>();
|
||||
|
||||
public BatchVisitor append(byte[] values) {
|
||||
this.statementComponents.addLast(values);
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
public BatchVisitor increment() {
|
||||
// no-op
|
||||
return this;
|
||||
}
|
||||
|
||||
public BatchVisitor decrement() {
|
||||
this.statementComponents.removeLast();
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
public BatchVisitor merge(byte[] front, byte[] back) {
|
||||
int mergedLength = front.length + back.length;
|
||||
byte[] merged = new byte[mergedLength];
|
||||
System.arraycopy(front, 0, merged, 0, front.length);
|
||||
System.arraycopy(back, 0, merged, front.length, back.length);
|
||||
this.statementComponents.addLast(merged);
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public BatchVisitor mergeWithLast(byte[] values) {
|
||||
if (this.statementComponents.isEmpty()) {
|
||||
return append(values);
|
||||
}
|
||||
return merge(this.statementComponents.removeLast(), values);
|
||||
}
|
||||
|
||||
public byte[][] getStaticSqlStrings() {
|
||||
byte[][] asBytes = new byte[this.statementComponents.size()][];
|
||||
this.statementComponents.toArray(asBytes);
|
||||
|
||||
return asBytes;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (byte[] comp : this.statementComponents) {
|
||||
sb.append(StringUtils.toString(comp));
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
+43
@@ -0,0 +1,43 @@
|
||||
/*
|
||||
* Copyright (c) 2017, 2020, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package com.mysql.cj;
|
||||
|
||||
public interface BatchVisitor {
|
||||
|
||||
BatchVisitor increment();
|
||||
|
||||
BatchVisitor decrement();
|
||||
|
||||
BatchVisitor append(byte[] values);
|
||||
|
||||
BatchVisitor merge(byte[] begin, byte[] end);
|
||||
|
||||
BatchVisitor mergeWithLast(byte[] values);
|
||||
}
|
||||
+67
@@ -0,0 +1,67 @@
|
||||
/*
|
||||
* Copyright (c) 2017, 2020, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package com.mysql.cj;
|
||||
|
||||
import java.io.InputStream;
|
||||
|
||||
public interface BindValue {
|
||||
|
||||
BindValue clone();
|
||||
|
||||
void reset();
|
||||
|
||||
boolean isNull();
|
||||
|
||||
void setNull(boolean isNull);
|
||||
|
||||
boolean isStream();
|
||||
|
||||
void setIsStream(boolean isStream);
|
||||
|
||||
MysqlType getMysqlType();
|
||||
|
||||
void setMysqlType(MysqlType type);
|
||||
|
||||
byte[] getByteValue();
|
||||
|
||||
void setByteValue(byte[] parameterValue);
|
||||
|
||||
void setOrigByteValue(byte[] origParamValue);
|
||||
|
||||
byte[] getOrigByteValue();
|
||||
|
||||
InputStream getStreamValue();
|
||||
|
||||
void setStreamValue(InputStream parameterStream, long streamLength);
|
||||
|
||||
long getStreamLength();
|
||||
|
||||
boolean isSet();
|
||||
}
|
||||
+44
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
* Copyright (c) 2012, 2020, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package com.mysql.cj;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
public interface CacheAdapter<K, V> {
|
||||
V get(K key);
|
||||
|
||||
void put(K key, V value);
|
||||
|
||||
void invalidate(K key);
|
||||
|
||||
void invalidateAll(Set<K> keys);
|
||||
|
||||
void invalidateAll();
|
||||
}
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
/*
|
||||
* Copyright (c) 2012, 2020, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package com.mysql.cj;
|
||||
|
||||
public interface CacheAdapterFactory<K, V> {
|
||||
|
||||
CacheAdapter<K, V> getInstance(Object syncMutex, String url, int cacheMaxSize, int maxKeySize);
|
||||
|
||||
}
|
||||
+44
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
* Copyright (c) 2018, 2020, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package com.mysql.cj;
|
||||
|
||||
public interface CancelQueryTask {
|
||||
|
||||
boolean cancel();
|
||||
|
||||
Throwable getCaughtWhileCancelling();
|
||||
|
||||
void setCaughtWhileCancelling(Throwable caughtWhileCancelling);
|
||||
|
||||
Query getQueryToCancel();
|
||||
|
||||
void setQueryToCancel(Query queryToCancel);
|
||||
|
||||
}
|
||||
+767
@@ -0,0 +1,767 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2021, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package com.mysql.cj;
|
||||
|
||||
import java.nio.charset.Charset;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.TreeMap;
|
||||
|
||||
/**
|
||||
* Mapping between MySQL charset names and Java charset names. I've investigated placing these in a .properties file, but unfortunately under most appservers
|
||||
* this complicates configuration because the security policy needs to be changed by the user to allow the driver to read them :(
|
||||
*/
|
||||
public class CharsetMapping {
|
||||
|
||||
public static final int MAP_SIZE = 1024; // Size of static maps
|
||||
private static final String[] COLLATION_INDEX_TO_COLLATION_NAME;
|
||||
private static final Map<Integer, MysqlCharset> COLLATION_INDEX_TO_CHARSET;
|
||||
|
||||
private static final Map<String, MysqlCharset> CHARSET_NAME_TO_CHARSET;
|
||||
private static final Map<String, Integer> CHARSET_NAME_TO_COLLATION_INDEX;
|
||||
private static final Map<String, Integer> COLLATION_NAME_TO_COLLATION_INDEX;
|
||||
|
||||
private static final Map<String, List<MysqlCharset>> JAVA_ENCODING_UC_TO_MYSQL_CHARSET;
|
||||
|
||||
private static final Set<String> MULTIBYTE_ENCODINGS;
|
||||
|
||||
/**
|
||||
* Indexes of collations using ucs2, utf16, utf16le or utf32 character sets and that cannot be set to character_set_client system variable.
|
||||
*/
|
||||
private static final Set<Integer> IMPERMISSIBLE_INDEXES;
|
||||
|
||||
public static final String MYSQL_CHARSET_NAME_armscii8 = "armscii8";
|
||||
public static final String MYSQL_CHARSET_NAME_ascii = "ascii";
|
||||
public static final String MYSQL_CHARSET_NAME_big5 = "big5";
|
||||
public static final String MYSQL_CHARSET_NAME_binary = "binary";
|
||||
public static final String MYSQL_CHARSET_NAME_cp1250 = "cp1250";
|
||||
public static final String MYSQL_CHARSET_NAME_cp1251 = "cp1251";
|
||||
public static final String MYSQL_CHARSET_NAME_cp1256 = "cp1256";
|
||||
public static final String MYSQL_CHARSET_NAME_cp1257 = "cp1257";
|
||||
public static final String MYSQL_CHARSET_NAME_cp850 = "cp850";
|
||||
public static final String MYSQL_CHARSET_NAME_cp852 = "cp852";
|
||||
public static final String MYSQL_CHARSET_NAME_cp866 = "cp866";
|
||||
public static final String MYSQL_CHARSET_NAME_cp932 = "cp932";
|
||||
public static final String MYSQL_CHARSET_NAME_dec8 = "dec8";
|
||||
public static final String MYSQL_CHARSET_NAME_eucjpms = "eucjpms";
|
||||
public static final String MYSQL_CHARSET_NAME_euckr = "euckr";
|
||||
public static final String MYSQL_CHARSET_NAME_gb18030 = "gb18030";
|
||||
public static final String MYSQL_CHARSET_NAME_gb2312 = "gb2312";
|
||||
public static final String MYSQL_CHARSET_NAME_gbk = "gbk";
|
||||
public static final String MYSQL_CHARSET_NAME_geostd8 = "geostd8";
|
||||
public static final String MYSQL_CHARSET_NAME_greek = "greek";
|
||||
public static final String MYSQL_CHARSET_NAME_hebrew = "hebrew";
|
||||
public static final String MYSQL_CHARSET_NAME_hp8 = "hp8";
|
||||
public static final String MYSQL_CHARSET_NAME_keybcs2 = "keybcs2";
|
||||
public static final String MYSQL_CHARSET_NAME_koi8r = "koi8r";
|
||||
public static final String MYSQL_CHARSET_NAME_koi8u = "koi8u";
|
||||
public static final String MYSQL_CHARSET_NAME_latin1 = "latin1";
|
||||
public static final String MYSQL_CHARSET_NAME_latin2 = "latin2";
|
||||
public static final String MYSQL_CHARSET_NAME_latin5 = "latin5";
|
||||
public static final String MYSQL_CHARSET_NAME_latin7 = "latin7";
|
||||
public static final String MYSQL_CHARSET_NAME_macce = "macce";
|
||||
public static final String MYSQL_CHARSET_NAME_macroman = "macroman";
|
||||
public static final String MYSQL_CHARSET_NAME_sjis = "sjis";
|
||||
public static final String MYSQL_CHARSET_NAME_swe7 = "swe7";
|
||||
public static final String MYSQL_CHARSET_NAME_tis620 = "tis620";
|
||||
public static final String MYSQL_CHARSET_NAME_ucs2 = "ucs2";
|
||||
public static final String MYSQL_CHARSET_NAME_ujis = "ujis";
|
||||
public static final String MYSQL_CHARSET_NAME_utf16 = "utf16";
|
||||
public static final String MYSQL_CHARSET_NAME_utf16le = "utf16le";
|
||||
public static final String MYSQL_CHARSET_NAME_utf32 = "utf32";
|
||||
public static final String MYSQL_CHARSET_NAME_utf8 = "utf8";
|
||||
public static final String MYSQL_CHARSET_NAME_utf8mb4 = "utf8mb4";
|
||||
|
||||
public static final int MYSQL_COLLATION_INDEX_utf8mb4_general_ci = 45;
|
||||
public static final int MYSQL_COLLATION_INDEX_utf8mb4_0900_ai_ci = 255;
|
||||
public static final int MYSQL_COLLATION_INDEX_binary = 63;
|
||||
|
||||
static {
|
||||
// complete list of mysql character sets and their corresponding java encoding names
|
||||
MysqlCharset[] charset = new MysqlCharset[] { new MysqlCharset(MYSQL_CHARSET_NAME_ascii, 1, 0, new String[] { "US-ASCII", "ASCII" }),
|
||||
|
||||
new MysqlCharset(MYSQL_CHARSET_NAME_big5, 2, 0, new String[] { "Big5" }),
|
||||
new MysqlCharset(MYSQL_CHARSET_NAME_gbk, 2, 0, new String[] { "GBK" }),
|
||||
|
||||
new MysqlCharset(MYSQL_CHARSET_NAME_sjis, 2, 0, new String[] { "SHIFT_JIS", "Cp943", "WINDOWS-31J" }), // SJIS is alias for SHIFT_JIS, Cp943 is rather a cp932 but we map it to sjis for years
|
||||
new MysqlCharset(MYSQL_CHARSET_NAME_cp932, 2, 1, new String[] { "WINDOWS-31J" }),
|
||||
|
||||
new MysqlCharset(MYSQL_CHARSET_NAME_gb2312, 2, 0, new String[] { "GB2312" }),
|
||||
new MysqlCharset(MYSQL_CHARSET_NAME_ujis, 3, 0, new String[] { "EUC_JP" }),
|
||||
new MysqlCharset(MYSQL_CHARSET_NAME_eucjpms, 3, 0, new String[] { "EUC_JP_Solaris" }, new ServerVersion(5, 0, 3)),
|
||||
|
||||
new MysqlCharset(MYSQL_CHARSET_NAME_gb18030, 4, 0, new String[] { "GB18030" }, new ServerVersion(5, 7, 4)),
|
||||
|
||||
new MysqlCharset(MYSQL_CHARSET_NAME_euckr, 2, 0, new String[] { "EUC-KR" }),
|
||||
|
||||
new MysqlCharset(MYSQL_CHARSET_NAME_latin1, 1, 1, new String[] { "Cp1252", "ISO8859_1" }),
|
||||
new MysqlCharset(MYSQL_CHARSET_NAME_swe7, 1, 0, new String[] { "Cp1252" }),
|
||||
new MysqlCharset(MYSQL_CHARSET_NAME_hp8, 1, 0, new String[] { "Cp1252" }),
|
||||
new MysqlCharset(MYSQL_CHARSET_NAME_dec8, 1, 0, new String[] { "Cp1252" }),
|
||||
new MysqlCharset(MYSQL_CHARSET_NAME_armscii8, 1, 0, new String[] { "Cp1252" }),
|
||||
new MysqlCharset(MYSQL_CHARSET_NAME_geostd8, 1, 0, new String[] { "Cp1252" }),
|
||||
|
||||
new MysqlCharset(MYSQL_CHARSET_NAME_latin2, 1, 0, new String[] { "ISO8859_2" }),
|
||||
new MysqlCharset(MYSQL_CHARSET_NAME_greek, 1, 0, new String[] { "ISO8859_7", "greek" }),
|
||||
new MysqlCharset(MYSQL_CHARSET_NAME_latin7, 1, 0, new String[] { "ISO-8859-13" }),
|
||||
new MysqlCharset(MYSQL_CHARSET_NAME_hebrew, 1, 0, new String[] { "ISO8859_8" }),
|
||||
new MysqlCharset(MYSQL_CHARSET_NAME_latin5, 1, 0, new String[] { "ISO8859_9" }),
|
||||
new MysqlCharset(MYSQL_CHARSET_NAME_cp850, 1, 0, new String[] { "Cp850", "Cp437" }),
|
||||
|
||||
new MysqlCharset(MYSQL_CHARSET_NAME_cp852, 1, 0, new String[] { "Cp852" }),
|
||||
new MysqlCharset(MYSQL_CHARSET_NAME_keybcs2, 1, 0, new String[] { "Cp852" }), // Kamenicky encoding usually known as Cp895 but there is no official cp895 specification; close to Cp852, see http://ftp.muni.cz/pub/localization/charsets/cs-encodings-faq
|
||||
|
||||
new MysqlCharset(MYSQL_CHARSET_NAME_cp866, 1, 0, new String[] { "Cp866" }),
|
||||
|
||||
new MysqlCharset(MYSQL_CHARSET_NAME_koi8r, 1, 1, new String[] { "KOI8_R" }),
|
||||
new MysqlCharset(MYSQL_CHARSET_NAME_koi8u, 1, 0, new String[] { "KOI8_R" }),
|
||||
|
||||
new MysqlCharset(MYSQL_CHARSET_NAME_tis620, 1, 0, new String[] { "TIS620" }),
|
||||
new MysqlCharset(MYSQL_CHARSET_NAME_cp1250, 1, 0, new String[] { "Cp1250" }),
|
||||
new MysqlCharset(MYSQL_CHARSET_NAME_cp1251, 1, 1, new String[] { "Cp1251" }),
|
||||
new MysqlCharset(MYSQL_CHARSET_NAME_cp1256, 1, 0, new String[] { "Cp1256" }),
|
||||
new MysqlCharset(MYSQL_CHARSET_NAME_cp1257, 1, 0, new String[] { "Cp1257" }),
|
||||
new MysqlCharset(MYSQL_CHARSET_NAME_macroman, 1, 0, new String[] { "MacRoman" }),
|
||||
new MysqlCharset(MYSQL_CHARSET_NAME_macce, 1, 0, new String[] { "MacCentralEurope" }),
|
||||
|
||||
new MysqlCharset(MYSQL_CHARSET_NAME_utf8, 3, 0, new String[] { "UTF-8" }),
|
||||
new MysqlCharset(MYSQL_CHARSET_NAME_utf8mb4, 4, 1, new String[] { "UTF-8" }), // "UTF-8 = *> 5.5.2 utf8mb4"
|
||||
|
||||
new MysqlCharset(MYSQL_CHARSET_NAME_binary, 1, 1, new String[] { "ISO8859_1" }),
|
||||
|
||||
new MysqlCharset(MYSQL_CHARSET_NAME_ucs2, 2, 0, new String[] { "UnicodeBig" }),
|
||||
new MysqlCharset(MYSQL_CHARSET_NAME_utf16, 4, 0, new String[] { "UTF-16" }),
|
||||
new MysqlCharset(MYSQL_CHARSET_NAME_utf16le, 4, 0, new String[] { "UTF-16LE" }),
|
||||
new MysqlCharset(MYSQL_CHARSET_NAME_utf32, 4, 0, new String[] { "UTF-32" })
|
||||
|
||||
};
|
||||
HashMap<String, MysqlCharset> charsetNameToMysqlCharsetMap = new HashMap<>();
|
||||
HashMap<String, List<MysqlCharset>> javaUcToMysqlCharsetMap = new HashMap<>();
|
||||
Set<String> tempMultibyteEncodings = new HashSet<>();
|
||||
|
||||
for (int i = 0; i < charset.length; i++) {
|
||||
String charsetName = charset[i].charsetName;
|
||||
charsetNameToMysqlCharsetMap.put(charsetName, charset[i]);
|
||||
|
||||
for (String encUC : charset[i].javaEncodingsUc) {
|
||||
List<MysqlCharset> charsets = javaUcToMysqlCharsetMap.get(encUC);
|
||||
if (charsets == null) {
|
||||
charsets = new ArrayList<>();
|
||||
javaUcToMysqlCharsetMap.put(encUC, charsets);
|
||||
}
|
||||
charsets.add(charset[i]);
|
||||
|
||||
if (charset[i].mblen > 1) {
|
||||
tempMultibyteEncodings.add(encUC);
|
||||
}
|
||||
}
|
||||
}
|
||||
CHARSET_NAME_TO_CHARSET = Collections.unmodifiableMap(charsetNameToMysqlCharsetMap);
|
||||
JAVA_ENCODING_UC_TO_MYSQL_CHARSET = Collections.unmodifiableMap(javaUcToMysqlCharsetMap);
|
||||
MULTIBYTE_ENCODINGS = Collections.unmodifiableSet(tempMultibyteEncodings);
|
||||
|
||||
// complete list of mysql collations and their corresponding character sets each element of collation[1]..collation[MAP_SIZE-1] must not be null
|
||||
Collation[] collation = new Collation[MAP_SIZE];
|
||||
collation[1] = new Collation(1, "big5_chinese_ci", 1, MYSQL_CHARSET_NAME_big5);
|
||||
collation[2] = new Collation(2, "latin2_czech_cs", 0, MYSQL_CHARSET_NAME_latin2);
|
||||
collation[3] = new Collation(3, "dec8_swedish_ci", 0, MYSQL_CHARSET_NAME_dec8);
|
||||
collation[4] = new Collation(4, "cp850_general_ci", 1, MYSQL_CHARSET_NAME_cp850);
|
||||
collation[5] = new Collation(5, "latin1_german1_ci", 0, MYSQL_CHARSET_NAME_latin1);
|
||||
collation[6] = new Collation(6, "hp8_english_ci", 0, MYSQL_CHARSET_NAME_hp8);
|
||||
collation[7] = new Collation(7, "koi8r_general_ci", 0, MYSQL_CHARSET_NAME_koi8r);
|
||||
collation[8] = new Collation(8, "latin1_swedish_ci", 1, MYSQL_CHARSET_NAME_latin1);
|
||||
collation[9] = new Collation(9, "latin2_general_ci", 1, MYSQL_CHARSET_NAME_latin2);
|
||||
collation[10] = new Collation(10, "swe7_swedish_ci", 0, MYSQL_CHARSET_NAME_swe7);
|
||||
collation[11] = new Collation(11, "ascii_general_ci", 0, MYSQL_CHARSET_NAME_ascii);
|
||||
collation[12] = new Collation(12, "ujis_japanese_ci", 0, MYSQL_CHARSET_NAME_ujis);
|
||||
collation[13] = new Collation(13, "sjis_japanese_ci", 0, MYSQL_CHARSET_NAME_sjis);
|
||||
collation[14] = new Collation(14, "cp1251_bulgarian_ci", 0, MYSQL_CHARSET_NAME_cp1251);
|
||||
collation[15] = new Collation(15, "latin1_danish_ci", 0, MYSQL_CHARSET_NAME_latin1);
|
||||
collation[16] = new Collation(16, "hebrew_general_ci", 0, MYSQL_CHARSET_NAME_hebrew);
|
||||
|
||||
collation[18] = new Collation(18, "tis620_thai_ci", 0, MYSQL_CHARSET_NAME_tis620);
|
||||
collation[19] = new Collation(19, "euckr_korean_ci", 0, MYSQL_CHARSET_NAME_euckr);
|
||||
collation[20] = new Collation(20, "latin7_estonian_cs", 0, MYSQL_CHARSET_NAME_latin7);
|
||||
collation[21] = new Collation(21, "latin2_hungarian_ci", 0, MYSQL_CHARSET_NAME_latin2);
|
||||
collation[22] = new Collation(22, "koi8u_general_ci", 0, MYSQL_CHARSET_NAME_koi8u);
|
||||
collation[23] = new Collation(23, "cp1251_ukrainian_ci", 0, MYSQL_CHARSET_NAME_cp1251);
|
||||
collation[24] = new Collation(24, "gb2312_chinese_ci", 0, MYSQL_CHARSET_NAME_gb2312);
|
||||
collation[25] = new Collation(25, "greek_general_ci", 0, MYSQL_CHARSET_NAME_greek);
|
||||
collation[26] = new Collation(26, "cp1250_general_ci", 1, MYSQL_CHARSET_NAME_cp1250);
|
||||
collation[27] = new Collation(27, "latin2_croatian_ci", 0, MYSQL_CHARSET_NAME_latin2);
|
||||
collation[28] = new Collation(28, "gbk_chinese_ci", 1, MYSQL_CHARSET_NAME_gbk);
|
||||
collation[29] = new Collation(29, "cp1257_lithuanian_ci", 0, MYSQL_CHARSET_NAME_cp1257);
|
||||
collation[30] = new Collation(30, "latin5_turkish_ci", 1, MYSQL_CHARSET_NAME_latin5);
|
||||
collation[31] = new Collation(31, "latin1_german2_ci", 0, MYSQL_CHARSET_NAME_latin1);
|
||||
collation[32] = new Collation(32, "armscii8_general_ci", 0, MYSQL_CHARSET_NAME_armscii8);
|
||||
collation[33] = new Collation(33, "utf8_general_ci", 1, MYSQL_CHARSET_NAME_utf8);
|
||||
collation[34] = new Collation(34, "cp1250_czech_cs", 0, MYSQL_CHARSET_NAME_cp1250);
|
||||
collation[35] = new Collation(35, "ucs2_general_ci", 1, MYSQL_CHARSET_NAME_ucs2);
|
||||
collation[36] = new Collation(36, "cp866_general_ci", 1, MYSQL_CHARSET_NAME_cp866);
|
||||
collation[37] = new Collation(37, "keybcs2_general_ci", 1, MYSQL_CHARSET_NAME_keybcs2);
|
||||
collation[38] = new Collation(38, "macce_general_ci", 1, MYSQL_CHARSET_NAME_macce);
|
||||
collation[39] = new Collation(39, "macroman_general_ci", 1, MYSQL_CHARSET_NAME_macroman);
|
||||
collation[40] = new Collation(40, "cp852_general_ci", 1, MYSQL_CHARSET_NAME_cp852);
|
||||
collation[41] = new Collation(41, "latin7_general_ci", 1, MYSQL_CHARSET_NAME_latin7);
|
||||
collation[42] = new Collation(42, "latin7_general_cs", 0, MYSQL_CHARSET_NAME_latin7);
|
||||
collation[43] = new Collation(43, "macce_bin", 0, MYSQL_CHARSET_NAME_macce);
|
||||
collation[44] = new Collation(44, "cp1250_croatian_ci", 0, MYSQL_CHARSET_NAME_cp1250);
|
||||
collation[45] = new Collation(45, "utf8mb4_general_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[46] = new Collation(46, "utf8mb4_bin", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[47] = new Collation(47, "latin1_bin", 0, MYSQL_CHARSET_NAME_latin1);
|
||||
collation[48] = new Collation(48, "latin1_general_ci", 0, MYSQL_CHARSET_NAME_latin1);
|
||||
collation[49] = new Collation(49, "latin1_general_cs", 0, MYSQL_CHARSET_NAME_latin1);
|
||||
collation[50] = new Collation(50, "cp1251_bin", 0, MYSQL_CHARSET_NAME_cp1251);
|
||||
collation[51] = new Collation(51, "cp1251_general_ci", 1, MYSQL_CHARSET_NAME_cp1251);
|
||||
collation[52] = new Collation(52, "cp1251_general_cs", 0, MYSQL_CHARSET_NAME_cp1251);
|
||||
collation[53] = new Collation(53, "macroman_bin", 0, MYSQL_CHARSET_NAME_macroman);
|
||||
collation[54] = new Collation(54, "utf16_general_ci", 1, MYSQL_CHARSET_NAME_utf16);
|
||||
collation[55] = new Collation(55, "utf16_bin", 0, MYSQL_CHARSET_NAME_utf16);
|
||||
collation[56] = new Collation(56, "utf16le_general_ci", 1, MYSQL_CHARSET_NAME_utf16le);
|
||||
collation[57] = new Collation(57, "cp1256_general_ci", 1, MYSQL_CHARSET_NAME_cp1256);
|
||||
collation[58] = new Collation(58, "cp1257_bin", 0, MYSQL_CHARSET_NAME_cp1257);
|
||||
collation[59] = new Collation(59, "cp1257_general_ci", 1, MYSQL_CHARSET_NAME_cp1257);
|
||||
collation[60] = new Collation(60, "utf32_general_ci", 1, MYSQL_CHARSET_NAME_utf32);
|
||||
collation[61] = new Collation(61, "utf32_bin", 0, MYSQL_CHARSET_NAME_utf32);
|
||||
collation[62] = new Collation(62, "utf16le_bin", 0, MYSQL_CHARSET_NAME_utf16le);
|
||||
collation[63] = new Collation(63, "binary", 1, MYSQL_CHARSET_NAME_binary);
|
||||
collation[64] = new Collation(64, "armscii8_bin", 0, MYSQL_CHARSET_NAME_armscii8);
|
||||
collation[65] = new Collation(65, "ascii_bin", 0, MYSQL_CHARSET_NAME_ascii);
|
||||
collation[66] = new Collation(66, "cp1250_bin", 0, MYSQL_CHARSET_NAME_cp1250);
|
||||
collation[67] = new Collation(67, "cp1256_bin", 0, MYSQL_CHARSET_NAME_cp1256);
|
||||
collation[68] = new Collation(68, "cp866_bin", 0, MYSQL_CHARSET_NAME_cp866);
|
||||
collation[69] = new Collation(69, "dec8_bin", 0, MYSQL_CHARSET_NAME_dec8);
|
||||
collation[70] = new Collation(70, "greek_bin", 0, MYSQL_CHARSET_NAME_greek);
|
||||
collation[71] = new Collation(71, "hebrew_bin", 0, MYSQL_CHARSET_NAME_hebrew);
|
||||
collation[72] = new Collation(72, "hp8_bin", 0, MYSQL_CHARSET_NAME_hp8);
|
||||
collation[73] = new Collation(73, "keybcs2_bin", 0, MYSQL_CHARSET_NAME_keybcs2);
|
||||
collation[74] = new Collation(74, "koi8r_bin", 0, MYSQL_CHARSET_NAME_koi8r);
|
||||
collation[75] = new Collation(75, "koi8u_bin", 0, MYSQL_CHARSET_NAME_koi8u);
|
||||
collation[76] = new Collation(76, "utf8_tolower_ci", 0, MYSQL_CHARSET_NAME_utf8);
|
||||
collation[77] = new Collation(77, "latin2_bin", 0, MYSQL_CHARSET_NAME_latin2);
|
||||
collation[78] = new Collation(78, "latin5_bin", 0, MYSQL_CHARSET_NAME_latin5);
|
||||
collation[79] = new Collation(79, "latin7_bin", 0, MYSQL_CHARSET_NAME_latin7);
|
||||
collation[80] = new Collation(80, "cp850_bin", 0, MYSQL_CHARSET_NAME_cp850);
|
||||
collation[81] = new Collation(81, "cp852_bin", 0, MYSQL_CHARSET_NAME_cp852);
|
||||
collation[82] = new Collation(82, "swe7_bin", 0, MYSQL_CHARSET_NAME_swe7);
|
||||
collation[83] = new Collation(83, "utf8_bin", 0, MYSQL_CHARSET_NAME_utf8);
|
||||
collation[84] = new Collation(84, "big5_bin", 0, MYSQL_CHARSET_NAME_big5);
|
||||
collation[85] = new Collation(85, "euckr_bin", 0, MYSQL_CHARSET_NAME_euckr);
|
||||
collation[86] = new Collation(86, "gb2312_bin", 0, MYSQL_CHARSET_NAME_gb2312);
|
||||
collation[87] = new Collation(87, "gbk_bin", 0, MYSQL_CHARSET_NAME_gbk);
|
||||
collation[88] = new Collation(88, "sjis_bin", 0, MYSQL_CHARSET_NAME_sjis);
|
||||
collation[89] = new Collation(89, "tis620_bin", 0, MYSQL_CHARSET_NAME_tis620);
|
||||
collation[90] = new Collation(90, "ucs2_bin", 0, MYSQL_CHARSET_NAME_ucs2);
|
||||
collation[91] = new Collation(91, "ujis_bin", 0, MYSQL_CHARSET_NAME_ujis);
|
||||
collation[92] = new Collation(92, "geostd8_general_ci", 0, MYSQL_CHARSET_NAME_geostd8);
|
||||
collation[93] = new Collation(93, "geostd8_bin", 0, MYSQL_CHARSET_NAME_geostd8);
|
||||
collation[94] = new Collation(94, "latin1_spanish_ci", 0, MYSQL_CHARSET_NAME_latin1);
|
||||
collation[95] = new Collation(95, "cp932_japanese_ci", 1, MYSQL_CHARSET_NAME_cp932);
|
||||
collation[96] = new Collation(96, "cp932_bin", 0, MYSQL_CHARSET_NAME_cp932);
|
||||
collation[97] = new Collation(97, "eucjpms_japanese_ci", 1, MYSQL_CHARSET_NAME_eucjpms);
|
||||
collation[98] = new Collation(98, "eucjpms_bin", 0, MYSQL_CHARSET_NAME_eucjpms);
|
||||
collation[99] = new Collation(99, "cp1250_polish_ci", 0, MYSQL_CHARSET_NAME_cp1250);
|
||||
|
||||
collation[101] = new Collation(101, "utf16_unicode_ci", 0, MYSQL_CHARSET_NAME_utf16);
|
||||
collation[102] = new Collation(102, "utf16_icelandic_ci", 0, MYSQL_CHARSET_NAME_utf16);
|
||||
collation[103] = new Collation(103, "utf16_latvian_ci", 0, MYSQL_CHARSET_NAME_utf16);
|
||||
collation[104] = new Collation(104, "utf16_romanian_ci", 0, MYSQL_CHARSET_NAME_utf16);
|
||||
collation[105] = new Collation(105, "utf16_slovenian_ci", 0, MYSQL_CHARSET_NAME_utf16);
|
||||
collation[106] = new Collation(106, "utf16_polish_ci", 0, MYSQL_CHARSET_NAME_utf16);
|
||||
collation[107] = new Collation(107, "utf16_estonian_ci", 0, MYSQL_CHARSET_NAME_utf16);
|
||||
collation[108] = new Collation(108, "utf16_spanish_ci", 0, MYSQL_CHARSET_NAME_utf16);
|
||||
collation[109] = new Collation(109, "utf16_swedish_ci", 0, MYSQL_CHARSET_NAME_utf16);
|
||||
collation[110] = new Collation(110, "utf16_turkish_ci", 0, MYSQL_CHARSET_NAME_utf16);
|
||||
collation[111] = new Collation(111, "utf16_czech_ci", 0, MYSQL_CHARSET_NAME_utf16);
|
||||
collation[112] = new Collation(112, "utf16_danish_ci", 0, MYSQL_CHARSET_NAME_utf16);
|
||||
collation[113] = new Collation(113, "utf16_lithuanian_ci", 0, MYSQL_CHARSET_NAME_utf16);
|
||||
collation[114] = new Collation(114, "utf16_slovak_ci", 0, MYSQL_CHARSET_NAME_utf16);
|
||||
collation[115] = new Collation(115, "utf16_spanish2_ci", 0, MYSQL_CHARSET_NAME_utf16);
|
||||
collation[116] = new Collation(116, "utf16_roman_ci", 0, MYSQL_CHARSET_NAME_utf16);
|
||||
collation[117] = new Collation(117, "utf16_persian_ci", 0, MYSQL_CHARSET_NAME_utf16);
|
||||
collation[118] = new Collation(118, "utf16_esperanto_ci", 0, MYSQL_CHARSET_NAME_utf16);
|
||||
collation[119] = new Collation(119, "utf16_hungarian_ci", 0, MYSQL_CHARSET_NAME_utf16);
|
||||
collation[120] = new Collation(120, "utf16_sinhala_ci", 0, MYSQL_CHARSET_NAME_utf16);
|
||||
collation[121] = new Collation(121, "utf16_german2_ci", 0, MYSQL_CHARSET_NAME_utf16);
|
||||
collation[122] = new Collation(122, "utf16_croatian_ci", 0, MYSQL_CHARSET_NAME_utf16);
|
||||
collation[123] = new Collation(123, "utf16_unicode_520_ci", 0, MYSQL_CHARSET_NAME_utf16);
|
||||
collation[124] = new Collation(124, "utf16_vietnamese_ci", 0, MYSQL_CHARSET_NAME_utf16);
|
||||
|
||||
collation[128] = new Collation(128, "ucs2_unicode_ci", 0, MYSQL_CHARSET_NAME_ucs2);
|
||||
collation[129] = new Collation(129, "ucs2_icelandic_ci", 0, MYSQL_CHARSET_NAME_ucs2);
|
||||
collation[130] = new Collation(130, "ucs2_latvian_ci", 0, MYSQL_CHARSET_NAME_ucs2);
|
||||
collation[131] = new Collation(131, "ucs2_romanian_ci", 0, MYSQL_CHARSET_NAME_ucs2);
|
||||
collation[132] = new Collation(132, "ucs2_slovenian_ci", 0, MYSQL_CHARSET_NAME_ucs2);
|
||||
collation[133] = new Collation(133, "ucs2_polish_ci", 0, MYSQL_CHARSET_NAME_ucs2);
|
||||
collation[134] = new Collation(134, "ucs2_estonian_ci", 0, MYSQL_CHARSET_NAME_ucs2);
|
||||
collation[135] = new Collation(135, "ucs2_spanish_ci", 0, MYSQL_CHARSET_NAME_ucs2);
|
||||
collation[136] = new Collation(136, "ucs2_swedish_ci", 0, MYSQL_CHARSET_NAME_ucs2);
|
||||
collation[137] = new Collation(137, "ucs2_turkish_ci", 0, MYSQL_CHARSET_NAME_ucs2);
|
||||
collation[138] = new Collation(138, "ucs2_czech_ci", 0, MYSQL_CHARSET_NAME_ucs2);
|
||||
collation[139] = new Collation(139, "ucs2_danish_ci", 0, MYSQL_CHARSET_NAME_ucs2);
|
||||
collation[140] = new Collation(140, "ucs2_lithuanian_ci", 0, MYSQL_CHARSET_NAME_ucs2);
|
||||
collation[141] = new Collation(141, "ucs2_slovak_ci", 0, MYSQL_CHARSET_NAME_ucs2);
|
||||
collation[142] = new Collation(142, "ucs2_spanish2_ci", 0, MYSQL_CHARSET_NAME_ucs2);
|
||||
collation[143] = new Collation(143, "ucs2_roman_ci", 0, MYSQL_CHARSET_NAME_ucs2);
|
||||
collation[144] = new Collation(144, "ucs2_persian_ci", 0, MYSQL_CHARSET_NAME_ucs2);
|
||||
collation[145] = new Collation(145, "ucs2_esperanto_ci", 0, MYSQL_CHARSET_NAME_ucs2);
|
||||
collation[146] = new Collation(146, "ucs2_hungarian_ci", 0, MYSQL_CHARSET_NAME_ucs2);
|
||||
collation[147] = new Collation(147, "ucs2_sinhala_ci", 0, MYSQL_CHARSET_NAME_ucs2);
|
||||
collation[148] = new Collation(148, "ucs2_german2_ci", 0, MYSQL_CHARSET_NAME_ucs2);
|
||||
collation[149] = new Collation(149, "ucs2_croatian_ci", 0, MYSQL_CHARSET_NAME_ucs2);
|
||||
collation[150] = new Collation(150, "ucs2_unicode_520_ci", 0, MYSQL_CHARSET_NAME_ucs2);
|
||||
collation[151] = new Collation(151, "ucs2_vietnamese_ci", 0, MYSQL_CHARSET_NAME_ucs2);
|
||||
|
||||
collation[159] = new Collation(159, "ucs2_general_mysql500_ci", 0, MYSQL_CHARSET_NAME_ucs2);
|
||||
collation[160] = new Collation(160, "utf32_unicode_ci", 0, MYSQL_CHARSET_NAME_utf32);
|
||||
collation[161] = new Collation(161, "utf32_icelandic_ci", 0, MYSQL_CHARSET_NAME_utf32);
|
||||
collation[162] = new Collation(162, "utf32_latvian_ci", 0, MYSQL_CHARSET_NAME_utf32);
|
||||
collation[163] = new Collation(163, "utf32_romanian_ci", 0, MYSQL_CHARSET_NAME_utf32);
|
||||
collation[164] = new Collation(164, "utf32_slovenian_ci", 0, MYSQL_CHARSET_NAME_utf32);
|
||||
collation[165] = new Collation(165, "utf32_polish_ci", 0, MYSQL_CHARSET_NAME_utf32);
|
||||
collation[166] = new Collation(166, "utf32_estonian_ci", 0, MYSQL_CHARSET_NAME_utf32);
|
||||
collation[167] = new Collation(167, "utf32_spanish_ci", 0, MYSQL_CHARSET_NAME_utf32);
|
||||
collation[168] = new Collation(168, "utf32_swedish_ci", 0, MYSQL_CHARSET_NAME_utf32);
|
||||
collation[169] = new Collation(169, "utf32_turkish_ci", 0, MYSQL_CHARSET_NAME_utf32);
|
||||
collation[170] = new Collation(170, "utf32_czech_ci", 0, MYSQL_CHARSET_NAME_utf32);
|
||||
collation[171] = new Collation(171, "utf32_danish_ci", 0, MYSQL_CHARSET_NAME_utf32);
|
||||
collation[172] = new Collation(172, "utf32_lithuanian_ci", 0, MYSQL_CHARSET_NAME_utf32);
|
||||
collation[173] = new Collation(173, "utf32_slovak_ci", 0, MYSQL_CHARSET_NAME_utf32);
|
||||
collation[174] = new Collation(174, "utf32_spanish2_ci", 0, MYSQL_CHARSET_NAME_utf32);
|
||||
collation[175] = new Collation(175, "utf32_roman_ci", 0, MYSQL_CHARSET_NAME_utf32);
|
||||
collation[176] = new Collation(176, "utf32_persian_ci", 0, MYSQL_CHARSET_NAME_utf32);
|
||||
collation[177] = new Collation(177, "utf32_esperanto_ci", 0, MYSQL_CHARSET_NAME_utf32);
|
||||
collation[178] = new Collation(178, "utf32_hungarian_ci", 0, MYSQL_CHARSET_NAME_utf32);
|
||||
collation[179] = new Collation(179, "utf32_sinhala_ci", 0, MYSQL_CHARSET_NAME_utf32);
|
||||
collation[180] = new Collation(180, "utf32_german2_ci", 0, MYSQL_CHARSET_NAME_utf32);
|
||||
collation[181] = new Collation(181, "utf32_croatian_ci", 0, MYSQL_CHARSET_NAME_utf32);
|
||||
collation[182] = new Collation(182, "utf32_unicode_520_ci", 0, MYSQL_CHARSET_NAME_utf32);
|
||||
collation[183] = new Collation(183, "utf32_vietnamese_ci", 0, MYSQL_CHARSET_NAME_utf32);
|
||||
|
||||
collation[192] = new Collation(192, "utf8_unicode_ci", 0, MYSQL_CHARSET_NAME_utf8);
|
||||
collation[193] = new Collation(193, "utf8_icelandic_ci", 0, MYSQL_CHARSET_NAME_utf8);
|
||||
collation[194] = new Collation(194, "utf8_latvian_ci", 0, MYSQL_CHARSET_NAME_utf8);
|
||||
collation[195] = new Collation(195, "utf8_romanian_ci", 0, MYSQL_CHARSET_NAME_utf8);
|
||||
collation[196] = new Collation(196, "utf8_slovenian_ci", 0, MYSQL_CHARSET_NAME_utf8);
|
||||
collation[197] = new Collation(197, "utf8_polish_ci", 0, MYSQL_CHARSET_NAME_utf8);
|
||||
collation[198] = new Collation(198, "utf8_estonian_ci", 0, MYSQL_CHARSET_NAME_utf8);
|
||||
collation[199] = new Collation(199, "utf8_spanish_ci", 0, MYSQL_CHARSET_NAME_utf8);
|
||||
collation[200] = new Collation(200, "utf8_swedish_ci", 0, MYSQL_CHARSET_NAME_utf8);
|
||||
collation[201] = new Collation(201, "utf8_turkish_ci", 0, MYSQL_CHARSET_NAME_utf8);
|
||||
collation[202] = new Collation(202, "utf8_czech_ci", 0, MYSQL_CHARSET_NAME_utf8);
|
||||
collation[203] = new Collation(203, "utf8_danish_ci", 0, MYSQL_CHARSET_NAME_utf8);
|
||||
collation[204] = new Collation(204, "utf8_lithuanian_ci", 0, MYSQL_CHARSET_NAME_utf8);
|
||||
collation[205] = new Collation(205, "utf8_slovak_ci", 0, MYSQL_CHARSET_NAME_utf8);
|
||||
collation[206] = new Collation(206, "utf8_spanish2_ci", 0, MYSQL_CHARSET_NAME_utf8);
|
||||
collation[207] = new Collation(207, "utf8_roman_ci", 0, MYSQL_CHARSET_NAME_utf8);
|
||||
collation[208] = new Collation(208, "utf8_persian_ci", 0, MYSQL_CHARSET_NAME_utf8);
|
||||
collation[209] = new Collation(209, "utf8_esperanto_ci", 0, MYSQL_CHARSET_NAME_utf8);
|
||||
collation[210] = new Collation(210, "utf8_hungarian_ci", 0, MYSQL_CHARSET_NAME_utf8);
|
||||
collation[211] = new Collation(211, "utf8_sinhala_ci", 0, MYSQL_CHARSET_NAME_utf8);
|
||||
collation[212] = new Collation(212, "utf8_german2_ci", 0, MYSQL_CHARSET_NAME_utf8);
|
||||
collation[213] = new Collation(213, "utf8_croatian_ci", 0, MYSQL_CHARSET_NAME_utf8);
|
||||
collation[214] = new Collation(214, "utf8_unicode_520_ci", 0, MYSQL_CHARSET_NAME_utf8);
|
||||
collation[215] = new Collation(215, "utf8_vietnamese_ci", 0, MYSQL_CHARSET_NAME_utf8);
|
||||
|
||||
collation[223] = new Collation(223, "utf8_general_mysql500_ci", 0, MYSQL_CHARSET_NAME_utf8);
|
||||
collation[224] = new Collation(224, "utf8mb4_unicode_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[225] = new Collation(225, "utf8mb4_icelandic_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[226] = new Collation(226, "utf8mb4_latvian_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[227] = new Collation(227, "utf8mb4_romanian_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[228] = new Collation(228, "utf8mb4_slovenian_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[229] = new Collation(229, "utf8mb4_polish_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[230] = new Collation(230, "utf8mb4_estonian_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[231] = new Collation(231, "utf8mb4_spanish_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[232] = new Collation(232, "utf8mb4_swedish_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[233] = new Collation(233, "utf8mb4_turkish_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[234] = new Collation(234, "utf8mb4_czech_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[235] = new Collation(235, "utf8mb4_danish_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[236] = new Collation(236, "utf8mb4_lithuanian_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[237] = new Collation(237, "utf8mb4_slovak_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[238] = new Collation(238, "utf8mb4_spanish2_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[239] = new Collation(239, "utf8mb4_roman_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[240] = new Collation(240, "utf8mb4_persian_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[241] = new Collation(241, "utf8mb4_esperanto_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[242] = new Collation(242, "utf8mb4_hungarian_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[243] = new Collation(243, "utf8mb4_sinhala_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[244] = new Collation(244, "utf8mb4_german2_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[245] = new Collation(245, "utf8mb4_croatian_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[246] = new Collation(246, "utf8mb4_unicode_520_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[247] = new Collation(247, "utf8mb4_vietnamese_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[248] = new Collation(248, "gb18030_chinese_ci", 1, MYSQL_CHARSET_NAME_gb18030);
|
||||
collation[249] = new Collation(249, "gb18030_bin", 0, MYSQL_CHARSET_NAME_gb18030);
|
||||
collation[250] = new Collation(250, "gb18030_unicode_520_ci", 0, MYSQL_CHARSET_NAME_gb18030);
|
||||
|
||||
collation[255] = new Collation(255, "utf8mb4_0900_ai_ci", 1, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[256] = new Collation(256, "utf8mb4_de_pb_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[257] = new Collation(257, "utf8mb4_is_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[258] = new Collation(258, "utf8mb4_lv_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[259] = new Collation(259, "utf8mb4_ro_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[260] = new Collation(260, "utf8mb4_sl_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[261] = new Collation(261, "utf8mb4_pl_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[262] = new Collation(262, "utf8mb4_et_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[263] = new Collation(263, "utf8mb4_es_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[264] = new Collation(264, "utf8mb4_sv_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[265] = new Collation(265, "utf8mb4_tr_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[266] = new Collation(266, "utf8mb4_cs_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[267] = new Collation(267, "utf8mb4_da_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[268] = new Collation(268, "utf8mb4_lt_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[269] = new Collation(269, "utf8mb4_sk_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[270] = new Collation(270, "utf8mb4_es_trad_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[271] = new Collation(271, "utf8mb4_la_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
|
||||
collation[273] = new Collation(273, "utf8mb4_eo_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[274] = new Collation(274, "utf8mb4_hu_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[275] = new Collation(275, "utf8mb4_hr_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
|
||||
collation[277] = new Collation(277, "utf8mb4_vi_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[278] = new Collation(278, "utf8mb4_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[279] = new Collation(279, "utf8mb4_de_pb_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[280] = new Collation(280, "utf8mb4_is_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[281] = new Collation(281, "utf8mb4_lv_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[282] = new Collation(282, "utf8mb4_ro_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[283] = new Collation(283, "utf8mb4_sl_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[284] = new Collation(284, "utf8mb4_pl_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[285] = new Collation(285, "utf8mb4_et_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[286] = new Collation(286, "utf8mb4_es_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[287] = new Collation(287, "utf8mb4_sv_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[288] = new Collation(288, "utf8mb4_tr_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[289] = new Collation(289, "utf8mb4_cs_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[290] = new Collation(290, "utf8mb4_da_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[291] = new Collation(291, "utf8mb4_lt_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[292] = new Collation(292, "utf8mb4_sk_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[293] = new Collation(293, "utf8mb4_es_trad_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[294] = new Collation(294, "utf8mb4_la_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
|
||||
collation[296] = new Collation(296, "utf8mb4_eo_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[297] = new Collation(297, "utf8mb4_hu_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[298] = new Collation(298, "utf8mb4_hr_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
|
||||
collation[300] = new Collation(300, "utf8mb4_vi_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
|
||||
collation[303] = new Collation(303, "utf8mb4_ja_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[304] = new Collation(304, "utf8mb4_ja_0900_as_cs_ks", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[305] = new Collation(305, "utf8mb4_0900_as_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[306] = new Collation(306, "utf8mb4_ru_0900_ai_ci", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[307] = new Collation(307, "utf8mb4_ru_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[308] = new Collation(308, "utf8mb4_zh_0900_as_cs", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
collation[309] = new Collation(309, "utf8mb4_0900_bin", 0, MYSQL_CHARSET_NAME_utf8mb4);
|
||||
|
||||
COLLATION_INDEX_TO_COLLATION_NAME = new String[MAP_SIZE];
|
||||
Map<Integer, MysqlCharset> collationIndexToCharset = new TreeMap<>();
|
||||
Map<String, Integer> charsetNameToCollationIndexMap = new TreeMap<>();
|
||||
Map<String, Integer> charsetNameToCollationPriorityMap = new TreeMap<>();
|
||||
Map<String, Integer> collationNameToCollationIndexMap = new TreeMap<>();
|
||||
Set<Integer> impermissibleIndexes = new HashSet<>();
|
||||
|
||||
for (int i = 1; i < MAP_SIZE; i++) {
|
||||
Collation coll = collation[i];
|
||||
if (coll != null) {
|
||||
COLLATION_INDEX_TO_COLLATION_NAME[i] = coll.collationName;
|
||||
collationIndexToCharset.put(i, coll.mysqlCharset);
|
||||
collationNameToCollationIndexMap.put(coll.collationName, i);
|
||||
String charsetName = coll.mysqlCharset.charsetName;
|
||||
|
||||
if (!charsetNameToCollationIndexMap.containsKey(charsetName) || charsetNameToCollationPriorityMap.get(charsetName) < coll.priority) {
|
||||
charsetNameToCollationIndexMap.put(charsetName, i);
|
||||
charsetNameToCollationPriorityMap.put(charsetName, coll.priority);
|
||||
}
|
||||
|
||||
// Filling indexes of impermissible client character sets ucs2, utf16, utf16le, utf32
|
||||
if (charsetName.equals(MYSQL_CHARSET_NAME_ucs2) || charsetName.equals(MYSQL_CHARSET_NAME_utf16)
|
||||
|| charsetName.equals(MYSQL_CHARSET_NAME_utf16le) || charsetName.equals(MYSQL_CHARSET_NAME_utf32)) {
|
||||
impermissibleIndexes.add(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
COLLATION_INDEX_TO_CHARSET = Collections.unmodifiableMap(collationIndexToCharset);
|
||||
CHARSET_NAME_TO_COLLATION_INDEX = Collections.unmodifiableMap(charsetNameToCollationIndexMap);
|
||||
COLLATION_NAME_TO_COLLATION_INDEX = Collections.unmodifiableMap(collationNameToCollationIndexMap);
|
||||
IMPERMISSIBLE_INDEXES = Collections.unmodifiableSet(impermissibleIndexes);
|
||||
|
||||
collation = null;
|
||||
}
|
||||
|
||||
protected static String getStaticMysqlCharsetForJavaEncoding(String javaEncoding, ServerVersion version) {
|
||||
List<MysqlCharset> mysqlCharsets = CharsetMapping.JAVA_ENCODING_UC_TO_MYSQL_CHARSET.get(javaEncoding.toUpperCase(Locale.ENGLISH));
|
||||
if (mysqlCharsets != null) {
|
||||
if (version == null) {
|
||||
return mysqlCharsets.get(0).charsetName; // Take the first one we get
|
||||
}
|
||||
MysqlCharset currentChoice = null;
|
||||
for (MysqlCharset charset : mysqlCharsets) {
|
||||
if (charset.isOkayForVersion(version) && (currentChoice == null || currentChoice.minimumVersion.compareTo(charset.minimumVersion) < 0
|
||||
|| currentChoice.priority < charset.priority && currentChoice.minimumVersion.compareTo(charset.minimumVersion) == 0)) {
|
||||
currentChoice = charset;
|
||||
}
|
||||
}
|
||||
if (currentChoice != null) {
|
||||
return currentChoice.charsetName;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
protected static int getStaticCollationIndexForJavaEncoding(String javaEncoding, ServerVersion version) {
|
||||
String charsetName = getStaticMysqlCharsetForJavaEncoding(javaEncoding, version);
|
||||
return getStaticCollationIndexForMysqlCharsetName(charsetName);
|
||||
}
|
||||
|
||||
protected static int getStaticCollationIndexForMysqlCharsetName(String charsetName) {
|
||||
if (charsetName != null) {
|
||||
Integer ci = CHARSET_NAME_TO_COLLATION_INDEX.get(charsetName);
|
||||
if (ci != null) {
|
||||
return ci.intValue();
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// TODO turn it to protected when com.mysql.cj.xdevapi.ColumnImpl can use dynamic maps
|
||||
public static String getStaticMysqlCharsetNameForCollationIndex(Integer collationIndex) {
|
||||
MysqlCharset charset = null;
|
||||
if (collationIndex != null) {
|
||||
charset = COLLATION_INDEX_TO_CHARSET.get(collationIndex);
|
||||
}
|
||||
return charset != null ? charset.charsetName : null;
|
||||
}
|
||||
|
||||
// TODO turn it to protected when com.mysql.cj.xdevapi.ColumnImpl can use dynamic maps
|
||||
public static String getStaticCollationNameForCollationIndex(Integer collationIndex) {
|
||||
if (collationIndex != null && collationIndex > 0 && collationIndex < MAP_SIZE) {
|
||||
return COLLATION_INDEX_TO_COLLATION_NAME[collationIndex];
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
protected static Integer getStaticCollationIndexForCollationName(String collationName) {
|
||||
return CharsetMapping.COLLATION_NAME_TO_COLLATION_INDEX.get(collationName);
|
||||
}
|
||||
|
||||
/**
|
||||
* MySQL charset could map to several Java encodings.
|
||||
* So here we choose the one according to next rules:
|
||||
* <ul>
|
||||
* <li>if there is no static mapping for this charset then return javaEncoding value as is because this
|
||||
* could be a custom charset for example
|
||||
* <li>if static mapping exists and javaEncoding equals to one of Java encoding canonical names or aliases available
|
||||
* for this mapping then javaEncoding value as is; this is required when result should match to connection encoding, for example if connection encoding is
|
||||
* Cp943 we must avoid getting SHIFT_JIS for sjis mysql charset
|
||||
* <li>if static mapping exists and javaEncoding doesn't match any Java encoding canonical
|
||||
* names or aliases available for this mapping then return default Java encoding (the first in mapping list)
|
||||
* </ul>
|
||||
*
|
||||
* @param mysqlCharsetName
|
||||
* MySQL charset name
|
||||
* @param fallbackJavaEncoding
|
||||
* fall-back java encoding name
|
||||
* @return java encoding name
|
||||
*/
|
||||
protected static String getStaticJavaEncodingForMysqlCharset(String mysqlCharsetName, String fallbackJavaEncoding) {
|
||||
MysqlCharset cs = getStaticMysqlCharsetByName(mysqlCharsetName);
|
||||
return cs != null ? cs.getMatchingJavaEncoding(fallbackJavaEncoding) : fallbackJavaEncoding;
|
||||
}
|
||||
|
||||
protected static MysqlCharset getStaticMysqlCharsetByName(String mysqlCharsetName) {
|
||||
return CHARSET_NAME_TO_CHARSET.get(mysqlCharsetName);
|
||||
}
|
||||
|
||||
protected static String getStaticJavaEncodingForMysqlCharset(String mysqlCharsetName) {
|
||||
return getStaticJavaEncodingForMysqlCharset(mysqlCharsetName, null);
|
||||
}
|
||||
|
||||
protected static String getStaticJavaEncodingForCollationIndex(Integer collationIndex, String fallbackJavaEncoding) {
|
||||
MysqlCharset charset = null;
|
||||
if (collationIndex != null) {
|
||||
charset = COLLATION_INDEX_TO_CHARSET.get(collationIndex);
|
||||
}
|
||||
return charset != null ? charset.getMatchingJavaEncoding(fallbackJavaEncoding) : fallbackJavaEncoding;
|
||||
}
|
||||
|
||||
// TODO turn it to protected when com.mysql.cj.protocol.x.FieldFactory can use dynamic maps
|
||||
public static String getStaticJavaEncodingForCollationIndex(Integer collationIndex) {
|
||||
return getStaticJavaEncodingForCollationIndex(collationIndex, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Does the character set contain multi-byte encoded characters.
|
||||
*
|
||||
* @param javaEncodingName
|
||||
* java encoding name
|
||||
* @return true if the character set contains multi-byte encoded characters.
|
||||
*/
|
||||
protected static boolean isStaticMultibyteCharset(String javaEncodingName) {
|
||||
return MULTIBYTE_ENCODINGS.contains(javaEncodingName.toUpperCase(Locale.ENGLISH));
|
||||
}
|
||||
|
||||
protected static int getStaticMblen(String charsetName) {
|
||||
if (charsetName != null) {
|
||||
MysqlCharset cs = getStaticMysqlCharsetByName(charsetName);
|
||||
if (cs != null) {
|
||||
return cs.mblen;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
protected static boolean isStaticImpermissibleCollation(int collationIndex) {
|
||||
return CharsetMapping.IMPERMISSIBLE_INDEXES.contains(collationIndex);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class MysqlCharset {
|
||||
public final String charsetName;
|
||||
public final int mblen;
|
||||
public final int priority;
|
||||
public final List<String> javaEncodingsUc = new ArrayList<>();
|
||||
|
||||
public final ServerVersion minimumVersion;
|
||||
|
||||
/**
|
||||
* Constructs MysqlCharset object
|
||||
*
|
||||
* @param charsetName
|
||||
* MySQL charset name
|
||||
* @param mblen
|
||||
* Max number of bytes per character
|
||||
* @param priority
|
||||
* MysqlCharset with highest value of this param will be used for Java encoding --> Mysql charsets conversion.
|
||||
* @param javaEncodings
|
||||
* List of Java encodings corresponding to this MySQL charset; the first name in list is the default for mysql --> java data conversion
|
||||
*/
|
||||
public MysqlCharset(String charsetName, int mblen, int priority, String[] javaEncodings) {
|
||||
this(charsetName, mblen, priority, javaEncodings, new ServerVersion(0, 0, 0));
|
||||
}
|
||||
|
||||
private void addEncodingMapping(String encoding) {
|
||||
String encodingUc = encoding.toUpperCase(Locale.ENGLISH);
|
||||
|
||||
if (!this.javaEncodingsUc.contains(encodingUc)) {
|
||||
this.javaEncodingsUc.add(encodingUc);
|
||||
}
|
||||
}
|
||||
|
||||
public MysqlCharset(String charsetName, int mblen, int priority, String[] javaEncodings, ServerVersion minimumVersion) {
|
||||
this.charsetName = charsetName;
|
||||
this.mblen = mblen;
|
||||
this.priority = priority;
|
||||
|
||||
for (int i = 0; i < javaEncodings.length; i++) {
|
||||
String encoding = javaEncodings[i];
|
||||
try {
|
||||
Charset cs = Charset.forName(encoding);
|
||||
addEncodingMapping(cs.name());
|
||||
cs.aliases().forEach(this::addEncodingMapping);
|
||||
} catch (Exception e) {
|
||||
// if there is no support of this charset in JVM it's still possible to use our converter for 1-byte charsets
|
||||
if (mblen == 1) {
|
||||
addEncodingMapping(encoding);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (this.javaEncodingsUc.size() == 0) {
|
||||
addEncodingMapping(mblen > 1 ? "UTF-8" : "Cp1252");
|
||||
}
|
||||
|
||||
this.minimumVersion = minimumVersion;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
StringBuilder asString = new StringBuilder();
|
||||
asString.append("[");
|
||||
asString.append("charsetName=");
|
||||
asString.append(this.charsetName);
|
||||
asString.append(",mblen=");
|
||||
asString.append(this.mblen);
|
||||
// asString.append(",javaEncoding=");
|
||||
// asString.append(this.javaEncodings.toString());
|
||||
asString.append("]");
|
||||
return asString.toString();
|
||||
}
|
||||
|
||||
boolean isOkayForVersion(ServerVersion version) {
|
||||
return version.meetsMinimum(this.minimumVersion);
|
||||
}
|
||||
|
||||
/**
|
||||
* If javaEncoding parameter value is one of available java encodings for this charset
|
||||
* then returns javaEncoding value as is. Otherwise returns first available java encoding name.
|
||||
*
|
||||
* @param javaEncoding
|
||||
* java encoding name
|
||||
* @return java encoding name
|
||||
*/
|
||||
String getMatchingJavaEncoding(String javaEncoding) {
|
||||
if (javaEncoding != null && this.javaEncodingsUc.contains(javaEncoding.toUpperCase(Locale.ENGLISH))) {
|
||||
return javaEncoding;
|
||||
}
|
||||
return this.javaEncodingsUc.get(0);
|
||||
}
|
||||
}
|
||||
|
||||
class Collation {
|
||||
public final int index;
|
||||
public final String collationName;
|
||||
public final int priority;
|
||||
public final MysqlCharset mysqlCharset;
|
||||
|
||||
public Collation(int index, String collationName, int priority, String charsetName) {
|
||||
this.index = index;
|
||||
this.collationName = collationName;
|
||||
this.priority = priority;
|
||||
this.mysqlCharset = CharsetMapping.getStaticMysqlCharsetByName(charsetName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
StringBuilder asString = new StringBuilder();
|
||||
asString.append("[");
|
||||
asString.append("index=");
|
||||
asString.append(this.index);
|
||||
asString.append(",collationName=");
|
||||
asString.append(this.collationName);
|
||||
asString.append(",charsetName=");
|
||||
asString.append(this.mysqlCharset.charsetName);
|
||||
asString.append(",javaCharsetName=");
|
||||
asString.append(this.mysqlCharset.getMatchingJavaEncoding(null));
|
||||
asString.append("]");
|
||||
return asString.toString();
|
||||
}
|
||||
}
|
||||
+114
@@ -0,0 +1,114 @@
|
||||
/*
|
||||
* Copyright (c) 2021, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package com.mysql.cj;
|
||||
|
||||
public interface CharsetSettings {
|
||||
|
||||
public static final String CHARACTER_SET_CLIENT = "character_set_client";
|
||||
public static final String CHARACTER_SET_CONNECTION = "character_set_connection";
|
||||
public static final String CHARACTER_SET_RESULTS = "character_set_results";
|
||||
public static final String COLLATION_CONNECTION = "collation_connection";
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* Choose the MySQL collation index for the handshake packet and the corresponding Java encodings for the password and error messages.
|
||||
* </p>
|
||||
* <p>
|
||||
* This index will be sent with HandshakeResponse setting server variables 'character_set_connection', 'collation_connection', 'character_set_client'
|
||||
* and 'character_set_results' which will be used by the server for decoding passwords during the authentication phase and later on, if
|
||||
* no SET NAMES are issued by {@link #configurePostHandshake(boolean)}.
|
||||
* </p>
|
||||
* <p>
|
||||
* It also means that collation index should be set according to:
|
||||
* <ol>
|
||||
* <li>'passwordCharacterEncoding' if it's present, or
|
||||
* <li>'connectionCollation' if it's present, or
|
||||
* <li>'characterEncoding' if it's present
|
||||
* </ol>
|
||||
* otherwise it will be set to utf8mb4_general_ci or utf8mb4_0900_ai_ci depending on server version.
|
||||
* <p>
|
||||
* Since Protocol::HandshakeV10 and Protocol::HandshakeResponse41 has only one byte for the collation it's not possible to use indexes > 255 during the
|
||||
* handshake.
|
||||
* Also, ucs2, utf16, utf16le and utf32 character sets are impermissible here. Connector/J will try to use utf8mb4 instead.
|
||||
* </p>
|
||||
*
|
||||
* @param reset
|
||||
* reset the charsets configuration; needed for changeUser call.
|
||||
*
|
||||
* @return MySQL collation index to be used during the handshake.
|
||||
*/
|
||||
int configurePreHandshake(boolean reset);
|
||||
|
||||
/**
|
||||
* Sets up client character set. This must be done before any further communication with the server!
|
||||
*
|
||||
* The 'collation_connection', 'character_set_client', 'character_set_connection' and 'character_set_results' server variables are set
|
||||
* according to the collation index selected by {@link #configurePreHandshake(boolean)} and sent in the Protocol::HandshakeV10 packet.
|
||||
* Here Connector/J alters these server variables if needed.
|
||||
*
|
||||
* @param dontCheckServerMatch
|
||||
* if true then send the SET NAMES query even if server charset already matches the new value; needed for changeUser call.
|
||||
*/
|
||||
void configurePostHandshake(boolean dontCheckServerMatch);
|
||||
|
||||
public boolean doesPlatformDbCharsetMatches();
|
||||
|
||||
String getPasswordCharacterEncoding();
|
||||
|
||||
String getErrorMessageEncoding();
|
||||
|
||||
String getMetadataEncoding();
|
||||
|
||||
int getMetadataCollationIndex();
|
||||
|
||||
boolean getRequiresEscapingEncoder();
|
||||
|
||||
String getJavaEncodingForCollationIndex(int collationIndex);
|
||||
|
||||
int getMaxBytesPerChar(String javaCharsetName);
|
||||
|
||||
int getMaxBytesPerChar(Integer charsetIndex, String javaCharsetName);
|
||||
|
||||
Integer getCollationIndexForCollationName(String collationName);
|
||||
|
||||
String getCollationNameForCollationIndex(Integer collationIndex);
|
||||
|
||||
String getMysqlCharsetNameForCollationIndex(Integer collationIndex);
|
||||
|
||||
int getCollationIndexForJavaEncoding(String javaEncoding, ServerVersion version);
|
||||
|
||||
int getCollationIndexForMysqlCharsetName(String charsetName);
|
||||
|
||||
String getJavaEncodingForMysqlCharset(String mysqlCharsetName);
|
||||
|
||||
String getMysqlCharsetForJavaEncoding(String javaEncoding, ServerVersion version);
|
||||
|
||||
boolean isMultibyteCharset(String javaEncodingName);
|
||||
}
|
||||
+106
@@ -0,0 +1,106 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2021, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package com.mysql.cj;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.math.BigInteger;
|
||||
|
||||
import com.mysql.cj.conf.PropertyDefinitions;
|
||||
|
||||
/**
|
||||
* Represents various constants used in the driver.
|
||||
*/
|
||||
public class Constants {
|
||||
/**
|
||||
* Avoids allocation of empty byte[] when representing 0-length strings.
|
||||
*/
|
||||
public final static byte[] EMPTY_BYTE_ARRAY = new byte[0];
|
||||
|
||||
/**
|
||||
* I18N'd representation of the abbreviation for "ms"
|
||||
*/
|
||||
public final static String MILLIS_I18N = Messages.getString("Milliseconds");
|
||||
|
||||
public final static byte[] SLASH_STAR_SPACE_AS_BYTES = new byte[] { (byte) '/', (byte) '*', (byte) ' ' };
|
||||
|
||||
public final static byte[] SPACE_STAR_SLASH_SPACE_AS_BYTES = new byte[] { (byte) ' ', (byte) '*', (byte) '/', (byte) ' ' };
|
||||
|
||||
public static final String JVM_VENDOR = System.getProperty(PropertyDefinitions.SYSP_java_vendor);
|
||||
public static final String JVM_VERSION = System.getProperty(PropertyDefinitions.SYSP_java_version);
|
||||
|
||||
public static final String OS_NAME = System.getProperty(PropertyDefinitions.SYSP_os_name);
|
||||
public static final String OS_ARCH = System.getProperty(PropertyDefinitions.SYSP_os_arch);
|
||||
public static final String OS_VERSION = System.getProperty(PropertyDefinitions.SYSP_os_version);
|
||||
public static final String PLATFORM_ENCODING = System.getProperty(PropertyDefinitions.SYSP_file_encoding);
|
||||
|
||||
public static final String CJ_NAME = "@MYSQL_CJ_DISPLAY_PROD_NAME@";
|
||||
public static final String CJ_FULL_NAME = "@MYSQL_CJ_FULL_PROD_NAME@";
|
||||
public static final String CJ_REVISION = "@MYSQL_CJ_REVISION@";
|
||||
public static final String CJ_VERSION = "@MYSQL_CJ_VERSION@";
|
||||
public static final String CJ_MAJOR_VERSION = "@MYSQL_CJ_MAJOR_VERSION@";
|
||||
public static final String CJ_MINOR_VERSION = "@MYSQL_CJ_MINOR_VERSION@";
|
||||
public static final String CJ_LICENSE = "@MYSQL_CJ_LICENSE_TYPE@";
|
||||
|
||||
public static final BigInteger BIG_INTEGER_ZERO = BigInteger.valueOf(0);
|
||||
public static final BigInteger BIG_INTEGER_ONE = BigInteger.valueOf(1);
|
||||
public static final BigInteger BIG_INTEGER_NEGATIVE_ONE = BigInteger.valueOf(-1);
|
||||
public static final BigInteger BIG_INTEGER_MIN_BYTE_VALUE = BigInteger.valueOf(Byte.MIN_VALUE);
|
||||
public static final BigInteger BIG_INTEGER_MAX_BYTE_VALUE = BigInteger.valueOf(Byte.MAX_VALUE);
|
||||
public static final BigInteger BIG_INTEGER_MIN_SHORT_VALUE = BigInteger.valueOf(Short.MIN_VALUE);
|
||||
public static final BigInteger BIG_INTEGER_MAX_SHORT_VALUE = BigInteger.valueOf(Short.MAX_VALUE);
|
||||
public static final BigInteger BIG_INTEGER_MIN_INTEGER_VALUE = BigInteger.valueOf(Integer.MIN_VALUE);
|
||||
public static final BigInteger BIG_INTEGER_MAX_INTEGER_VALUE = BigInteger.valueOf(Integer.MAX_VALUE);
|
||||
public static final BigInteger BIG_INTEGER_MIN_LONG_VALUE = BigInteger.valueOf(Long.MIN_VALUE);
|
||||
public static final BigInteger BIG_INTEGER_MAX_LONG_VALUE = BigInteger.valueOf(Long.MAX_VALUE);
|
||||
|
||||
public static final BigDecimal BIG_DECIMAL_ZERO = BigDecimal.valueOf(0);
|
||||
public static final BigDecimal BIG_DECIMAL_ONE = BigDecimal.valueOf(1);
|
||||
public static final BigDecimal BIG_DECIMAL_NEGATIVE_ONE = BigDecimal.valueOf(-1);
|
||||
public static final BigDecimal BIG_DECIMAL_MIN_BYTE_VALUE = BigDecimal.valueOf(Byte.MIN_VALUE);
|
||||
public static final BigDecimal BIG_DECIMAL_MAX_BYTE_VALUE = BigDecimal.valueOf(Byte.MAX_VALUE);
|
||||
public static final BigDecimal BIG_DECIMAL_MIN_SHORT_VALUE = BigDecimal.valueOf(Short.MIN_VALUE);
|
||||
public static final BigDecimal BIG_DECIMAL_MAX_SHORT_VALUE = BigDecimal.valueOf(Short.MAX_VALUE);
|
||||
public static final BigDecimal BIG_DECIMAL_MIN_INTEGER_VALUE = BigDecimal.valueOf(Integer.MIN_VALUE);
|
||||
public static final BigDecimal BIG_DECIMAL_MAX_INTEGER_VALUE = BigDecimal.valueOf(Integer.MAX_VALUE);
|
||||
public static final BigDecimal BIG_DECIMAL_MIN_LONG_VALUE = BigDecimal.valueOf(Long.MIN_VALUE);
|
||||
public static final BigDecimal BIG_DECIMAL_MAX_LONG_VALUE = BigDecimal.valueOf(Long.MAX_VALUE);
|
||||
public static final BigDecimal BIG_DECIMAL_MAX_DOUBLE_VALUE = BigDecimal.valueOf(Double.MAX_VALUE);
|
||||
public static final BigDecimal BIG_DECIMAL_MAX_NEGATIVE_DOUBLE_VALUE = BigDecimal.valueOf(-Double.MAX_VALUE);
|
||||
public static final BigDecimal BIG_DECIMAL_MAX_FLOAT_VALUE = BigDecimal.valueOf(Float.MAX_VALUE);
|
||||
public static final BigDecimal BIG_DECIMAL_MAX_NEGATIVE_FLOAT_VALUE = BigDecimal.valueOf(-Float.MAX_VALUE);
|
||||
|
||||
public static final int UNSIGNED_BYTE_MAX_VALUE = 255;
|
||||
|
||||
/**
|
||||
* Prevents instantiation
|
||||
*/
|
||||
private Constants() {
|
||||
}
|
||||
}
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* Copyright (c) 2018, 2020, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package com.mysql.cj;
|
||||
|
||||
public interface DataStoreMetadata {
|
||||
|
||||
boolean schemaExists(String schemaName);
|
||||
|
||||
boolean tableExists(String schemaName, String tableName);
|
||||
|
||||
long getTableRowCount(String schemaName, String tableName);
|
||||
|
||||
}
|
||||
+43
@@ -0,0 +1,43 @@
|
||||
/*
|
||||
* Copyright (c) 2018, 2020, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package com.mysql.cj;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.mysql.cj.protocol.Message;
|
||||
|
||||
public interface MessageBuilder<M extends Message> {
|
||||
|
||||
M buildSqlStatement(String statement);
|
||||
|
||||
M buildSqlStatement(String statement, List<Object> args);
|
||||
|
||||
M buildClose();
|
||||
}
|
||||
+108
@@ -0,0 +1,108 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2020, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package com.mysql.cj;
|
||||
|
||||
import java.text.MessageFormat;
|
||||
import java.util.Locale;
|
||||
import java.util.MissingResourceException;
|
||||
import java.util.ResourceBundle;
|
||||
|
||||
/**
|
||||
* Support for localized messages.
|
||||
*/
|
||||
public class Messages {
|
||||
private static final String BUNDLE_NAME = "com.mysql.cj.LocalizedErrorMessages";
|
||||
|
||||
private static final ResourceBundle RESOURCE_BUNDLE;
|
||||
private static final Object[] emptyObjectArray = {};
|
||||
|
||||
static {
|
||||
ResourceBundle temp = null;
|
||||
|
||||
//
|
||||
// Overly-pedantic here, some appserver and JVM combos don't deal well with the no-args version, others don't deal well with the three-arg version, so
|
||||
// we need to try both :(
|
||||
//
|
||||
|
||||
try {
|
||||
temp = ResourceBundle.getBundle(BUNDLE_NAME, Locale.getDefault(), Messages.class.getClassLoader());
|
||||
} catch (Throwable t) {
|
||||
try {
|
||||
temp = ResourceBundle.getBundle(BUNDLE_NAME);
|
||||
} catch (Throwable t2) {
|
||||
RuntimeException rt = new RuntimeException("Can't load resource bundle due to underlying exception " + t.toString());
|
||||
rt.initCause(t2);
|
||||
|
||||
throw rt;
|
||||
}
|
||||
} finally {
|
||||
RESOURCE_BUNDLE = temp;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the localized message for the given message key
|
||||
*
|
||||
* @param key
|
||||
* the message key
|
||||
* @return The localized message for the key
|
||||
*/
|
||||
public static String getString(String key) {
|
||||
return getString(key, emptyObjectArray);
|
||||
}
|
||||
|
||||
public static String getString(String key, Object[] args) {
|
||||
if (RESOURCE_BUNDLE == null) {
|
||||
throw new RuntimeException("Localized messages from resource bundle '" + BUNDLE_NAME + "' not loaded during initialization of driver.");
|
||||
}
|
||||
|
||||
try {
|
||||
if (key == null) {
|
||||
throw new IllegalArgumentException("Message key can not be null");
|
||||
}
|
||||
|
||||
String message = RESOURCE_BUNDLE.getString(key);
|
||||
|
||||
if (message == null) {
|
||||
message = "Missing error message for key '" + key + "'";
|
||||
}
|
||||
|
||||
return MessageFormat.format(message, args);
|
||||
} catch (MissingResourceException e) {
|
||||
return '!' + key + '!';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Dis-allow construction ...
|
||||
*/
|
||||
private Messages() {
|
||||
}
|
||||
}
|
||||
+82
@@ -0,0 +1,82 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 2021, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package com.mysql.cj;
|
||||
|
||||
import java.util.Properties;
|
||||
|
||||
import com.mysql.cj.conf.PropertySet;
|
||||
import com.mysql.cj.exceptions.ExceptionInterceptor;
|
||||
import com.mysql.cj.protocol.ServerSessionStateController;
|
||||
|
||||
public interface MysqlConnection {
|
||||
|
||||
PropertySet getPropertySet();
|
||||
|
||||
/**
|
||||
* Creates an IO channel to the server.
|
||||
*
|
||||
* @param isForReconnect
|
||||
* is this request for a re-connect
|
||||
*/
|
||||
void createNewIO(boolean isForReconnect);
|
||||
|
||||
long getId();
|
||||
|
||||
/**
|
||||
* Returns the parsed and passed in properties for this connection.
|
||||
*
|
||||
* @return {@link Properties}
|
||||
*/
|
||||
Properties getProperties();
|
||||
|
||||
Object getConnectionMutex();
|
||||
|
||||
Session getSession();
|
||||
|
||||
String getURL();
|
||||
|
||||
String getUser();
|
||||
|
||||
ExceptionInterceptor getExceptionInterceptor();
|
||||
|
||||
void checkClosed();
|
||||
|
||||
void normalClose();
|
||||
|
||||
/**
|
||||
* Destroys this connection and any underlying resources.
|
||||
*
|
||||
* @param whyCleanedUp
|
||||
* exception caused the connection clean up
|
||||
*/
|
||||
void cleanup(Throwable whyCleanedUp);
|
||||
|
||||
ServerSessionStateController getServerSessionStateController();
|
||||
}
|
||||
+1034
File diff suppressed because it is too large
Load Diff
+596
@@ -0,0 +1,596 @@
|
||||
/*
|
||||
* Copyright (c) 2017, 2020, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package com.mysql.cj;
|
||||
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import com.mysql.cj.conf.PropertyKey;
|
||||
import com.mysql.cj.exceptions.ExceptionFactory;
|
||||
import com.mysql.cj.exceptions.WrongArgumentException;
|
||||
import com.mysql.cj.util.StringUtils;
|
||||
|
||||
/**
|
||||
* Represents the "parsed" state of a prepared query, with the statement broken up into its static and dynamic (where parameters are bound) parts.
|
||||
*/
|
||||
public class ParseInfo {
|
||||
|
||||
protected static final String[] ON_DUPLICATE_KEY_UPDATE_CLAUSE = new String[] { "ON", "DUPLICATE", "KEY", "UPDATE" };
|
||||
|
||||
private char firstStmtChar = 0;
|
||||
|
||||
private boolean foundLoadData = false;
|
||||
|
||||
long lastUsed = 0;
|
||||
|
||||
int statementLength = 0;
|
||||
|
||||
int statementStartPos = 0;
|
||||
|
||||
boolean canRewriteAsMultiValueInsert = false;
|
||||
|
||||
byte[][] staticSql = null;
|
||||
|
||||
boolean hasPlaceholders = false;
|
||||
|
||||
public int numberOfQueries = 1;
|
||||
|
||||
boolean isOnDuplicateKeyUpdate = false;
|
||||
|
||||
int locationOfOnDuplicateKeyUpdate = -1;
|
||||
|
||||
String valuesClause;
|
||||
|
||||
boolean parametersInDuplicateKeyClause = false;
|
||||
|
||||
String charEncoding;
|
||||
|
||||
private ParseInfo batchHead;
|
||||
|
||||
private ParseInfo batchValues;
|
||||
|
||||
private ParseInfo batchODKUClause;
|
||||
|
||||
private ParseInfo(byte[][] staticSql, char firstStmtChar, boolean foundLoadData, boolean isOnDuplicateKeyUpdate, int locationOfOnDuplicateKeyUpdate,
|
||||
int statementLength, int statementStartPos) {
|
||||
this.firstStmtChar = firstStmtChar;
|
||||
this.foundLoadData = foundLoadData;
|
||||
this.isOnDuplicateKeyUpdate = isOnDuplicateKeyUpdate;
|
||||
this.locationOfOnDuplicateKeyUpdate = locationOfOnDuplicateKeyUpdate;
|
||||
this.statementLength = statementLength;
|
||||
this.statementStartPos = statementStartPos;
|
||||
this.staticSql = staticSql;
|
||||
}
|
||||
|
||||
public ParseInfo(String sql, Session session, String encoding) {
|
||||
this(sql, session, encoding, true);
|
||||
}
|
||||
|
||||
public ParseInfo(String sql, Session session, String encoding, boolean buildRewriteInfo) {
|
||||
|
||||
try {
|
||||
if (sql == null) {
|
||||
throw ExceptionFactory.createException(WrongArgumentException.class, Messages.getString("PreparedStatement.61"),
|
||||
session.getExceptionInterceptor());
|
||||
}
|
||||
|
||||
this.charEncoding = encoding;
|
||||
this.lastUsed = System.currentTimeMillis();
|
||||
|
||||
String quotedIdentifierString = session.getIdentifierQuoteString();
|
||||
|
||||
char quotedIdentifierChar = 0;
|
||||
|
||||
if ((quotedIdentifierString != null) && !quotedIdentifierString.equals(" ") && (quotedIdentifierString.length() > 0)) {
|
||||
quotedIdentifierChar = quotedIdentifierString.charAt(0);
|
||||
}
|
||||
|
||||
this.statementLength = sql.length();
|
||||
|
||||
ArrayList<int[]> endpointList = new ArrayList<>();
|
||||
boolean inQuotes = false;
|
||||
char quoteChar = 0;
|
||||
boolean inQuotedId = false;
|
||||
int lastParmEnd = 0;
|
||||
int i;
|
||||
|
||||
boolean noBackslashEscapes = session.getServerSession().isNoBackslashEscapesSet();
|
||||
|
||||
// we're not trying to be real pedantic here, but we'd like to skip comments at the beginning of statements, as frameworks such as Hibernate
|
||||
// use them to aid in debugging
|
||||
|
||||
this.statementStartPos = findStartOfStatement(sql);
|
||||
|
||||
for (i = this.statementStartPos; i < this.statementLength; ++i) {
|
||||
char c = sql.charAt(i);
|
||||
|
||||
if ((this.firstStmtChar == 0) && Character.isLetter(c)) {
|
||||
// Determine what kind of statement we're doing (_S_elect, _I_nsert, etc.)
|
||||
this.firstStmtChar = Character.toUpperCase(c);
|
||||
|
||||
// no need to search for "ON DUPLICATE KEY UPDATE" if not an INSERT statement
|
||||
if (this.firstStmtChar == 'I') {
|
||||
this.locationOfOnDuplicateKeyUpdate = getOnDuplicateKeyLocation(sql,
|
||||
session.getPropertySet().getBooleanProperty(PropertyKey.dontCheckOnDuplicateKeyUpdateInSQL).getValue(),
|
||||
session.getPropertySet().getBooleanProperty(PropertyKey.rewriteBatchedStatements).getValue(),
|
||||
session.getServerSession().isNoBackslashEscapesSet());
|
||||
this.isOnDuplicateKeyUpdate = this.locationOfOnDuplicateKeyUpdate != -1;
|
||||
}
|
||||
}
|
||||
|
||||
if (!noBackslashEscapes && c == '\\' && i < (this.statementLength - 1)) {
|
||||
i++;
|
||||
continue; // next character is escaped
|
||||
}
|
||||
|
||||
// are we in a quoted identifier? (only valid when the id is not inside a 'string')
|
||||
if (!inQuotes && (quotedIdentifierChar != 0) && (c == quotedIdentifierChar)) {
|
||||
inQuotedId = !inQuotedId;
|
||||
} else if (!inQuotedId) {
|
||||
// only respect quotes when not in a quoted identifier
|
||||
|
||||
if (inQuotes) {
|
||||
if (((c == '\'') || (c == '"')) && c == quoteChar) {
|
||||
if (i < (this.statementLength - 1) && sql.charAt(i + 1) == quoteChar) {
|
||||
i++;
|
||||
continue; // inline quote escape
|
||||
}
|
||||
|
||||
inQuotes = !inQuotes;
|
||||
quoteChar = 0;
|
||||
} else if (((c == '\'') || (c == '"')) && c == quoteChar) {
|
||||
inQuotes = !inQuotes;
|
||||
quoteChar = 0;
|
||||
}
|
||||
} else {
|
||||
if (c == '#' || (c == '-' && (i + 1) < this.statementLength && sql.charAt(i + 1) == '-')) {
|
||||
// run out to end of statement, or newline, whichever comes first
|
||||
int endOfStmt = this.statementLength - 1;
|
||||
|
||||
for (; i < endOfStmt; i++) {
|
||||
c = sql.charAt(i);
|
||||
|
||||
if (c == '\r' || c == '\n') {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
continue;
|
||||
} else if (c == '/' && (i + 1) < this.statementLength) {
|
||||
// Comment?
|
||||
char cNext = sql.charAt(i + 1);
|
||||
|
||||
if (cNext == '*') {
|
||||
i += 2;
|
||||
|
||||
for (int j = i; j < this.statementLength; j++) {
|
||||
i++;
|
||||
cNext = sql.charAt(j);
|
||||
|
||||
if (cNext == '*' && (j + 1) < this.statementLength) {
|
||||
if (sql.charAt(j + 1) == '/') {
|
||||
i++;
|
||||
|
||||
if (i < this.statementLength) {
|
||||
c = sql.charAt(i);
|
||||
}
|
||||
|
||||
break; // comment done
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if ((c == '\'') || (c == '"')) {
|
||||
inQuotes = true;
|
||||
quoteChar = c;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!inQuotes && !inQuotedId) {
|
||||
if ((c == '?')) {
|
||||
endpointList.add(new int[] { lastParmEnd, i });
|
||||
lastParmEnd = i + 1;
|
||||
|
||||
if (this.isOnDuplicateKeyUpdate && i > this.locationOfOnDuplicateKeyUpdate) {
|
||||
this.parametersInDuplicateKeyClause = true;
|
||||
}
|
||||
} else if (c == ';') {
|
||||
int j = i + 1;
|
||||
if (j < this.statementLength) {
|
||||
for (; j < this.statementLength; j++) {
|
||||
if (!Character.isWhitespace(sql.charAt(j))) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (j < this.statementLength) {
|
||||
this.numberOfQueries++;
|
||||
}
|
||||
i = j - 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (this.firstStmtChar == 'L') {
|
||||
if (StringUtils.startsWithIgnoreCaseAndWs(sql, "LOAD DATA")) {
|
||||
this.foundLoadData = true;
|
||||
} else {
|
||||
this.foundLoadData = false;
|
||||
}
|
||||
} else {
|
||||
this.foundLoadData = false;
|
||||
}
|
||||
|
||||
endpointList.add(new int[] { lastParmEnd, this.statementLength });
|
||||
this.staticSql = new byte[endpointList.size()][];
|
||||
this.hasPlaceholders = this.staticSql.length > 1;
|
||||
|
||||
for (i = 0; i < this.staticSql.length; i++) {
|
||||
int[] ep = endpointList.get(i);
|
||||
int end = ep[1];
|
||||
int begin = ep[0];
|
||||
int len = end - begin;
|
||||
|
||||
if (this.foundLoadData) {
|
||||
this.staticSql[i] = StringUtils.getBytes(sql, begin, len);
|
||||
} else if (encoding == null) {
|
||||
byte[] buf = new byte[len];
|
||||
|
||||
for (int j = 0; j < len; j++) {
|
||||
buf[j] = (byte) sql.charAt(begin + j);
|
||||
}
|
||||
|
||||
this.staticSql[i] = buf;
|
||||
} else {
|
||||
this.staticSql[i] = StringUtils.getBytes(sql, begin, len, encoding);
|
||||
}
|
||||
}
|
||||
} catch (StringIndexOutOfBoundsException oobEx) {
|
||||
throw ExceptionFactory.createException(WrongArgumentException.class, Messages.getString("PreparedStatement.62", new Object[] { sql }), oobEx,
|
||||
session.getExceptionInterceptor());
|
||||
}
|
||||
|
||||
if (buildRewriteInfo) {
|
||||
this.canRewriteAsMultiValueInsert = this.numberOfQueries == 1 && !this.parametersInDuplicateKeyClause
|
||||
&& canRewrite(sql, this.isOnDuplicateKeyUpdate, this.locationOfOnDuplicateKeyUpdate, this.statementStartPos);
|
||||
if (this.canRewriteAsMultiValueInsert && session.getPropertySet().getBooleanProperty(PropertyKey.rewriteBatchedStatements).getValue()) {
|
||||
buildRewriteBatchedParams(sql, session, encoding);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public byte[][] getStaticSql() {
|
||||
return this.staticSql;
|
||||
}
|
||||
|
||||
public String getValuesClause() {
|
||||
return this.valuesClause;
|
||||
}
|
||||
|
||||
public int getLocationOfOnDuplicateKeyUpdate() {
|
||||
return this.locationOfOnDuplicateKeyUpdate;
|
||||
}
|
||||
|
||||
public boolean canRewriteAsMultiValueInsertAtSqlLevel() {
|
||||
return this.canRewriteAsMultiValueInsert;
|
||||
}
|
||||
|
||||
public boolean containsOnDuplicateKeyUpdateInSQL() {
|
||||
return this.isOnDuplicateKeyUpdate;
|
||||
}
|
||||
|
||||
private void buildRewriteBatchedParams(String sql, Session session, String encoding) {
|
||||
this.valuesClause = extractValuesClause(sql, session.getIdentifierQuoteString());
|
||||
String odkuClause = this.isOnDuplicateKeyUpdate ? sql.substring(this.locationOfOnDuplicateKeyUpdate) : null;
|
||||
|
||||
String headSql = null;
|
||||
|
||||
if (this.isOnDuplicateKeyUpdate) {
|
||||
headSql = sql.substring(0, this.locationOfOnDuplicateKeyUpdate);
|
||||
} else {
|
||||
headSql = sql;
|
||||
}
|
||||
|
||||
this.batchHead = new ParseInfo(headSql, session, encoding, false);
|
||||
this.batchValues = new ParseInfo("," + this.valuesClause, session, encoding, false);
|
||||
this.batchODKUClause = null;
|
||||
|
||||
if (odkuClause != null && odkuClause.length() > 0) {
|
||||
this.batchODKUClause = new ParseInfo("," + this.valuesClause + " " + odkuClause, session, encoding, false);
|
||||
}
|
||||
}
|
||||
|
||||
private String extractValuesClause(String sql, String quoteCharStr) {
|
||||
int indexOfValues = -1;
|
||||
int valuesSearchStart = this.statementStartPos;
|
||||
|
||||
while (indexOfValues == -1) {
|
||||
if (quoteCharStr.length() > 0) {
|
||||
indexOfValues = StringUtils.indexOfIgnoreCase(valuesSearchStart, sql, "VALUES", quoteCharStr, quoteCharStr,
|
||||
StringUtils.SEARCH_MODE__MRK_COM_WS);
|
||||
} else {
|
||||
indexOfValues = StringUtils.indexOfIgnoreCase(valuesSearchStart, sql, "VALUES");
|
||||
}
|
||||
|
||||
if (indexOfValues > 0) {
|
||||
/* check if the char immediately preceding VALUES may be part of the table name */
|
||||
char c = sql.charAt(indexOfValues - 1);
|
||||
if (!(Character.isWhitespace(c) || c == ')' || c == '`')) {
|
||||
valuesSearchStart = indexOfValues + 6;
|
||||
indexOfValues = -1;
|
||||
} else {
|
||||
/* check if the char immediately following VALUES may be whitespace or open parenthesis */
|
||||
c = sql.charAt(indexOfValues + 6);
|
||||
if (!(Character.isWhitespace(c) || c == '(')) {
|
||||
valuesSearchStart = indexOfValues + 6;
|
||||
indexOfValues = -1;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (indexOfValues == -1) {
|
||||
return null;
|
||||
}
|
||||
|
||||
int indexOfFirstParen = sql.indexOf('(', indexOfValues + 6);
|
||||
|
||||
if (indexOfFirstParen == -1) {
|
||||
return null;
|
||||
}
|
||||
|
||||
int endOfValuesClause = this.isOnDuplicateKeyUpdate ? this.locationOfOnDuplicateKeyUpdate : sql.length();
|
||||
|
||||
return sql.substring(indexOfFirstParen, endOfValuesClause);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a ParseInfo for a multi-value INSERT for a batch of size numBatch (without parsing!).
|
||||
*
|
||||
* @param numBatch
|
||||
* number of batched parameters
|
||||
* @return {@link ParseInfo}
|
||||
*/
|
||||
public synchronized ParseInfo getParseInfoForBatch(int numBatch) {
|
||||
AppendingBatchVisitor apv = new AppendingBatchVisitor();
|
||||
buildInfoForBatch(numBatch, apv);
|
||||
|
||||
ParseInfo batchParseInfo = new ParseInfo(apv.getStaticSqlStrings(), this.firstStmtChar, this.foundLoadData, this.isOnDuplicateKeyUpdate,
|
||||
this.locationOfOnDuplicateKeyUpdate, this.statementLength, this.statementStartPos);
|
||||
|
||||
return batchParseInfo;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a preparable SQL string for the number of batched parameters; used by server-side prepared statements
|
||||
* when re-writing batch INSERTs.
|
||||
*
|
||||
* @param numBatch
|
||||
* number of batched parameters
|
||||
* @return SQL string
|
||||
* @throws UnsupportedEncodingException
|
||||
* if an error occurs
|
||||
*/
|
||||
public String getSqlForBatch(int numBatch) throws UnsupportedEncodingException {
|
||||
ParseInfo batchInfo = getParseInfoForBatch(numBatch);
|
||||
|
||||
return batchInfo.getSqlForBatch();
|
||||
}
|
||||
|
||||
/**
|
||||
* Used for filling in the SQL for getPreparedSql() - for debugging
|
||||
*
|
||||
* @return sql string
|
||||
* @throws UnsupportedEncodingException
|
||||
* if an error occurs
|
||||
*/
|
||||
public String getSqlForBatch() throws UnsupportedEncodingException {
|
||||
int size = 0;
|
||||
final byte[][] sqlStrings = this.staticSql;
|
||||
final int sqlStringsLength = sqlStrings.length;
|
||||
|
||||
for (int i = 0; i < sqlStringsLength; i++) {
|
||||
size += sqlStrings[i].length;
|
||||
size++; // for the '?'
|
||||
}
|
||||
|
||||
StringBuilder buf = new StringBuilder(size);
|
||||
|
||||
for (int i = 0; i < sqlStringsLength - 1; i++) {
|
||||
buf.append(StringUtils.toString(sqlStrings[i], this.charEncoding));
|
||||
buf.append("?");
|
||||
}
|
||||
|
||||
buf.append(StringUtils.toString(sqlStrings[sqlStringsLength - 1]));
|
||||
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds a ParseInfo for the given batch size, without parsing. We use
|
||||
* a visitor pattern here, because the if {}s make computing a size for the
|
||||
* resultant byte[][] make this too complex, and we don't necessarily want to
|
||||
* use a List for this, because the size can be dynamic, and thus we'll not be
|
||||
* able to guess a good initial size for an array-based list, and it's not
|
||||
* efficient to convert a LinkedList to an array.
|
||||
*
|
||||
* @param numBatch
|
||||
* number of batched parameters
|
||||
* @param visitor
|
||||
* visitor
|
||||
*/
|
||||
private void buildInfoForBatch(int numBatch, BatchVisitor visitor) {
|
||||
if (!this.hasPlaceholders) {
|
||||
if (numBatch == 1) {
|
||||
// ParseInfo for a multi-value INSERT that doesn't have any placeholder may require two or more batches (depends on if ODKU is present or not).
|
||||
// The original sql should be able to handle it.
|
||||
visitor.append(this.staticSql[0]);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Without placeholders, only the values segment of the query needs repeating.
|
||||
|
||||
final byte[] headStaticSql = this.batchHead.staticSql[0];
|
||||
visitor.append(headStaticSql).increment();
|
||||
|
||||
int numValueRepeats = numBatch - 1; // First one is in the "head".
|
||||
if (this.batchODKUClause != null) {
|
||||
numValueRepeats--; // Last one is in the ODKU clause.
|
||||
}
|
||||
|
||||
final byte[] valuesStaticSql = this.batchValues.staticSql[0];
|
||||
for (int i = 0; i < numValueRepeats; i++) {
|
||||
visitor.mergeWithLast(valuesStaticSql).increment();
|
||||
}
|
||||
|
||||
if (this.batchODKUClause != null) {
|
||||
final byte[] batchOdkuStaticSql = this.batchODKUClause.staticSql[0];
|
||||
visitor.mergeWithLast(batchOdkuStaticSql).increment();
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Placeholders require assembling all the parts in each segment of the query and repeat them as needed.
|
||||
|
||||
// Add the head section except the last part.
|
||||
final byte[][] headStaticSql = this.batchHead.staticSql;
|
||||
final int headStaticSqlLength = headStaticSql.length;
|
||||
byte[] endOfHead = headStaticSql[headStaticSqlLength - 1];
|
||||
|
||||
for (int i = 0; i < headStaticSqlLength - 1; i++) {
|
||||
visitor.append(headStaticSql[i]).increment();
|
||||
}
|
||||
|
||||
// Repeat the values section as many times as needed.
|
||||
int numValueRepeats = numBatch - 1; // First one is in the "head".
|
||||
if (this.batchODKUClause != null) {
|
||||
numValueRepeats--; // Last one is in the ODKU clause.
|
||||
}
|
||||
|
||||
final byte[][] valuesStaticSql = this.batchValues.staticSql;
|
||||
final int valuesStaticSqlLength = valuesStaticSql.length;
|
||||
byte[] beginOfValues = valuesStaticSql[0];
|
||||
byte[] endOfValues = valuesStaticSql[valuesStaticSqlLength - 1];
|
||||
|
||||
for (int i = 0; i < numValueRepeats; i++) {
|
||||
visitor.merge(endOfValues, beginOfValues).increment();
|
||||
for (int j = 1; j < valuesStaticSqlLength - 1; j++) {
|
||||
visitor.append(valuesStaticSql[j]).increment();
|
||||
}
|
||||
}
|
||||
|
||||
// Append the last value and/or ending.
|
||||
if (this.batchODKUClause != null) {
|
||||
final byte[][] batchOdkuStaticSql = this.batchODKUClause.staticSql;
|
||||
final int batchOdkuStaticSqlLength = batchOdkuStaticSql.length;
|
||||
byte[] beginOfOdku = batchOdkuStaticSql[0];
|
||||
byte[] endOfOdku = batchOdkuStaticSql[batchOdkuStaticSqlLength - 1];
|
||||
|
||||
if (numBatch > 1) {
|
||||
visitor.merge(numValueRepeats > 0 ? endOfValues : endOfHead, beginOfOdku).increment();
|
||||
for (int i = 1; i < batchOdkuStaticSqlLength; i++) {
|
||||
visitor.append(batchOdkuStaticSql[i]).increment();
|
||||
}
|
||||
} else {
|
||||
visitor.append(endOfOdku).increment();
|
||||
}
|
||||
} else {
|
||||
visitor.append(endOfHead);
|
||||
}
|
||||
}
|
||||
|
||||
protected static int findStartOfStatement(String sql) {
|
||||
int statementStartPos = 0;
|
||||
|
||||
if (StringUtils.startsWithIgnoreCaseAndWs(sql, "/*")) {
|
||||
statementStartPos = sql.indexOf("*/");
|
||||
|
||||
if (statementStartPos == -1) {
|
||||
statementStartPos = 0;
|
||||
} else {
|
||||
statementStartPos += 2;
|
||||
}
|
||||
} else if (StringUtils.startsWithIgnoreCaseAndWs(sql, "--") || StringUtils.startsWithIgnoreCaseAndWs(sql, "#")) {
|
||||
statementStartPos = sql.indexOf('\n');
|
||||
|
||||
if (statementStartPos == -1) {
|
||||
statementStartPos = sql.indexOf('\r');
|
||||
|
||||
if (statementStartPos == -1) {
|
||||
statementStartPos = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return statementStartPos;
|
||||
}
|
||||
|
||||
public static int getOnDuplicateKeyLocation(String sql, boolean dontCheckOnDuplicateKeyUpdateInSQL, boolean rewriteBatchedStatements,
|
||||
boolean noBackslashEscapes) {
|
||||
return dontCheckOnDuplicateKeyUpdateInSQL && !rewriteBatchedStatements ? -1 : StringUtils.indexOfIgnoreCase(0, sql, ON_DUPLICATE_KEY_UPDATE_CLAUSE,
|
||||
"\"'`", "\"'`", noBackslashEscapes ? StringUtils.SEARCH_MODE__MRK_COM_WS : StringUtils.SEARCH_MODE__ALL);
|
||||
}
|
||||
|
||||
protected static boolean canRewrite(String sql, boolean isOnDuplicateKeyUpdate, int locationOfOnDuplicateKeyUpdate, int statementStartPos) {
|
||||
// Needs to be INSERT or REPLACE.
|
||||
// Can't have INSERT ... SELECT or INSERT ... ON DUPLICATE KEY UPDATE with an id=LAST_INSERT_ID(...).
|
||||
|
||||
if (StringUtils.startsWithIgnoreCaseAndWs(sql, "INSERT", statementStartPos)) {
|
||||
if (StringUtils.indexOfIgnoreCase(statementStartPos, sql, "SELECT", "\"'`", "\"'`", StringUtils.SEARCH_MODE__MRK_COM_WS) != -1) {
|
||||
return false;
|
||||
}
|
||||
if (isOnDuplicateKeyUpdate) {
|
||||
int updateClausePos = StringUtils.indexOfIgnoreCase(locationOfOnDuplicateKeyUpdate, sql, " UPDATE ");
|
||||
if (updateClausePos != -1) {
|
||||
return StringUtils.indexOfIgnoreCase(updateClausePos, sql, "LAST_INSERT_ID", "\"'`", "\"'`", StringUtils.SEARCH_MODE__MRK_COM_WS) == -1;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
return StringUtils.startsWithIgnoreCaseAndWs(sql, "REPLACE", statementStartPos)
|
||||
&& StringUtils.indexOfIgnoreCase(statementStartPos, sql, "SELECT", "\"'`", "\"'`", StringUtils.SEARCH_MODE__MRK_COM_WS) == -1;
|
||||
}
|
||||
|
||||
public boolean isFoundLoadData() {
|
||||
return this.foundLoadData;
|
||||
}
|
||||
|
||||
public char getFirstStmtChar() {
|
||||
return this.firstStmtChar;
|
||||
}
|
||||
|
||||
}
|
||||
+96
@@ -0,0 +1,96 @@
|
||||
/*
|
||||
* Copyright (c) 2012, 2020, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package com.mysql.cj;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
import com.mysql.cj.util.LRUCache;
|
||||
|
||||
public class PerConnectionLRUFactory implements CacheAdapterFactory<String, ParseInfo> {
|
||||
|
||||
public CacheAdapter<String, ParseInfo> getInstance(Object syncMutex, String url, int cacheMaxSize, int maxKeySize) {
|
||||
|
||||
return new PerConnectionLRU(syncMutex, cacheMaxSize, maxKeySize);
|
||||
}
|
||||
|
||||
class PerConnectionLRU implements CacheAdapter<String, ParseInfo> {
|
||||
private final int cacheSqlLimit;
|
||||
private final LRUCache<String, ParseInfo> cache;
|
||||
private final Object syncMutex;
|
||||
|
||||
protected PerConnectionLRU(Object syncMutex, int cacheMaxSize, int maxKeySize) {
|
||||
final int cacheSize = cacheMaxSize;
|
||||
this.cacheSqlLimit = maxKeySize;
|
||||
this.cache = new LRUCache<>(cacheSize);
|
||||
this.syncMutex = syncMutex;
|
||||
}
|
||||
|
||||
public ParseInfo get(String key) {
|
||||
if (key == null || key.length() > this.cacheSqlLimit) {
|
||||
return null;
|
||||
}
|
||||
|
||||
synchronized (this.syncMutex) {
|
||||
return this.cache.get(key);
|
||||
}
|
||||
}
|
||||
|
||||
public void put(String key, ParseInfo value) {
|
||||
if (key == null || key.length() > this.cacheSqlLimit) {
|
||||
return;
|
||||
}
|
||||
|
||||
synchronized (this.syncMutex) {
|
||||
this.cache.put(key, value);
|
||||
}
|
||||
}
|
||||
|
||||
public void invalidate(String key) {
|
||||
synchronized (this.syncMutex) {
|
||||
this.cache.remove(key);
|
||||
}
|
||||
}
|
||||
|
||||
public void invalidateAll(Set<String> keys) {
|
||||
synchronized (this.syncMutex) {
|
||||
for (String key : keys) {
|
||||
this.cache.remove(key);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void invalidateAll() {
|
||||
synchronized (this.syncMutex) {
|
||||
this.cache.clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
/*
|
||||
* Copyright (c) 2007, 2020, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package com.mysql.cj;
|
||||
|
||||
public interface PingTarget {
|
||||
|
||||
void doPing() throws Exception;
|
||||
|
||||
}
|
||||
+67
@@ -0,0 +1,67 @@
|
||||
/*
|
||||
* Copyright (c) 2017, 2020, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package com.mysql.cj;
|
||||
|
||||
import com.mysql.cj.protocol.Message;
|
||||
|
||||
public interface PreparedQuery<T extends QueryBindings<?>> extends Query {
|
||||
|
||||
ParseInfo getParseInfo();
|
||||
|
||||
void setParseInfo(ParseInfo parseInfo);
|
||||
|
||||
void checkNullOrEmptyQuery(String sql);
|
||||
|
||||
String getOriginalSql();
|
||||
|
||||
void setOriginalSql(String originalSql);
|
||||
|
||||
int getParameterCount();
|
||||
|
||||
void setParameterCount(int parameterCount);
|
||||
|
||||
public T getQueryBindings();
|
||||
|
||||
public void setQueryBindings(T queryBindings);
|
||||
|
||||
int computeBatchSize(int numBatchedArgs);
|
||||
|
||||
int getBatchCommandIndex();
|
||||
|
||||
void setBatchCommandIndex(int batchCommandIndex);
|
||||
|
||||
String asSql();
|
||||
|
||||
String asSql(boolean quoteStreamsAndUnknowns);
|
||||
|
||||
<M extends Message> M fillSendPacket();
|
||||
|
||||
<M extends Message> M fillSendPacket(QueryBindings<?> bindings);
|
||||
}
|
||||
+118
@@ -0,0 +1,118 @@
|
||||
/*
|
||||
* Copyright (c) 2017, 2021, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package com.mysql.cj;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
import com.mysql.cj.protocol.Message;
|
||||
import com.mysql.cj.protocol.ProtocolEntityFactory;
|
||||
import com.mysql.cj.protocol.Resultset;
|
||||
|
||||
public interface Query {
|
||||
|
||||
public enum CancelStatus {
|
||||
NOT_CANCELED, CANCELED_BY_USER, CANCELED_BY_TIMEOUT;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the query id used when profiling
|
||||
*
|
||||
* @return id
|
||||
*/
|
||||
int getId();
|
||||
|
||||
void setCancelStatus(CancelStatus cs);
|
||||
|
||||
void checkCancelTimeout();
|
||||
|
||||
<T extends Resultset, M extends Message> ProtocolEntityFactory<T, M> getResultSetFactory();
|
||||
|
||||
Session getSession();
|
||||
|
||||
Object getCancelTimeoutMutex();
|
||||
|
||||
void resetCancelledState();
|
||||
|
||||
void closeQuery();
|
||||
|
||||
void addBatch(Object batch);
|
||||
|
||||
/**
|
||||
* Get the batched args as added by the addBatch method(s).
|
||||
* The list is unmodifiable and might contain any combination of String,
|
||||
* ClientPreparedQueryBindings, or ServerPreparedQueryBindings depending on how the parameters were
|
||||
* batched.
|
||||
*
|
||||
* @return an unmodifiable List of batched args
|
||||
*/
|
||||
List<Object> getBatchedArgs();
|
||||
|
||||
void clearBatchedArgs();
|
||||
|
||||
QueryAttributesBindings getQueryAttributesBindings();
|
||||
|
||||
int getResultFetchSize();
|
||||
|
||||
void setResultFetchSize(int fetchSize);
|
||||
|
||||
Resultset.Type getResultType();
|
||||
|
||||
void setResultType(Resultset.Type resultSetType);
|
||||
|
||||
int getTimeoutInMillis();
|
||||
|
||||
void setTimeoutInMillis(int timeoutInMillis);
|
||||
|
||||
void setExecuteTime(long executeTime);
|
||||
|
||||
/**
|
||||
* Returns the elapsed time for the server to execute the query.
|
||||
*
|
||||
* @return the time it took for the server to execute the query.
|
||||
*/
|
||||
long getExecuteTime();
|
||||
|
||||
CancelQueryTask startQueryTimer(Query stmtToCancel, int timeout);
|
||||
|
||||
AtomicBoolean getStatementExecuting();
|
||||
|
||||
String getCurrentDatabase();
|
||||
|
||||
void setCurrentDatabase(String currentDb);
|
||||
|
||||
boolean isClearWarningsCalled();
|
||||
|
||||
void setClearWarningsCalled(boolean clearWarningsCalled);
|
||||
|
||||
void statementBegins();
|
||||
|
||||
void stopQueryTimer(CancelQueryTask timeoutTask, boolean rethrowCancelReason, boolean checkCancelTimeout);
|
||||
}
|
||||
+76
@@ -0,0 +1,76 @@
|
||||
/*
|
||||
* Copyright (c) 2021, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package com.mysql.cj;
|
||||
|
||||
/**
|
||||
* An internal representation of a query attribute bind value.
|
||||
*
|
||||
*/
|
||||
public interface QueryAttributesBindValue {
|
||||
/**
|
||||
* Checks whether this query attribute is the <code>null</code> value.
|
||||
*
|
||||
* @return
|
||||
* <code>true</code> if this query attribute value is <code>null</code>.
|
||||
*/
|
||||
boolean isNull();
|
||||
|
||||
/**
|
||||
* Gets the name of this query attribute.
|
||||
*
|
||||
* @return
|
||||
* the name of this query attribute.
|
||||
*/
|
||||
String getName();
|
||||
|
||||
/**
|
||||
* Gets the type of this query attribute. Query attributes types are one of the {@link MysqlType}.FIELD_TYPE_*.
|
||||
*
|
||||
* @return
|
||||
* the type of this query attribute.
|
||||
*/
|
||||
int getType();
|
||||
|
||||
/**
|
||||
* Gets the value of this query attribute.
|
||||
*
|
||||
* @return
|
||||
* the value of this query attribute.
|
||||
*/
|
||||
Object getValue();
|
||||
|
||||
/**
|
||||
* Gets the length of this query attribute.
|
||||
*
|
||||
* @return
|
||||
* the expected length, in Bytes, of this query attribute value after being encoded.
|
||||
*/
|
||||
long getBoundLength();
|
||||
}
|
||||
+83
@@ -0,0 +1,83 @@
|
||||
/*
|
||||
* Copyright (c) 2021, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package com.mysql.cj;
|
||||
|
||||
import java.sql.Statement;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
/**
|
||||
* Instances of this interface keep the list of query attributes assigned to a {@link Statement} object.
|
||||
*/
|
||||
public interface QueryAttributesBindings {
|
||||
/**
|
||||
* Adds a new query attribute to the list of query attributes. Implementations must validate the type of the given the object and reject it or replace it by
|
||||
* another representation if not supported, by its String version, for example. Query attribute names are not checked for duplication.
|
||||
*
|
||||
* @param name
|
||||
* the query attribute name.
|
||||
*
|
||||
* @param value
|
||||
* the query attribute value.
|
||||
*/
|
||||
void setAttribute(String name, Object value);
|
||||
|
||||
/**
|
||||
* Get the count of query attributes in the list.
|
||||
*
|
||||
* @return
|
||||
* the number of query attributes existing in the list.
|
||||
*/
|
||||
int getCount();
|
||||
|
||||
/**
|
||||
* Returns an internal representation of the query attribute in the given position of the query attributes list. It's implementation dependent what to do
|
||||
* when the index value is invalid.
|
||||
*
|
||||
* @param index
|
||||
* the position of the query attribute value to return.
|
||||
*
|
||||
* @return
|
||||
* the {@link QueryAttributesBindValue} in the given position of the query attributes list.
|
||||
*/
|
||||
QueryAttributesBindValue getAttributeValue(int index);
|
||||
|
||||
/**
|
||||
* Runs through all query attributes while feeding the given {@link Consumer} with each one of them.
|
||||
*
|
||||
* @param bindAttribute
|
||||
* A {@link Consumer} for each one of the single query attributes.
|
||||
*/
|
||||
void runThroughAll(Consumer<QueryAttributesBindValue> bindAttribute);
|
||||
|
||||
/**
|
||||
* Removes all query attributes from the query attributes list.
|
||||
*/
|
||||
void clearAttributes();
|
||||
}
|
||||
+239
@@ -0,0 +1,239 @@
|
||||
/*
|
||||
* Copyright (c) 2017, 2021, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package com.mysql.cj;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.io.Reader;
|
||||
import java.math.BigDecimal;
|
||||
import java.math.BigInteger;
|
||||
import java.sql.Clob;
|
||||
import java.sql.Date;
|
||||
import java.sql.NClob;
|
||||
import java.sql.Time;
|
||||
import java.sql.Timestamp;
|
||||
import java.time.Duration;
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.LocalTime;
|
||||
import java.util.Calendar;
|
||||
|
||||
import com.mysql.cj.protocol.ColumnDefinition;
|
||||
|
||||
public interface QueryBindings<T extends BindValue> {
|
||||
|
||||
QueryBindings<T> clone();
|
||||
|
||||
void setColumnDefinition(ColumnDefinition colDef);
|
||||
|
||||
boolean isLoadDataQuery();
|
||||
|
||||
void setLoadDataQuery(boolean isLoadDataQuery);
|
||||
|
||||
T[] getBindValues();
|
||||
|
||||
void setBindValues(T[] bindValues);
|
||||
|
||||
/**
|
||||
*
|
||||
* @return true if bind values had long data
|
||||
*/
|
||||
boolean clearBindValues();
|
||||
|
||||
void checkParameterSet(int columnIndex);
|
||||
|
||||
void checkAllParametersSet();
|
||||
|
||||
int getNumberOfExecutions();
|
||||
|
||||
void setNumberOfExecutions(int numberOfExecutions);
|
||||
|
||||
void setValue(int paramIndex, byte[] val, MysqlType type);
|
||||
|
||||
void setValue(int paramIndex, String val, MysqlType type);
|
||||
|
||||
// Array getArray(int parameterIndex);
|
||||
|
||||
void setAsciiStream(int parameterIndex, InputStream x);
|
||||
|
||||
void setAsciiStream(int parameterIndex, InputStream x, int length);
|
||||
|
||||
void setAsciiStream(int parameterIndex, InputStream x, long length);
|
||||
|
||||
// InputStream getAsciiStream(int parameterIndex);
|
||||
|
||||
void setBigDecimal(int parameterIndex, BigDecimal x);
|
||||
|
||||
// BigDecimal getBigDecimal(int parameterIndex);
|
||||
|
||||
void setBigInteger(int parameterIndex, BigInteger x);
|
||||
|
||||
// BigInteger getBigInteger(int parameterIndex);
|
||||
|
||||
void setBinaryStream(int parameterIndex, InputStream x);
|
||||
|
||||
void setBinaryStream(int parameterIndex, InputStream x, int length);
|
||||
|
||||
void setBinaryStream(int parameterIndex, InputStream x, long length);
|
||||
|
||||
// InputStream getBinaryStream(int parameterIndex);
|
||||
|
||||
void setBlob(int parameterIndex, java.sql.Blob x);
|
||||
|
||||
void setBlob(int parameterIndex, InputStream inputStream);
|
||||
|
||||
void setBlob(int parameterIndex, InputStream inputStream, long length);
|
||||
|
||||
// java.sql.Blob getBlob(int parameterIndex);
|
||||
|
||||
void setBoolean(int parameterIndex, boolean x);
|
||||
|
||||
// boolean getBoolean(int parameterIndex);
|
||||
|
||||
void setByte(int parameterIndex, byte x);
|
||||
|
||||
// byte getByte(int parameterIndex);
|
||||
|
||||
void setBytes(int parameterIndex, byte[] x);
|
||||
|
||||
void setBytes(int parameterIndex, byte[] x, boolean checkForIntroducer, boolean escapeForMBChars);
|
||||
|
||||
void setBytesNoEscape(int parameterIndex, byte[] parameterAsBytes);
|
||||
|
||||
void setBytesNoEscapeNoQuotes(int parameterIndex, byte[] parameterAsBytes);
|
||||
|
||||
// byte[] getBytes(int parameterIndex);
|
||||
|
||||
void setCharacterStream(int parameterIndex, Reader reader);
|
||||
|
||||
void setCharacterStream(int parameterIndex, Reader reader, int length);
|
||||
|
||||
void setCharacterStream(int parameterIndex, Reader reader, long length);
|
||||
|
||||
// Reader getCharacterStream(int parameterIndex);
|
||||
|
||||
void setClob(int i, Clob x);
|
||||
|
||||
void setClob(int parameterIndex, Reader reader);
|
||||
|
||||
void setClob(int parameterIndex, Reader reader, long length);
|
||||
|
||||
// Clob getClob(int parameterIndex);
|
||||
|
||||
void setDate(int parameterIndex, Date x);
|
||||
|
||||
void setDate(int parameterIndex, Date x, Calendar cal);
|
||||
|
||||
// Date getDate(int parameterIndex);
|
||||
|
||||
void setDouble(int parameterIndex, double x);
|
||||
|
||||
// double getDouble(int parameterIndex)
|
||||
|
||||
void setFloat(int parameterIndex, float x);
|
||||
|
||||
// float getFloat(int parameterIndex);
|
||||
|
||||
void setInt(int parameterIndex, int x);
|
||||
|
||||
// int getInt(int parameterIndex);
|
||||
|
||||
void setLong(int parameterIndex, long x);
|
||||
|
||||
// long getLong(int parameterIndex);
|
||||
|
||||
void setNCharacterStream(int parameterIndex, Reader value);
|
||||
|
||||
void setNCharacterStream(int parameterIndex, Reader reader, long length);
|
||||
|
||||
// Reader getNCharacterStream(int parameterIndex);
|
||||
|
||||
void setNClob(int parameterIndex, Reader reader);
|
||||
|
||||
void setNClob(int parameterIndex, Reader reader, long length);
|
||||
|
||||
void setNClob(int parameterIndex, NClob value);
|
||||
|
||||
// Reader getNClob(int parameterIndex);
|
||||
|
||||
void setNString(int parameterIndex, String x);
|
||||
|
||||
void setNull(int parameterIndex);
|
||||
|
||||
boolean isNull(int parameterIndex);
|
||||
|
||||
void setObject(int parameterIndex, Object parameterObj);
|
||||
|
||||
void setObject(int parameterIndex, Object parameterObj, MysqlType targetMysqlType);
|
||||
|
||||
void setObject(int parameterIndex, Object parameterObj, MysqlType targetMysqlType, int scaleOrLength);
|
||||
|
||||
// Object getObject(int parameterIndex);
|
||||
|
||||
// Ref getRef(int parameterIndex);
|
||||
|
||||
void setShort(int parameterIndex, short x);
|
||||
|
||||
// short getShort(int parameterIndex);
|
||||
|
||||
void setString(int parameterIndex, String x);
|
||||
|
||||
// String getString(int parameterIndex);
|
||||
|
||||
void setTime(int parameterIndex, Time x);
|
||||
|
||||
void setTime(int parameterIndex, Time x, Calendar cal);
|
||||
|
||||
// Time getTime(int parameterIndex);
|
||||
|
||||
void setTimestamp(int parameterIndex, Timestamp x, Calendar cal, MysqlType targetMysqlType);
|
||||
|
||||
void setTimestamp(int parameterIndex, Timestamp x, MysqlType targetMysqlType);
|
||||
|
||||
void setTimestamp(int parameterIndex, Timestamp x, Calendar targetCalendar, int fractionalLength, MysqlType targetMysqlType);
|
||||
|
||||
void bindTimestamp(int parameterIndex, Timestamp x, Calendar targetCalendar, int fractionalLength, MysqlType targetMysqlType);
|
||||
|
||||
// Timestamp getTimestamp(int parameterIndex);
|
||||
|
||||
// URL getURL(int parameterIndex);
|
||||
|
||||
byte[] getBytesRepresentation(int parameterIndex);
|
||||
|
||||
byte[] getOrigBytes(int parameterIndex);
|
||||
|
||||
void setLocalDate(int parameterIndex, LocalDate x, MysqlType targetMysqlType);
|
||||
|
||||
void setLocalTime(int parameterIndex, LocalTime x, MysqlType targetMysqlType);
|
||||
|
||||
void setLocalDateTime(int parameterIndex, LocalDateTime x, MysqlType targetMysqlType);
|
||||
|
||||
void setDuration(int parameterIndex, Duration x, MysqlType targetMysqlType);
|
||||
|
||||
}
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
/*
|
||||
* Copyright (c) 2018, 2020, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package com.mysql.cj;
|
||||
|
||||
public interface QueryResult {
|
||||
|
||||
}
|
||||
+166
@@ -0,0 +1,166 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 2020, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package com.mysql.cj;
|
||||
|
||||
/**
|
||||
* A server version.
|
||||
*/
|
||||
public class ServerVersion implements Comparable<ServerVersion> {
|
||||
private String completeVersion;
|
||||
private Integer major;
|
||||
private Integer minor;
|
||||
private Integer subminor;
|
||||
|
||||
public ServerVersion(String completeVersion, int major, int minor, int subminor) {
|
||||
this.completeVersion = completeVersion;
|
||||
this.major = major;
|
||||
this.minor = minor;
|
||||
this.subminor = subminor;
|
||||
}
|
||||
|
||||
public ServerVersion(int major, int minor, int subminor) {
|
||||
this(null, major, minor, subminor);
|
||||
}
|
||||
|
||||
public int getMajor() {
|
||||
return this.major;
|
||||
}
|
||||
|
||||
public int getMinor() {
|
||||
return this.minor;
|
||||
}
|
||||
|
||||
public int getSubminor() {
|
||||
return this.subminor;
|
||||
}
|
||||
|
||||
/**
|
||||
* A string representation of this version. If this version was parsed from, or provided with, a "complete" string which may contain more than just the
|
||||
* version number, this string is returned verbatim. Otherwise, a string representation of the version numbers is given.
|
||||
*
|
||||
* @return string version representation
|
||||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
if (this.completeVersion != null) {
|
||||
return this.completeVersion;
|
||||
}
|
||||
return String.format("%d.%d.%d", this.major, this.minor, this.subminor);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj) {
|
||||
return true;
|
||||
}
|
||||
if (obj == null || !ServerVersion.class.isAssignableFrom(obj.getClass())) {
|
||||
return false;
|
||||
}
|
||||
ServerVersion another = (ServerVersion) obj;
|
||||
if (this.getMajor() != another.getMajor() || this.getMinor() != another.getMinor() || this.getSubminor() != another.getSubminor()) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int hash = 23;
|
||||
hash += 19 * hash + this.major;
|
||||
hash += 19 * hash + this.minor;
|
||||
hash += 19 * hash + this.subminor;
|
||||
return hash;
|
||||
}
|
||||
|
||||
public int compareTo(ServerVersion other) {
|
||||
int c;
|
||||
if ((c = this.major.compareTo(other.getMajor())) != 0) {
|
||||
return c;
|
||||
} else if ((c = this.minor.compareTo(other.getMinor())) != 0) {
|
||||
return c;
|
||||
}
|
||||
return this.subminor.compareTo(other.getSubminor());
|
||||
}
|
||||
|
||||
/**
|
||||
* Does this version meet the minimum specified by `min'?
|
||||
*
|
||||
* @param min
|
||||
* The minimum version to compare against.
|
||||
* @return true if version meets the minimum specified by `min'
|
||||
*/
|
||||
public boolean meetsMinimum(ServerVersion min) {
|
||||
return compareTo(min) >= 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse the server version into major/minor/subminor.
|
||||
*
|
||||
* @param versionString
|
||||
* string version representation
|
||||
* @return {@link ServerVersion}
|
||||
*/
|
||||
public static ServerVersion parseVersion(final String versionString) {
|
||||
int point = versionString.indexOf('.');
|
||||
|
||||
if (point != -1) {
|
||||
try {
|
||||
int serverMajorVersion = Integer.parseInt(versionString.substring(0, point));
|
||||
|
||||
String remaining = versionString.substring(point + 1, versionString.length());
|
||||
point = remaining.indexOf('.');
|
||||
|
||||
if (point != -1) {
|
||||
int serverMinorVersion = Integer.parseInt(remaining.substring(0, point));
|
||||
|
||||
remaining = remaining.substring(point + 1, remaining.length());
|
||||
|
||||
int pos = 0;
|
||||
|
||||
while (pos < remaining.length()) {
|
||||
if ((remaining.charAt(pos) < '0') || (remaining.charAt(pos) > '9')) {
|
||||
break;
|
||||
}
|
||||
|
||||
pos++;
|
||||
}
|
||||
|
||||
int serverSubminorVersion = Integer.parseInt(remaining.substring(0, pos));
|
||||
|
||||
return new ServerVersion(versionString, serverMajorVersion, serverMinorVersion, serverSubminorVersion);
|
||||
}
|
||||
} catch (NumberFormatException NFE1) {
|
||||
}
|
||||
}
|
||||
|
||||
// can't parse the server version
|
||||
return new ServerVersion(0, 0, 0);
|
||||
}
|
||||
}
|
||||
+222
@@ -0,0 +1,222 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 2020, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package com.mysql.cj;
|
||||
|
||||
import java.net.SocketAddress;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.function.Function;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.stream.Collector;
|
||||
|
||||
import com.mysql.cj.conf.HostInfo;
|
||||
import com.mysql.cj.conf.PropertySet;
|
||||
import com.mysql.cj.exceptions.CJOperationNotSupportedException;
|
||||
import com.mysql.cj.exceptions.ExceptionFactory;
|
||||
import com.mysql.cj.exceptions.ExceptionInterceptor;
|
||||
import com.mysql.cj.log.Log;
|
||||
import com.mysql.cj.log.ProfilerEventHandler;
|
||||
import com.mysql.cj.protocol.Message;
|
||||
import com.mysql.cj.protocol.Protocol;
|
||||
import com.mysql.cj.protocol.ResultBuilder;
|
||||
import com.mysql.cj.protocol.ServerSession;
|
||||
import com.mysql.cj.result.Row;
|
||||
|
||||
/**
|
||||
* {@link Session} exposes logical level which user API uses internally to call {@link Protocol} methods.
|
||||
* It's a higher-level abstraction than MySQL server session ({@link ServerSession}). {@link Protocol} and {@link ServerSession} methods
|
||||
* should never be used directly from user API.
|
||||
*
|
||||
*/
|
||||
public interface Session {
|
||||
|
||||
PropertySet getPropertySet();
|
||||
|
||||
<M extends Message> MessageBuilder<M> getMessageBuilder();
|
||||
|
||||
/**
|
||||
* Re-authenticates as the given user and password
|
||||
*
|
||||
* @param userName
|
||||
* DB user name
|
||||
* @param password
|
||||
* DB user password
|
||||
* @param database
|
||||
* database name
|
||||
*
|
||||
*/
|
||||
void changeUser(String userName, String password, String database);
|
||||
|
||||
ExceptionInterceptor getExceptionInterceptor();
|
||||
|
||||
void setExceptionInterceptor(ExceptionInterceptor exceptionInterceptor);
|
||||
|
||||
/**
|
||||
* Log-off of the MySQL server and close the socket.
|
||||
*
|
||||
*/
|
||||
void quit();
|
||||
|
||||
/**
|
||||
* Clobbers the physical network connection and marks this session as closed.
|
||||
*/
|
||||
void forceClose();
|
||||
|
||||
/**
|
||||
* Does the version of the MySQL server we are connected to meet the given
|
||||
* minimums?
|
||||
*
|
||||
* @param major
|
||||
* major version number
|
||||
* @param minor
|
||||
* minor version number
|
||||
* @param subminor
|
||||
* sub-minor version number
|
||||
* @return true if current server version equal or higher than provided one
|
||||
*/
|
||||
boolean versionMeetsMinimum(int major, int minor, int subminor);
|
||||
|
||||
long getThreadId();
|
||||
|
||||
boolean isSetNeededForAutoCommitMode(boolean autoCommitFlag);
|
||||
|
||||
/**
|
||||
* Returns the log mechanism that should be used to log information from/for this Session.
|
||||
*
|
||||
* @return the Log instance to use for logging messages.
|
||||
*/
|
||||
Log getLog();
|
||||
|
||||
/**
|
||||
* Returns the current ProfilerEventHandler or initializes a new one if none exists.
|
||||
*
|
||||
* @return the {@link ProfilerEventHandler} object.
|
||||
*/
|
||||
ProfilerEventHandler getProfilerEventHandler();
|
||||
|
||||
HostInfo getHostInfo();
|
||||
|
||||
String getQueryTimingUnits();
|
||||
|
||||
ServerSession getServerSession();
|
||||
|
||||
boolean isSSLEstablished();
|
||||
|
||||
SocketAddress getRemoteSocketAddress();
|
||||
|
||||
String getProcessHost();
|
||||
|
||||
/**
|
||||
* Add listener for this session status changes.
|
||||
*
|
||||
* @param l
|
||||
* {@link SessionEventListener} instance.
|
||||
*/
|
||||
void addListener(SessionEventListener l);
|
||||
|
||||
/**
|
||||
* Remove session listener.
|
||||
*
|
||||
* @param l
|
||||
* {@link SessionEventListener} instance.
|
||||
*/
|
||||
void removeListener(SessionEventListener l);
|
||||
|
||||
public static interface SessionEventListener {
|
||||
void handleNormalClose();
|
||||
|
||||
void handleReconnect();
|
||||
|
||||
void handleCleanup(Throwable whyCleanedUp);
|
||||
}
|
||||
|
||||
boolean isClosed();
|
||||
|
||||
String getIdentifierQuoteString();
|
||||
|
||||
DataStoreMetadata getDataStoreMetadata();
|
||||
|
||||
/**
|
||||
* Synchronously query database with applying rows filtering and mapping.
|
||||
*
|
||||
* @param message
|
||||
* query message
|
||||
* @param rowFilter
|
||||
* row filter function
|
||||
* @param rowMapper
|
||||
* row map function
|
||||
* @param collector
|
||||
* result collector
|
||||
* @param <M>
|
||||
* Message type
|
||||
* @param <R>
|
||||
* Row type
|
||||
* @param <RES>
|
||||
* Result type
|
||||
* @return List of rows
|
||||
*/
|
||||
default <M extends Message, R, RES> RES query(M message, Predicate<Row> rowFilter, Function<Row, R> rowMapper, Collector<R, ?, RES> collector) {
|
||||
throw ExceptionFactory.createException(CJOperationNotSupportedException.class, "Not supported");
|
||||
}
|
||||
|
||||
/**
|
||||
* Synchronously query database.
|
||||
*
|
||||
* @param message
|
||||
* query message
|
||||
* @param resultBuilder
|
||||
* ResultBuilder instance
|
||||
* @param <M>
|
||||
* Message type
|
||||
* @param <R>
|
||||
* Result type
|
||||
* @return {@link QueryResult} object
|
||||
*/
|
||||
default <M extends Message, R extends QueryResult> R query(M message, ResultBuilder<R> resultBuilder) {
|
||||
throw ExceptionFactory.createException(CJOperationNotSupportedException.class, "Not supported");
|
||||
}
|
||||
|
||||
/**
|
||||
* Asynchronously query database.
|
||||
*
|
||||
* @param message
|
||||
* query message
|
||||
* @param resultBuilder
|
||||
* ResultBuilder instance
|
||||
* @param <M>
|
||||
* Message type
|
||||
* @param <R>
|
||||
* Result type
|
||||
* @return CompletableFuture providing a {@link QueryResult} object
|
||||
*/
|
||||
default <M extends Message, R extends QueryResult> CompletableFuture<R> queryAsync(M message, ResultBuilder<R> resultBuilder) {
|
||||
throw ExceptionFactory.createException(CJOperationNotSupportedException.class, "Not supported");
|
||||
}
|
||||
|
||||
}
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
* Copyright (c) 2017, 2020, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package com.mysql.cj;
|
||||
|
||||
public interface TransactionEventHandler {
|
||||
|
||||
void transactionBegun();
|
||||
|
||||
void transactionCompleted();
|
||||
}
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 2020, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package com.mysql.cj;
|
||||
|
||||
/**
|
||||
* A warning listener is notified of warnings as they happen throughout the driver. They can be queued for consumption by JDBC clients, thrown as exceptions, or
|
||||
* ignored.
|
||||
*/
|
||||
public interface WarningListener {
|
||||
void warningEncountered(String warning);
|
||||
}
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
* Copyright (c) 2020, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package com.mysql.cj.callback;
|
||||
|
||||
/**
|
||||
* Implementations of this interface can be passed to a {@link MysqlCallbackHandler} so that the owner of the callback handler and its caller can share data in
|
||||
* a way that would otherwise require tight coupling.
|
||||
*/
|
||||
public interface MysqlCallback {
|
||||
}
|
||||
+57
@@ -0,0 +1,57 @@
|
||||
/*
|
||||
* Copyright (c) 2020, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package com.mysql.cj.callback;
|
||||
|
||||
/**
|
||||
* A functional interface for implementing callback handlers.
|
||||
*
|
||||
* The single method {@link MysqlCallbackHandler#handle(MysqlCallback)} is called by the classes where the callback handler is passed when they need to share
|
||||
* data with the caller. The kind of data to exchange depends on the implementations of {@link MysqlCallback} they choose to use.
|
||||
*/
|
||||
@FunctionalInterface
|
||||
public interface MysqlCallbackHandler {
|
||||
/**
|
||||
* Exchanges information between the caller of this method and the owner of the {@link MysqlCallbackHandler} instance. The method can be called multiple
|
||||
* times with different callback implementations to exchange different types of information. A typical {@link MysqlCallbackHandler} implementation looks
|
||||
* like:
|
||||
*
|
||||
* <pre>
|
||||
* private MysqlCallbackHandler callbackHandler = (cb) -> {
|
||||
* if (cb instanceof UsernameCallback) {
|
||||
* this.username = ((UsernameCallback) cb).getUsername();
|
||||
* }
|
||||
* };
|
||||
* </pre>
|
||||
*
|
||||
* @param cb
|
||||
*
|
||||
*/
|
||||
void handle(MysqlCallback cb);
|
||||
}
|
||||
+51
@@ -0,0 +1,51 @@
|
||||
/*
|
||||
* Copyright (c) 2020, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package com.mysql.cj.callback;
|
||||
|
||||
/**
|
||||
* A callback that can be used to exchange username information to a callback handler owner.
|
||||
*/
|
||||
public class UsernameCallback implements MysqlCallback {
|
||||
private String username;
|
||||
|
||||
public UsernameCallback(String username) {
|
||||
this.username = username;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the username provided by the caller of {@link MysqlCallbackHandler#handle(MysqlCallback)}.
|
||||
*
|
||||
* @return
|
||||
* the username to pass over to the callback handler.
|
||||
*/
|
||||
public String getUsername() {
|
||||
return this.username;
|
||||
}
|
||||
}
|
||||
+52
@@ -0,0 +1,52 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2020, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package com.mysql.cj.conf;
|
||||
|
||||
import java.util.Properties;
|
||||
|
||||
/**
|
||||
* Implement this interface, and pass the class name as the 'propertiesTransform' property in your URL, and the driver will pass the properties it has
|
||||
* parsed to your transform implementation so that you can modify/substitute/add any that you desire.
|
||||
*/
|
||||
public interface ConnectionPropertiesTransform {
|
||||
/**
|
||||
* The driver will call this method if the user has loaded your
|
||||
* implementation of this interface by specifying the 'propertiesTransform'
|
||||
* property in their URL.
|
||||
*
|
||||
* @param props
|
||||
* the properties as passed by the driver (never null)
|
||||
*
|
||||
* @return the same properties with any transformations that your
|
||||
* implementation has made
|
||||
*
|
||||
*/
|
||||
Properties transformProperties(Properties props);
|
||||
}
|
||||
+830
@@ -0,0 +1,830 @@
|
||||
/*
|
||||
* Copyright (c) 2016, 2021, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package com.mysql.cj.conf;
|
||||
|
||||
import static com.mysql.cj.util.StringUtils.isNullOrEmpty;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.sql.DriverManager;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
import java.util.TreeMap;
|
||||
import java.util.concurrent.locks.ReadWriteLock;
|
||||
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import javax.naming.NamingException;
|
||||
|
||||
import com.mysql.cj.Messages;
|
||||
import com.mysql.cj.exceptions.CJException;
|
||||
import com.mysql.cj.exceptions.ExceptionFactory;
|
||||
import com.mysql.cj.exceptions.InvalidConnectionAttributeException;
|
||||
import com.mysql.cj.exceptions.UnsupportedConnectionStringException;
|
||||
import com.mysql.cj.exceptions.WrongArgumentException;
|
||||
import com.mysql.cj.util.DnsSrv;
|
||||
import com.mysql.cj.util.DnsSrv.SrvRecord;
|
||||
import com.mysql.cj.util.LRUCache;
|
||||
import com.mysql.cj.util.Util;
|
||||
|
||||
/**
|
||||
* A container for a database URL and a collection of given connection arguments.
|
||||
* The connection string is parsed and split by its components, each of which is then processed and fixed according to the needs of the connection type.
|
||||
* This abstract class holds all common behavior to all connection string types. Its subclasses must implement their own specifics such as classifying hosts by
|
||||
* type or apply validation rules.
|
||||
*/
|
||||
public abstract class ConnectionUrl implements DatabaseUrlContainer {
|
||||
public static final String DEFAULT_HOST = "localhost";
|
||||
public static final int DEFAULT_PORT = 3306;
|
||||
|
||||
private static final LRUCache<String, ConnectionUrl> connectionUrlCache = new LRUCache<>(100);
|
||||
private static final ReadWriteLock rwLock = new ReentrantReadWriteLock();
|
||||
|
||||
/**
|
||||
* The rules describing the number of hosts a database URL may contain.
|
||||
*/
|
||||
public enum HostsCardinality {
|
||||
SINGLE {
|
||||
@Override
|
||||
public boolean assertSize(int n) {
|
||||
return n == 1;
|
||||
}
|
||||
},
|
||||
MULTIPLE {
|
||||
@Override
|
||||
public boolean assertSize(int n) {
|
||||
return n > 1;
|
||||
}
|
||||
},
|
||||
ONE_OR_MORE {
|
||||
@Override
|
||||
public boolean assertSize(int n) {
|
||||
return n >= 1;
|
||||
}
|
||||
};
|
||||
|
||||
public abstract boolean assertSize(int n);
|
||||
}
|
||||
|
||||
/**
|
||||
* The database URL type which is determined by the scheme section of the connection string.
|
||||
*/
|
||||
public enum Type {
|
||||
// DNS SRV schemes (cardinality is validated by implementing classes):
|
||||
FAILOVER_DNS_SRV_CONNECTION("jdbc:mysql+srv:", HostsCardinality.ONE_OR_MORE, "com.mysql.cj.conf.url.FailoverDnsSrvConnectionUrl"), //
|
||||
LOADBALANCE_DNS_SRV_CONNECTION("jdbc:mysql+srv:loadbalance:", HostsCardinality.ONE_OR_MORE, "com.mysql.cj.conf.url.LoadBalanceDnsSrvConnectionUrl"), //
|
||||
REPLICATION_DNS_SRV_CONNECTION("jdbc:mysql+srv:replication:", HostsCardinality.ONE_OR_MORE, "com.mysql.cj.conf.url.ReplicationDnsSrvConnectionUrl"), //
|
||||
XDEVAPI_DNS_SRV_SESSION("mysqlx+srv:", HostsCardinality.ONE_OR_MORE, "com.mysql.cj.conf.url.XDevApiDnsSrvConnectionUrl"), //
|
||||
// Standard schemes:
|
||||
SINGLE_CONNECTION("jdbc:mysql:", HostsCardinality.SINGLE, "com.mysql.cj.conf.url.SingleConnectionUrl", PropertyKey.dnsSrv, FAILOVER_DNS_SRV_CONNECTION), //
|
||||
FAILOVER_CONNECTION("jdbc:mysql:", HostsCardinality.MULTIPLE, "com.mysql.cj.conf.url.FailoverConnectionUrl", PropertyKey.dnsSrv,
|
||||
FAILOVER_DNS_SRV_CONNECTION), //
|
||||
LOADBALANCE_CONNECTION("jdbc:mysql:loadbalance:", HostsCardinality.ONE_OR_MORE, "com.mysql.cj.conf.url.LoadBalanceConnectionUrl", PropertyKey.dnsSrv,
|
||||
LOADBALANCE_DNS_SRV_CONNECTION), //
|
||||
REPLICATION_CONNECTION("jdbc:mysql:replication:", HostsCardinality.ONE_OR_MORE, "com.mysql.cj.conf.url.ReplicationConnectionUrl", PropertyKey.dnsSrv,
|
||||
REPLICATION_DNS_SRV_CONNECTION), //
|
||||
XDEVAPI_SESSION("mysqlx:", HostsCardinality.ONE_OR_MORE, "com.mysql.cj.conf.url.XDevApiConnectionUrl", PropertyKey.xdevapiDnsSrv,
|
||||
XDEVAPI_DNS_SRV_SESSION);
|
||||
|
||||
private String scheme;
|
||||
private HostsCardinality cardinality;
|
||||
private String implementingClass;
|
||||
private PropertyKey dnsSrvPropertyKey;
|
||||
private Type alternateDnsSrvType;
|
||||
|
||||
private Type(String scheme, HostsCardinality cardinality, String implementingClass) {
|
||||
this(scheme, cardinality, implementingClass, null, null);
|
||||
}
|
||||
|
||||
private Type(String scheme, HostsCardinality cardinality, String implementingClass, PropertyKey dnsSrvPropertyKey, Type alternateDnsSrvType) {
|
||||
this.scheme = scheme;
|
||||
this.cardinality = cardinality;
|
||||
this.implementingClass = implementingClass;
|
||||
this.dnsSrvPropertyKey = dnsSrvPropertyKey;
|
||||
this.alternateDnsSrvType = alternateDnsSrvType;
|
||||
}
|
||||
|
||||
public String getScheme() {
|
||||
return this.scheme;
|
||||
}
|
||||
|
||||
public HostsCardinality getCardinality() {
|
||||
return this.cardinality;
|
||||
}
|
||||
|
||||
public String getImplementingClass() {
|
||||
return this.implementingClass;
|
||||
}
|
||||
|
||||
public PropertyKey getDnsSrvPropertyKey() {
|
||||
return this.dnsSrvPropertyKey;
|
||||
}
|
||||
|
||||
public Type getAlternateDnsSrvType() {
|
||||
return this.alternateDnsSrvType;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the {@link Type} corresponding to the given scheme and number of hosts, if any.
|
||||
* Otherwise throws an {@link UnsupportedConnectionStringException}.
|
||||
* Calling this method with the argument n lower than 0 skips the hosts cardinality validation.
|
||||
*
|
||||
* @param scheme
|
||||
* one of supported schemes
|
||||
* @param n
|
||||
* the number of hosts in the database URL
|
||||
* @return the {@link Type} corresponding to the given protocol and number of hosts
|
||||
*/
|
||||
public static Type fromValue(String scheme, int n) {
|
||||
for (Type t : values()) {
|
||||
if (t.getScheme().equalsIgnoreCase(scheme) && (n < 0 || t.getCardinality().assertSize(n))) {
|
||||
return t;
|
||||
}
|
||||
}
|
||||
if (n < 0) {
|
||||
throw ExceptionFactory.createException(UnsupportedConnectionStringException.class,
|
||||
Messages.getString("ConnectionString.5", new Object[] { scheme }));
|
||||
}
|
||||
throw ExceptionFactory.createException(UnsupportedConnectionStringException.class,
|
||||
Messages.getString("ConnectionString.6", new Object[] { scheme, n }));
|
||||
}
|
||||
|
||||
/**
|
||||
* Instantiates a class that implements the right type of connection URLs for the given {@link ConnectionUrlParser}.
|
||||
*
|
||||
* @param parser
|
||||
* the {@link ConnectionUrlParser} containing the URL components.
|
||||
* @param info
|
||||
* a connection properties map to add to the {@link ConnectionUrl} structure.
|
||||
* @return
|
||||
* an instance of {@link ConnectionUrl}.
|
||||
*/
|
||||
public static ConnectionUrl getConnectionUrlInstance(ConnectionUrlParser parser, Properties info) {
|
||||
int hostsCount = parser.getHosts().size();
|
||||
Type type = fromValue(parser.getScheme(), hostsCount);
|
||||
PropertyKey dnsSrvPropKey = type.getDnsSrvPropertyKey();
|
||||
Map<String, String> parsedProperties;
|
||||
|
||||
// Check if the Type must be replaced by a DNS SRV one.
|
||||
if (dnsSrvPropKey != null && type.getAlternateDnsSrvType() != null) {
|
||||
if (info != null && info.containsKey(dnsSrvPropKey.getKeyName())) { // Properties map prevails over connection string options.
|
||||
if ((Boolean) PropertyDefinitions.getPropertyDefinition(dnsSrvPropKey).parseObject(info.getProperty(dnsSrvPropKey.getKeyName()), null)) {
|
||||
type = fromValue(type.getAlternateDnsSrvType().getScheme(), hostsCount);
|
||||
}
|
||||
} else if ((parsedProperties = parser.getProperties()).containsKey(dnsSrvPropKey.getKeyName()) && (Boolean) PropertyDefinitions
|
||||
.getPropertyDefinition(dnsSrvPropKey).parseObject(parsedProperties.get(dnsSrvPropKey.getKeyName()), null)) {
|
||||
type = fromValue(type.getAlternateDnsSrvType().getScheme(), hostsCount);
|
||||
}
|
||||
}
|
||||
|
||||
return type.getImplementingInstance(parser, info);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the given scheme corresponds to one of the connection types the driver supports.
|
||||
*
|
||||
* @param scheme
|
||||
* scheme part from connection string, like "jdbc:mysql:"
|
||||
* @return true if the given scheme is supported by driver
|
||||
*/
|
||||
public static boolean isSupported(String scheme) {
|
||||
for (Type t : values()) {
|
||||
if (t.getScheme().equalsIgnoreCase(scheme)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Instantiates a class that implements this type of connection URLs with the given arguments.
|
||||
*
|
||||
* @param parser
|
||||
* the {@link ConnectionUrlParser} containing the URL components.
|
||||
* @param info
|
||||
* a connection properties map to add to the {@link ConnectionUrl} structure.
|
||||
* @return
|
||||
* an instance of {@link ConnectionUrl}.
|
||||
*/
|
||||
private ConnectionUrl getImplementingInstance(ConnectionUrlParser parser, Properties info) {
|
||||
return (ConnectionUrl) Util.getInstance(getImplementingClass(), new Class<?>[] { ConnectionUrlParser.class, Properties.class },
|
||||
new Object[] { parser, info }, null);
|
||||
}
|
||||
}
|
||||
|
||||
protected Type type;
|
||||
protected String originalConnStr;
|
||||
protected String originalDatabase;
|
||||
protected List<HostInfo> hosts = new ArrayList<>();
|
||||
protected Map<String, String> properties = new HashMap<>();
|
||||
ConnectionPropertiesTransform propertiesTransformer;
|
||||
|
||||
/**
|
||||
* Static factory method that returns either a new instance of a {@link ConnectionUrl} or a cached one.
|
||||
* Returns "null" it can't handle the connection string.
|
||||
*
|
||||
* @param connString
|
||||
* the connection string
|
||||
* @param info
|
||||
* the connection arguments map
|
||||
* @return an instance of a {@link ConnectionUrl} or "null" if isn't able to handle the connection string
|
||||
*/
|
||||
public static ConnectionUrl getConnectionUrlInstance(String connString, Properties info) {
|
||||
if (connString == null) {
|
||||
throw ExceptionFactory.createException(WrongArgumentException.class, Messages.getString("ConnectionString.0"));
|
||||
}
|
||||
String connStringCacheKey = buildConnectionStringCacheKey(connString, info);
|
||||
ConnectionUrl connectionUrl;
|
||||
|
||||
rwLock.readLock().lock();
|
||||
connectionUrl = connectionUrlCache.get(connStringCacheKey);
|
||||
if (connectionUrl == null) {
|
||||
rwLock.readLock().unlock();
|
||||
rwLock.writeLock().lock();
|
||||
try {
|
||||
// Check again, in the meantime it could have been cached by another thread.
|
||||
connectionUrl = connectionUrlCache.get(connStringCacheKey);
|
||||
if (connectionUrl == null) {
|
||||
ConnectionUrlParser connStrParser = ConnectionUrlParser.parseConnectionString(connString);
|
||||
connectionUrl = Type.getConnectionUrlInstance(connStrParser, info);
|
||||
connectionUrlCache.put(connStringCacheKey, connectionUrl);
|
||||
}
|
||||
rwLock.readLock().lock();
|
||||
} finally {
|
||||
rwLock.writeLock().unlock();
|
||||
}
|
||||
}
|
||||
rwLock.readLock().unlock();
|
||||
return connectionUrl;
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds a connection URL cache map key based on the connection string itself plus the string representation of the given connection properties.
|
||||
*
|
||||
* @param connString
|
||||
* the connection string
|
||||
* @param info
|
||||
* the connection arguments map
|
||||
* @return a connection string cache map key
|
||||
*/
|
||||
private static String buildConnectionStringCacheKey(String connString, Properties info) {
|
||||
StringBuilder sbKey = new StringBuilder(connString);
|
||||
sbKey.append("\u00A7"); // Section sign.
|
||||
sbKey.append(
|
||||
info == null ? null : info.stringPropertyNames().stream().map(k -> k + "=" + info.getProperty(k)).collect(Collectors.joining(", ", "{", "}")));
|
||||
return sbKey.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if this {@link ConnectionUrl} is able to process the given database URL.
|
||||
*
|
||||
* @param connString
|
||||
* the connection string
|
||||
* @return true if this class is able to process the given URL, false otherwise
|
||||
*/
|
||||
public static boolean acceptsUrl(String connString) {
|
||||
return ConnectionUrlParser.isConnectionStringSupported(connString);
|
||||
}
|
||||
|
||||
/**
|
||||
* Empty constructor. Required for subclasses initialization.
|
||||
*/
|
||||
protected ConnectionUrl() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor for unsupported URLs
|
||||
*
|
||||
* @param origUrl
|
||||
* URLs
|
||||
*/
|
||||
public ConnectionUrl(String origUrl) {
|
||||
this.originalConnStr = origUrl;
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs an instance of {@link ConnectionUrl}, performing all the required initializations.
|
||||
*
|
||||
* @param connStrParser
|
||||
* a {@link ConnectionUrlParser} instance containing the parsed version of the original connection string
|
||||
* @param info
|
||||
* the connection arguments map
|
||||
*/
|
||||
protected ConnectionUrl(ConnectionUrlParser connStrParser, Properties info) {
|
||||
this.originalConnStr = connStrParser.getDatabaseUrl();
|
||||
this.originalDatabase = connStrParser.getPath() == null ? "" : connStrParser.getPath();
|
||||
collectProperties(connStrParser, info); // Fill properties before filling hosts info.
|
||||
collectHostsInfo(connStrParser);
|
||||
}
|
||||
|
||||
/**
|
||||
* Joins the connection arguments from the connection string with the ones from the given connection arguments map collecting them in a single map.
|
||||
* Additionally may also collect other connection arguments from configuration files.
|
||||
*
|
||||
* @param connStrParser
|
||||
* the {@link ConnectionUrlParser} from where to collect the properties
|
||||
* @param info
|
||||
* the connection arguments map
|
||||
*/
|
||||
protected void collectProperties(ConnectionUrlParser connStrParser, Properties info) {
|
||||
// Fill in the properties from the connection string.
|
||||
connStrParser.getProperties().entrySet().stream().forEach(e -> this.properties.put(PropertyKey.normalizeCase(e.getKey()), e.getValue()));
|
||||
|
||||
// Properties passed in override the ones from the connection string.
|
||||
if (info != null) {
|
||||
info.stringPropertyNames().stream().forEach(k -> this.properties.put(PropertyKey.normalizeCase(k), info.getProperty(k)));
|
||||
}
|
||||
|
||||
// Collect properties from additional sources.
|
||||
setupPropertiesTransformer();
|
||||
expandPropertiesFromConfigFiles(this.properties);
|
||||
injectPerTypeProperties(this.properties);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets up the {@link ConnectionPropertiesTransform} if one was provided.
|
||||
*/
|
||||
protected void setupPropertiesTransformer() {
|
||||
String propertiesTransformClassName = this.properties.get(PropertyKey.propertiesTransform.getKeyName());
|
||||
if (!isNullOrEmpty(propertiesTransformClassName)) {
|
||||
try {
|
||||
this.propertiesTransformer = (ConnectionPropertiesTransform) Class.forName(propertiesTransformClassName).newInstance();
|
||||
} catch (InstantiationException | IllegalAccessException | ClassNotFoundException | CJException e) {
|
||||
throw ExceptionFactory.createException(InvalidConnectionAttributeException.class,
|
||||
Messages.getString("ConnectionString.9", new Object[] { propertiesTransformClassName, e.toString() }), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Expands the connection argument "useConfig" by reading the mentioned configuration files.
|
||||
*
|
||||
* @param props
|
||||
* a connection arguments map from where to read the "useConfig" property and where to save the loaded properties.
|
||||
*/
|
||||
protected void expandPropertiesFromConfigFiles(Map<String, String> props) {
|
||||
// Properties from config files should not override the existing ones.
|
||||
String configFiles = props.get(PropertyKey.useConfigs.getKeyName());
|
||||
if (!isNullOrEmpty(configFiles)) {
|
||||
Properties configProps = getPropertiesFromConfigFiles(configFiles);
|
||||
configProps.stringPropertyNames().stream().map(PropertyKey::normalizeCase).filter(k -> !props.containsKey(k))
|
||||
.forEach(k -> props.put(k, configProps.getProperty(k)));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a map containing the properties read from the given configuration files. Multiple files can be referenced using a comma as separator.
|
||||
*
|
||||
* @param configFiles
|
||||
* the list of the configuration files to read
|
||||
* @return the map containing all the properties read
|
||||
*/
|
||||
public static Properties getPropertiesFromConfigFiles(String configFiles) {
|
||||
Properties configProps = new Properties();
|
||||
for (String configFile : configFiles.split(",")) {
|
||||
try (InputStream configAsStream = ConnectionUrl.class.getResourceAsStream("/com/mysql/cj/configurations/" + configFile + ".properties")) {
|
||||
if (configAsStream == null) {
|
||||
throw ExceptionFactory.createException(InvalidConnectionAttributeException.class,
|
||||
Messages.getString("ConnectionString.10", new Object[] { configFile }));
|
||||
}
|
||||
configProps.load(configAsStream);
|
||||
} catch (IOException e) {
|
||||
throw ExceptionFactory.createException(InvalidConnectionAttributeException.class,
|
||||
Messages.getString("ConnectionString.11", new Object[] { configFile }), e);
|
||||
}
|
||||
}
|
||||
return configProps;
|
||||
}
|
||||
|
||||
/**
|
||||
* Subclasses must override this method if they need to inject additional properties in the connection arguments map while it's being constructed.
|
||||
*
|
||||
* @param props
|
||||
* the properties already containing all known connection arguments
|
||||
*/
|
||||
protected void injectPerTypeProperties(Map<String, String> props) {
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Some acceptable property values have changed in c/J 8.0 but old values remain hard-coded in widely used software.
|
||||
* So, old values must be accepted and translated to new ones.
|
||||
*
|
||||
* @param props
|
||||
* the host properties map to fix
|
||||
*/
|
||||
protected void replaceLegacyPropertyValues(Map<String, String> props) {
|
||||
// Workaround for zeroDateTimeBehavior=convertToNull hard-coded in NetBeans
|
||||
String zeroDateTimeBehavior = props.get(PropertyKey.zeroDateTimeBehavior.getKeyName());
|
||||
if (zeroDateTimeBehavior != null && zeroDateTimeBehavior.equalsIgnoreCase("convertToNull")) {
|
||||
props.put(PropertyKey.zeroDateTimeBehavior.getKeyName(), "CONVERT_TO_NULL");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Collects the hosts information from the {@link ConnectionUrlParser}.
|
||||
*
|
||||
* @param connStrParser
|
||||
* the {@link ConnectionUrlParser} from where to collect the hosts information
|
||||
*/
|
||||
protected void collectHostsInfo(ConnectionUrlParser connStrParser) {
|
||||
connStrParser.getHosts().stream().map(this::fixHostInfo).forEach(this.hosts::add);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fixes the host information by moving data around and filling in missing data.
|
||||
* Applies properties transformations to the collected properties if {@link ConnectionPropertiesTransform} was declared in the connection arguments.
|
||||
*
|
||||
* @param hi
|
||||
* the host information data to fix
|
||||
* @return a new {@link HostInfo} with all required data
|
||||
*/
|
||||
protected HostInfo fixHostInfo(HostInfo hi) {
|
||||
Map<String, String> hostProps = new HashMap<>();
|
||||
|
||||
// Add global connection arguments.
|
||||
hostProps.putAll(this.properties);
|
||||
// Add/override host specific connection arguments.
|
||||
hi.getHostProperties().entrySet().stream().forEach(e -> hostProps.put(PropertyKey.normalizeCase(e.getKey()), e.getValue()));
|
||||
// Add the database name
|
||||
if (!hostProps.containsKey(PropertyKey.DBNAME.getKeyName())) {
|
||||
hostProps.put(PropertyKey.DBNAME.getKeyName(), getDatabase());
|
||||
}
|
||||
|
||||
preprocessPerTypeHostProperties(hostProps);
|
||||
|
||||
String host = hostProps.remove(PropertyKey.HOST.getKeyName());
|
||||
if (!isNullOrEmpty(hi.getHost())) {
|
||||
host = hi.getHost();
|
||||
} else if (isNullOrEmpty(host)) {
|
||||
host = getDefaultHost();
|
||||
}
|
||||
|
||||
String portAsString = hostProps.remove(PropertyKey.PORT.getKeyName());
|
||||
int port = hi.getPort();
|
||||
if (port == HostInfo.NO_PORT && !isNullOrEmpty(portAsString)) {
|
||||
try {
|
||||
port = Integer.valueOf(portAsString);
|
||||
} catch (NumberFormatException e) {
|
||||
throw ExceptionFactory.createException(WrongArgumentException.class,
|
||||
Messages.getString("ConnectionString.7", new Object[] { hostProps.get(PropertyKey.PORT.getKeyName()) }), e);
|
||||
}
|
||||
}
|
||||
if (port == HostInfo.NO_PORT) {
|
||||
port = getDefaultPort();
|
||||
}
|
||||
|
||||
String user = hostProps.remove(PropertyKey.USER.getKeyName());
|
||||
if (!isNullOrEmpty(hi.getUser())) {
|
||||
user = hi.getUser();
|
||||
} else if (isNullOrEmpty(user)) {
|
||||
user = getDefaultUser();
|
||||
}
|
||||
|
||||
String password = hostProps.remove(PropertyKey.PASSWORD.getKeyName());
|
||||
if (!isNullOrEmpty(hi.getPassword())) {
|
||||
password = hi.getPassword();
|
||||
} else if (isNullOrEmpty(password)) {
|
||||
password = getDefaultPassword();
|
||||
}
|
||||
|
||||
expandPropertiesFromConfigFiles(hostProps);
|
||||
fixProtocolDependencies(hostProps);
|
||||
replaceLegacyPropertyValues(hostProps);
|
||||
|
||||
return buildHostInfo(host, port, user, password, hostProps);
|
||||
}
|
||||
|
||||
/**
|
||||
* Subclasses should override this to perform any required pre-processing on the host information properties.
|
||||
*
|
||||
* @param hostProps
|
||||
* the host properties map to process
|
||||
*/
|
||||
protected void preprocessPerTypeHostProperties(Map<String, String> hostProps) {
|
||||
// To be overridden in subclasses if needed.
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the default host. Subclasses must override this method if they have different default host value.
|
||||
*
|
||||
* @return the default host
|
||||
*/
|
||||
public String getDefaultHost() {
|
||||
return DEFAULT_HOST;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the default port. Subclasses must override this method if they have different default port value.
|
||||
*
|
||||
* @return the default port
|
||||
*/
|
||||
public int getDefaultPort() {
|
||||
return DEFAULT_PORT;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the default user. Usually the one provided in the method {@link DriverManager#getConnection(String, String, String)} or as connection argument.
|
||||
*
|
||||
* @return the default user
|
||||
*/
|
||||
public String getDefaultUser() {
|
||||
return this.properties.get(PropertyKey.USER.getKeyName());
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the default password. Usually the one provided in the method {@link DriverManager#getConnection(String, String, String)} or as connection
|
||||
* argument.
|
||||
*
|
||||
* @return the default password
|
||||
*/
|
||||
public String getDefaultPassword() {
|
||||
return this.properties.get(PropertyKey.PASSWORD.getKeyName());
|
||||
}
|
||||
|
||||
/**
|
||||
* Fixes the protocol (TCP vs PIPE) dependencies for the given host properties map.
|
||||
*
|
||||
* @param hostProps
|
||||
* the host properties map to fix
|
||||
*/
|
||||
protected void fixProtocolDependencies(Map<String, String> hostProps) {
|
||||
String protocol = hostProps.get(PropertyKey.PROTOCOL.getKeyName());
|
||||
if (!isNullOrEmpty(protocol) && protocol.equalsIgnoreCase("PIPE")) {
|
||||
if (!hostProps.containsKey(PropertyKey.socketFactory.getKeyName())) {
|
||||
hostProps.put(PropertyKey.socketFactory.getKeyName(), "com.mysql.cj.protocol.NamedPipeSocketFactory");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns this connection URL type.
|
||||
*
|
||||
* @return the connection URL type
|
||||
*/
|
||||
public Type getType() {
|
||||
return this.type;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the original database URL that produced this connection string.
|
||||
*
|
||||
* @return the original database URL
|
||||
*/
|
||||
@Override
|
||||
public String getDatabaseUrl() {
|
||||
return this.originalConnStr;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the database from this connection URL. Note that a "DBNAME" property overrides the database identified in the connection string.
|
||||
*
|
||||
* @return the database name
|
||||
*/
|
||||
public String getDatabase() {
|
||||
return this.properties.containsKey(PropertyKey.DBNAME.getKeyName()) ? this.properties.get(PropertyKey.DBNAME.getKeyName()) : this.originalDatabase;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the number of hosts in this connection URL.
|
||||
*
|
||||
* @return the number of hosts
|
||||
*/
|
||||
public int hostsCount() {
|
||||
return this.hosts.size();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the single or first host info structure.
|
||||
*
|
||||
* @return the first host info structure
|
||||
*/
|
||||
public HostInfo getMainHost() {
|
||||
return this.hosts.isEmpty() ? null : this.hosts.get(0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a list of the hosts in this connection URL.
|
||||
*
|
||||
* @return the hosts list from this connection URL
|
||||
*/
|
||||
public List<HostInfo> getHostsList() {
|
||||
return getHostsList(HostsListView.ALL);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a list of the hosts in this connection URL, filtered for the given view.
|
||||
*
|
||||
* By default returns all hosts. Subclasses should override this method in order to implement support for different views, usually by splitting the global
|
||||
* hosts into smaller sub-lists.
|
||||
*
|
||||
* @param view
|
||||
* the type of the view to use in the returned list of hosts. This argument is ignored in this implementation.
|
||||
* @return
|
||||
* the hosts list from this connection URL, filtered for the given view.
|
||||
*/
|
||||
public List<HostInfo> getHostsList(HostsListView view) {
|
||||
return Collections.unmodifiableList(this.hosts);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an existing host info with the same host:port part or spawns a new isolated host info based on this connection URL if none was found.
|
||||
*
|
||||
* @param hostPortPair
|
||||
* the host:port part to search for
|
||||
* @return the existing host info or a new independent one
|
||||
*/
|
||||
public HostInfo getHostOrSpawnIsolated(String hostPortPair) {
|
||||
return getHostOrSpawnIsolated(hostPortPair, this.hosts);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an existing host info with the same host:port part or spawns a new isolated host info based on this connection URL if none was found.
|
||||
*
|
||||
* @param hostPortPair
|
||||
* the host:port part to search for
|
||||
* @param hostsList
|
||||
* the hosts list from where to search the host list
|
||||
* @return the existing host info or a new independent one
|
||||
*/
|
||||
public HostInfo getHostOrSpawnIsolated(String hostPortPair, List<HostInfo> hostsList) {
|
||||
for (HostInfo hi : hostsList) {
|
||||
if (hostPortPair.equals(hi.getHostPortPair())) {
|
||||
return hi;
|
||||
}
|
||||
}
|
||||
|
||||
ConnectionUrlParser.Pair<String, Integer> hostAndPort = ConnectionUrlParser.parseHostPortPair(hostPortPair);
|
||||
String host = hostAndPort.left;
|
||||
Integer port = hostAndPort.right;
|
||||
String user = getDefaultUser();
|
||||
String password = getDefaultPassword();
|
||||
|
||||
return buildHostInfo(host, port, user, password, this.properties);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new {@link HostInfo} structure with the given components, passing through the properties transformer if there is one defined in this connection
|
||||
* string;
|
||||
*
|
||||
* @param host
|
||||
* the host
|
||||
* @param port
|
||||
* the port
|
||||
* @param user
|
||||
* the user name
|
||||
* @param password
|
||||
* the password
|
||||
* @param hostProps
|
||||
* the host properties map
|
||||
* @return a new instance of {@link HostInfo}
|
||||
*/
|
||||
protected HostInfo buildHostInfo(String host, int port, String user, String password, Map<String, String> hostProps) {
|
||||
// Apply properties transformations if needed.
|
||||
if (this.propertiesTransformer != null) {
|
||||
Properties props = new Properties();
|
||||
props.putAll(hostProps);
|
||||
|
||||
props.setProperty(PropertyKey.HOST.getKeyName(), host);
|
||||
props.setProperty(PropertyKey.PORT.getKeyName(), String.valueOf(port));
|
||||
if (user != null) {
|
||||
props.setProperty(PropertyKey.USER.getKeyName(), user);
|
||||
}
|
||||
if (password != null) {
|
||||
props.setProperty(PropertyKey.PASSWORD.getKeyName(), password);
|
||||
}
|
||||
|
||||
Properties transformedProps = this.propertiesTransformer.transformProperties(props);
|
||||
|
||||
host = transformedProps.getProperty(PropertyKey.HOST.getKeyName());
|
||||
try {
|
||||
port = Integer.parseInt(transformedProps.getProperty(PropertyKey.PORT.getKeyName()));
|
||||
} catch (NumberFormatException e) {
|
||||
throw ExceptionFactory.createException(WrongArgumentException.class, Messages.getString("ConnectionString.8",
|
||||
new Object[] { PropertyKey.PORT.getKeyName(), transformedProps.getProperty(PropertyKey.PORT.getKeyName()) }), e);
|
||||
}
|
||||
user = transformedProps.getProperty(PropertyKey.USER.getKeyName());
|
||||
password = transformedProps.getProperty(PropertyKey.PASSWORD.getKeyName());
|
||||
|
||||
Map<String, String> transformedHostProps = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
|
||||
transformedProps.stringPropertyNames().stream().forEach(k -> transformedHostProps.put(k, transformedProps.getProperty(k)));
|
||||
// Remove surplus keys.
|
||||
transformedHostProps.remove(PropertyKey.HOST.getKeyName());
|
||||
transformedHostProps.remove(PropertyKey.PORT.getKeyName());
|
||||
transformedHostProps.remove(PropertyKey.USER.getKeyName());
|
||||
transformedHostProps.remove(PropertyKey.PASSWORD.getKeyName());
|
||||
|
||||
hostProps = transformedHostProps;
|
||||
}
|
||||
|
||||
return new HostInfo(this, host, port, user, password, hostProps);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the original (common to all hosts) connection arguments as provided in the connection string query section.
|
||||
*
|
||||
* @return the original (common to all hosts) connection arguments
|
||||
*/
|
||||
public Map<String, String> getOriginalProperties() {
|
||||
return Collections.unmodifiableMap(this.properties);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a {@link Properties} instance containing the connection arguments extracted from the URL query section, i.e., per host attributes are excluded.
|
||||
* Applies properties transformations to the collected properties if {@link ConnectionPropertiesTransform} was declared in the connection arguments.
|
||||
*
|
||||
* @return a {@link Properties} instance containing the common connection arguments.
|
||||
*/
|
||||
public Properties getConnectionArgumentsAsProperties() {
|
||||
Properties props = new Properties();
|
||||
if (this.properties != null) {
|
||||
props.putAll(this.properties);
|
||||
}
|
||||
|
||||
return this.propertiesTransformer != null ? this.propertiesTransformer.transformProperties(props) : props;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a hosts list built from the result of the DNS SRV lookup for the original host name.
|
||||
*
|
||||
* @param srvHost
|
||||
* the {@link HostInfo} from where to get the DNS SRV service name to lookup.
|
||||
* @return
|
||||
* the hosts list from the result of the DNS SRV lookup, filtered for the given view.
|
||||
*/
|
||||
public List<HostInfo> getHostsListFromDnsSrv(HostInfo srvHost) {
|
||||
String srvServiceName = srvHost.getHost();
|
||||
List<SrvRecord> srvRecords = null;
|
||||
|
||||
try {
|
||||
srvRecords = DnsSrv.lookupSrvRecords(srvServiceName);
|
||||
} catch (NamingException e) {
|
||||
throw ExceptionFactory.createException(Messages.getString("ConnectionString.26", new Object[] { srvServiceName }), e);
|
||||
}
|
||||
if (srvRecords == null || srvRecords.size() == 0) {
|
||||
throw ExceptionFactory.createException(Messages.getString("ConnectionString.26", new Object[] { srvServiceName }));
|
||||
}
|
||||
|
||||
return Collections.unmodifiableList(srvRecordsToHostsList(srvRecords, srvHost));
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a list of DNS SRV records into a hosts list.
|
||||
*
|
||||
* @param srvRecords
|
||||
* the list of DNS SRV records.
|
||||
* @param baseHostInfo
|
||||
* the {@link HostInfo} to use as source of all common host specific options.
|
||||
* @return
|
||||
* a list of hosts.
|
||||
*/
|
||||
private List<HostInfo> srvRecordsToHostsList(List<SrvRecord> srvRecords, HostInfo baseHostInfo) {
|
||||
return srvRecords.stream()
|
||||
.map(s -> buildHostInfo(s.getTarget(), s.getPort(), baseHostInfo.getUser(), baseHostInfo.getPassword(), baseHostInfo.getHostProperties()))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of this object.
|
||||
*
|
||||
* @return a string representation of this object
|
||||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
StringBuilder asStr = new StringBuilder(super.toString());
|
||||
asStr.append(String.format(" :: {type: \"%s\", hosts: %s, database: \"%s\", properties: %s, propertiesTransformer: %s}", this.type, this.hosts,
|
||||
this.originalDatabase, this.properties, this.propertiesTransformer));
|
||||
return asStr.toString();
|
||||
}
|
||||
}
|
||||
+707
@@ -0,0 +1,707 @@
|
||||
/*
|
||||
* Copyright (c) 2016, 2020, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package com.mysql.cj.conf;
|
||||
|
||||
import static com.mysql.cj.util.StringUtils.isNullOrEmpty;
|
||||
import static com.mysql.cj.util.StringUtils.safeTrim;
|
||||
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.net.URI;
|
||||
import java.net.URLDecoder;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import com.mysql.cj.Messages;
|
||||
import com.mysql.cj.conf.ConnectionUrl.Type;
|
||||
import com.mysql.cj.exceptions.ExceptionFactory;
|
||||
import com.mysql.cj.exceptions.UnsupportedConnectionStringException;
|
||||
import com.mysql.cj.exceptions.WrongArgumentException;
|
||||
import com.mysql.cj.util.StringUtils;
|
||||
|
||||
/**
|
||||
* This class parses a connection string using the general URI structure defined in RFC 3986. Instead of using a URI instance to ensure the correct syntax of
|
||||
* the connection string, this implementation uses regular expressions which is faster but also less strict in terms of validations. This actually works better
|
||||
* because database URLs don't exactly stick to the RFC 3986 rules.
|
||||
* <p>
|
||||
* <i>scheme://authority/path?query#fragment</i>
|
||||
* <p>
|
||||
* This results in splitting the connection string URL and processing its internal parts:
|
||||
* <dl>
|
||||
* <dt>scheme</dt>
|
||||
* <dd>The protocol and subprotocol identification. Usually "jdbc:mysql:" or "mysqlx:".</dd>
|
||||
* <dt>authority</dt>
|
||||
* <dd>Contains information about the user credentials and/or the host and port information. Unlike its definition in the RFC 3986 specification, there can be
|
||||
* multiple authority sections separated by a single comma (,) in a connection string. It is also possible to use an alternative syntax for the user and/or host
|
||||
* identification, that also allows setting per host connection properties, in the form of
|
||||
* "[user[:password]@]address=(key1=value)[(key2=value)]...[,address=(key3=value)[(key4=value)]...]...".</dd>
|
||||
* <dt>path</dt>
|
||||
* <dd>Corresponds to the database identification.</dd>
|
||||
* <dt>query</dt>
|
||||
* <dd>The connection properties, written as "propertyName1[=[propertyValue1]][&propertyName2[=[propertyValue2]]]..."</dd>
|
||||
* <dt>fragment</dt>
|
||||
* <dd>The fragment section is ignored in Connector/J connection strings.</dd>
|
||||
* </dl>
|
||||
*/
|
||||
public class ConnectionUrlParser implements DatabaseUrlContainer {
|
||||
private static final String DUMMY_SCHEMA = "cj://";
|
||||
private static final String USER_PASS_SEPARATOR = ":";
|
||||
private static final String USER_HOST_SEPARATOR = "@";
|
||||
private static final String HOSTS_SEPARATOR = ",";
|
||||
private static final String KEY_VALUE_HOST_INFO_OPENING_MARKER = "(";
|
||||
private static final String KEY_VALUE_HOST_INFO_CLOSING_MARKER = ")";
|
||||
private static final String HOSTS_LIST_OPENING_MARKERS = "[(";
|
||||
private static final String HOSTS_LIST_CLOSING_MARKERS = "])";
|
||||
private static final String ADDRESS_EQUALS_HOST_INFO_PREFIX = "ADDRESS=";
|
||||
|
||||
private static final Pattern CONNECTION_STRING_PTRN = Pattern.compile("(?<scheme>[\\w\\+:%]+)\\s*" // scheme: required; alphanumeric, plus, colon or percent
|
||||
+ "(?://(?<authority>[^/?#]*))?\\s*" // authority: optional; starts with "//" followed by any char except "/", "?" and "#"
|
||||
+ "(?:/(?!\\s*/)(?<path>[^?#]*))?" // path: optional; starts with "/" but not followed by "/", and then followed by by any char except "?" and "#"
|
||||
+ "(?:\\?(?!\\s*\\?)(?<query>[^#]*))?" // query: optional; starts with "?" but not followed by "?", and then followed by by any char except "#"
|
||||
+ "(?:\\s*#(?<fragment>.*))?"); // fragment: optional; starts with "#", and then followed by anything
|
||||
private static final Pattern SCHEME_PTRN = Pattern.compile("(?<scheme>[\\w\\+:%]+).*");
|
||||
private static final Pattern HOST_LIST_PTRN = Pattern.compile("^\\[(?<hosts>.*)\\]$");
|
||||
private static final Pattern GENERIC_HOST_PTRN = Pattern.compile("^(?<host>.*?)(?::(?<port>[^:]*))?$");
|
||||
private static final Pattern KEY_VALUE_HOST_PTRN = Pattern.compile("[,\\s]*(?<key>[\\w\\.\\-\\s%]*)(?:=(?<value>[^,]*))?");
|
||||
private static final Pattern ADDRESS_EQUALS_HOST_PTRN = Pattern.compile("\\s*\\(\\s*(?<key>[\\w\\.\\-%]+)?\\s*(?:=(?<value>[^)]*))?\\)\\s*");
|
||||
private static final Pattern PROPERTIES_PTRN = Pattern.compile("[&\\s]*(?<key>[\\w\\.\\-\\s%]*)(?:=(?<value>[^&]*))?");
|
||||
|
||||
private final String baseConnectionString;
|
||||
private String scheme;
|
||||
private String authority;
|
||||
private String path;
|
||||
private String query;
|
||||
|
||||
private List<HostInfo> parsedHosts = null;
|
||||
private Map<String, String> parsedProperties = null;
|
||||
|
||||
/**
|
||||
* Static factory method for constructing instances of this class.
|
||||
*
|
||||
* @param connString
|
||||
* The connection string to parse.
|
||||
* @return an instance of {@link ConnectionUrlParser}
|
||||
*/
|
||||
public static ConnectionUrlParser parseConnectionString(String connString) {
|
||||
return new ConnectionUrlParser(connString);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a connection string parser for the given connection string.
|
||||
*
|
||||
* @param connString
|
||||
* the connection string to parse
|
||||
*/
|
||||
private ConnectionUrlParser(String connString) {
|
||||
if (connString == null) {
|
||||
throw ExceptionFactory.createException(WrongArgumentException.class, Messages.getString("ConnectionString.0"));
|
||||
}
|
||||
if (!isConnectionStringSupported(connString)) {
|
||||
throw ExceptionFactory.createException(UnsupportedConnectionStringException.class,
|
||||
Messages.getString("ConnectionString.17", new String[] { connString }));
|
||||
}
|
||||
this.baseConnectionString = connString;
|
||||
parseConnectionString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the scheme part of given connection string matches one of the {@link Type}s supported by Connector/J.
|
||||
* Throws {@link WrongArgumentException} if connString is null.
|
||||
*
|
||||
* @param connString
|
||||
* connection string
|
||||
* @return true if supported
|
||||
*/
|
||||
public static boolean isConnectionStringSupported(String connString) {
|
||||
if (connString == null) {
|
||||
throw ExceptionFactory.createException(WrongArgumentException.class, Messages.getString("ConnectionString.0"));
|
||||
}
|
||||
Matcher matcher = SCHEME_PTRN.matcher(connString);
|
||||
return matcher.matches() && Type.isSupported(decodeSkippingPlusSign(matcher.group("scheme")));
|
||||
}
|
||||
|
||||
/**
|
||||
* Splits the connection string in its main sections.
|
||||
*/
|
||||
private void parseConnectionString() {
|
||||
String connString = this.baseConnectionString;
|
||||
Matcher matcher = CONNECTION_STRING_PTRN.matcher(connString);
|
||||
if (!matcher.matches()) {
|
||||
throw ExceptionFactory.createException(WrongArgumentException.class, Messages.getString("ConnectionString.1"));
|
||||
}
|
||||
this.scheme = decodeSkippingPlusSign(matcher.group("scheme"));
|
||||
this.authority = matcher.group("authority"); // Don't decode just yet.
|
||||
this.path = matcher.group("path") == null ? null : decode(matcher.group("path")).trim();
|
||||
this.query = matcher.group("query"); // Don't decode just yet.
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses the authority section (user and/or host identification) of the connection string URI.
|
||||
*/
|
||||
private void parseAuthoritySection() {
|
||||
if (isNullOrEmpty(this.authority)) {
|
||||
// Add an empty, default, host.
|
||||
this.parsedHosts.add(new HostInfo());
|
||||
return;
|
||||
}
|
||||
|
||||
List<String> authoritySegments = StringUtils.split(this.authority, HOSTS_SEPARATOR, HOSTS_LIST_OPENING_MARKERS, HOSTS_LIST_CLOSING_MARKERS, true,
|
||||
StringUtils.SEARCH_MODE__MRK_WS);
|
||||
for (String hi : authoritySegments) {
|
||||
parseAuthoritySegment(hi);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses the given sub authority segment, which can take one of the following syntaxes:
|
||||
* <ul>
|
||||
* <li>_user_:_password_@_host_:_port_
|
||||
* <li>_user_:_password_@(key1=value1,key2=value2,...)
|
||||
* <li>_user_:_password_@address=(key1=value1)(key2=value2)...
|
||||
* <li>_user_:_password_@[_any_of_the_above_1_,_any_of_the_above_2_,...]
|
||||
* </ul>
|
||||
* Most of the above placeholders can be omitted, representing a null, empty, or default value.
|
||||
* The placeholder _host_, can be a host name, IPv4 or IPv6. This parser doesn't check IP syntax. IPv6 addresses are enclosed by square brackets ([::1]).
|
||||
* The placeholder _any_of_the_above_?_ can be any of the above except for the user information part (_user_:_password_@).
|
||||
* When the symbol ":" is not used, it means an null/empty password or a default (HostInfo.NO_PORT) port, respectively.
|
||||
* When the symbol "@" is not used, it means that the authority part doesn't contain user information (depending on the scheme type can still be provided
|
||||
* via key=value pairs).
|
||||
*
|
||||
* @param authSegment
|
||||
* the string containing the authority segment
|
||||
*/
|
||||
private void parseAuthoritySegment(String authSegment) {
|
||||
/*
|
||||
* Start by splitting the user and host information parts from the authority segment and process the user information, if any.
|
||||
*/
|
||||
Pair<String, String> userHostInfoSplit = splitByUserInfoAndHostInfo(authSegment);
|
||||
String userInfo = safeTrim(userHostInfoSplit.left);
|
||||
String user = null;
|
||||
String password = null;
|
||||
if (!isNullOrEmpty(userInfo)) {
|
||||
Pair<String, String> userInfoPair = parseUserInfo(userInfo);
|
||||
user = decode(safeTrim(userInfoPair.left));
|
||||
password = decode(safeTrim(userInfoPair.right));
|
||||
}
|
||||
String hostInfo = safeTrim(userHostInfoSplit.right);
|
||||
|
||||
/*
|
||||
* Handle an authority part without host information.
|
||||
*/
|
||||
HostInfo hi = buildHostInfoForEmptyHost(user, password, hostInfo);
|
||||
if (hi != null) {
|
||||
this.parsedHosts.add(hi);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Try using a java.net.URI instance to parse the host information. This helps dealing with the IPv6 syntax.
|
||||
*/
|
||||
hi = buildHostInfoResortingToUriParser(user, password, authSegment);
|
||||
if (hi != null) {
|
||||
this.parsedHosts.add(hi);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Using a URI didn't work, now check if the host part is composed by a sub list of hosts and process them, one by one if so.
|
||||
*/
|
||||
List<HostInfo> hiList = buildHostInfoResortingToSubHostsListParser(user, password, hostInfo);
|
||||
if (hiList != null) {
|
||||
this.parsedHosts.addAll(hiList);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* The hosts list syntax didn't work, now check if the host information is written in the alternate syntax "(Key1=value1,key2=value2)".
|
||||
*/
|
||||
hi = buildHostInfoResortingToKeyValueSyntaxParser(user, password, hostInfo);
|
||||
if (hi != null) {
|
||||
this.parsedHosts.add(hi);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Key/value syntax didn't work either, now check if the host information is written in the alternate syntax "address=(...)".
|
||||
* This parser needs to run after the key/value one because a key named "address" could invalidate it.
|
||||
*/
|
||||
hi = buildHostInfoResortingToAddressEqualsSyntaxParser(user, password, hostInfo);
|
||||
if (hi != null) {
|
||||
this.parsedHosts.add(hi);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Alternate syntax also failed, let's wind up the corner cases the URI couldn't handle.
|
||||
*/
|
||||
hi = buildHostInfoResortingToGenericSyntaxParser(user, password, hostInfo);
|
||||
if (hi != null) {
|
||||
this.parsedHosts.add(hi);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Failed parsing the authority segment.
|
||||
*/
|
||||
throw ExceptionFactory.createException(WrongArgumentException.class, Messages.getString("ConnectionString.2", new Object[] { authSegment }));
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds an {@link HostInfo} instance for empty host authority segments.
|
||||
*
|
||||
* @param user
|
||||
* the user to include in the final {@link HostInfo}
|
||||
* @param password
|
||||
* the password to include in the final {@link HostInfo}
|
||||
* @param hostInfo
|
||||
* the string containing the host information part
|
||||
* @return the {@link HostInfo} instance containing the parsed information or <code>null</code> if the host part is not empty
|
||||
*/
|
||||
private HostInfo buildHostInfoForEmptyHost(String user, String password, String hostInfo) {
|
||||
if (isNullOrEmpty(hostInfo)) {
|
||||
if (isNullOrEmpty(user) && isNullOrEmpty(password)) {
|
||||
return new HostInfo();
|
||||
}
|
||||
return new HostInfo(this, null, HostInfo.NO_PORT, user, password);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses the host information resorting to a URI object. This process handles most single-host well formed addresses.
|
||||
*
|
||||
* @param user
|
||||
* the user to include in the final {@link HostInfo}
|
||||
* @param password
|
||||
* the password to include in the final {@link HostInfo}
|
||||
* @param hostInfo
|
||||
* the string containing the host information part
|
||||
*
|
||||
* @return the {@link HostInfo} instance containing the parsed information or <code>null</code> if unable to parse the host information
|
||||
*/
|
||||
private HostInfo buildHostInfoResortingToUriParser(String user, String password, String hostInfo) {
|
||||
String host = null;
|
||||
int port = HostInfo.NO_PORT;
|
||||
|
||||
try {
|
||||
URI uri = URI.create(DUMMY_SCHEMA + hostInfo);
|
||||
if (uri.getHost() != null) {
|
||||
host = decode(uri.getHost());
|
||||
}
|
||||
if (uri.getPort() != -1) { // getPort() returns -1 if the port is undefined.
|
||||
port = uri.getPort();
|
||||
}
|
||||
if (uri.getUserInfo() != null) {
|
||||
// Can't have another one. The user information should have been handled already.
|
||||
return null;
|
||||
}
|
||||
} catch (IllegalArgumentException e) {
|
||||
// The URI failed to parse the host information.
|
||||
return null;
|
||||
}
|
||||
if (host != null || port != HostInfo.NO_PORT) {
|
||||
// The host info parsing succeeded.
|
||||
return new HostInfo(this, host, port, user, password);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses the host information using the alternate sub hosts lists syntax "[host1, host2, ...]".
|
||||
*
|
||||
* @param user
|
||||
* the user to include in all the resulting {@link HostInfo}
|
||||
* @param password
|
||||
* the password to include in all the resulting {@link HostInfo}
|
||||
* @param hostInfo
|
||||
* the string containing the host information part
|
||||
* @return a list with all {@link HostInfo} instances containing the parsed information or <code>null</code> if unable to parse the host information
|
||||
*/
|
||||
private List<HostInfo> buildHostInfoResortingToSubHostsListParser(String user, String password, String hostInfo) {
|
||||
Matcher matcher = HOST_LIST_PTRN.matcher(hostInfo);
|
||||
if (matcher.matches()) {
|
||||
String hosts = matcher.group("hosts");
|
||||
List<String> hostsList = StringUtils.split(hosts, HOSTS_SEPARATOR, HOSTS_LIST_OPENING_MARKERS, HOSTS_LIST_CLOSING_MARKERS, true,
|
||||
StringUtils.SEARCH_MODE__MRK_WS);
|
||||
// One single element could, in fact, be an IPv6 stripped from its delimiters.
|
||||
boolean maybeIPv6 = hostsList.size() == 1 && hostsList.get(0).matches("(?i)^[\\dabcdef:]+$");
|
||||
List<HostInfo> hostInfoList = new ArrayList<>();
|
||||
for (String h : hostsList) {
|
||||
HostInfo hi;
|
||||
if ((hi = buildHostInfoForEmptyHost(user, password, h)) != null) {
|
||||
hostInfoList.add(hi);
|
||||
} else if ((hi = buildHostInfoResortingToUriParser(user, password, h)) != null
|
||||
|| (maybeIPv6 && (hi = buildHostInfoResortingToUriParser(user, password, "[" + h + "]")) != null)) {
|
||||
hostInfoList.add(hi);
|
||||
} else if ((hi = buildHostInfoResortingToKeyValueSyntaxParser(user, password, h)) != null) {
|
||||
hostInfoList.add(hi);
|
||||
} else if ((hi = buildHostInfoResortingToAddressEqualsSyntaxParser(user, password, h)) != null) {
|
||||
hostInfoList.add(hi);
|
||||
} else if ((hi = buildHostInfoResortingToGenericSyntaxParser(user, password, h)) != null) {
|
||||
hostInfoList.add(hi);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
return hostInfoList;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses the host information using the alternate syntax "(key1=value1, key2=value2, ...)".
|
||||
*
|
||||
* @param user
|
||||
* the user to include in the resulting {@link HostInfo}
|
||||
* @param password
|
||||
* the password to include in the resulting {@link HostInfo}
|
||||
* @param hostInfo
|
||||
* the string containing the host information part
|
||||
* @return the {@link HostInfo} instance containing the parsed information or <code>null</code> if unable to parse the host information
|
||||
*/
|
||||
private HostInfo buildHostInfoResortingToKeyValueSyntaxParser(String user, String password, String hostInfo) {
|
||||
if (!hostInfo.startsWith(KEY_VALUE_HOST_INFO_OPENING_MARKER) || !hostInfo.endsWith(KEY_VALUE_HOST_INFO_CLOSING_MARKER)) {
|
||||
// This pattern won't work.
|
||||
return null;
|
||||
}
|
||||
hostInfo = hostInfo.substring(KEY_VALUE_HOST_INFO_OPENING_MARKER.length(), hostInfo.length() - KEY_VALUE_HOST_INFO_CLOSING_MARKER.length());
|
||||
return new HostInfo(this, null, HostInfo.NO_PORT, user, password, processKeyValuePattern(KEY_VALUE_HOST_PTRN, hostInfo));
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses the host information using the alternate syntax "address=(key1=value1)(key2=value2)...".
|
||||
*
|
||||
* @param user
|
||||
* the user to include in the resulting {@link HostInfo}
|
||||
* @param password
|
||||
* the password to include in the resulting {@link HostInfo}
|
||||
* @param hostInfo
|
||||
* the string containing the host information part
|
||||
* @return the {@link HostInfo} instance containing the parsed information or <code>null</code> if unable to parse the host information
|
||||
*/
|
||||
private HostInfo buildHostInfoResortingToAddressEqualsSyntaxParser(String user, String password, String hostInfo) {
|
||||
int p = StringUtils.indexOfIgnoreCase(hostInfo, ADDRESS_EQUALS_HOST_INFO_PREFIX);
|
||||
if (p != 0) {
|
||||
// This pattern won't work.
|
||||
return null;
|
||||
}
|
||||
hostInfo = hostInfo.substring(p + ADDRESS_EQUALS_HOST_INFO_PREFIX.length()).trim();
|
||||
return new HostInfo(this, null, HostInfo.NO_PORT, user, password, processKeyValuePattern(ADDRESS_EQUALS_HOST_PTRN, hostInfo));
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses the host information using the generic syntax "host:port".
|
||||
*
|
||||
* @param user
|
||||
* the user to include in the resulting {@link HostInfo}
|
||||
* @param password
|
||||
* the password to include in the resulting {@link HostInfo}
|
||||
* @param hostInfo
|
||||
* the string containing the host information part
|
||||
* @return the {@link HostInfo} instance containing the parsed information or <code>null</code> if unable to parse the host information
|
||||
*/
|
||||
private HostInfo buildHostInfoResortingToGenericSyntaxParser(String user, String password, String hostInfo) {
|
||||
if (splitByUserInfoAndHostInfo(hostInfo).left != null) {
|
||||
// This host information is invalid if contains another user information part.
|
||||
return null;
|
||||
}
|
||||
Pair<String, Integer> hostPortPair = parseHostPortPair(hostInfo);
|
||||
String host = decode(safeTrim(hostPortPair.left));
|
||||
Integer port = hostPortPair.right;
|
||||
return new HostInfo(this, isNullOrEmpty(host) ? null : host, port, user, password);
|
||||
}
|
||||
|
||||
/**
|
||||
* Splits the given authority segment in the user information part and the host part.
|
||||
*
|
||||
* @param authSegment
|
||||
* the string containing the authority segment, i.e., the user and host information parts
|
||||
* @return
|
||||
* a {@link Pair} containing the user information in the left side and the host information in the right
|
||||
*/
|
||||
private Pair<String, String> splitByUserInfoAndHostInfo(String authSegment) {
|
||||
String userInfoPart = null;
|
||||
String hostInfoPart = authSegment;
|
||||
int p = authSegment.indexOf(USER_HOST_SEPARATOR);
|
||||
if (p >= 0) {
|
||||
userInfoPart = authSegment.substring(0, p);
|
||||
hostInfoPart = authSegment.substring(p + USER_HOST_SEPARATOR.length());
|
||||
}
|
||||
return new Pair<>(userInfoPart, hostInfoPart);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses the given user information which is formed by the parts [user][:password].
|
||||
*
|
||||
* @param userInfo
|
||||
* the string containing the user information
|
||||
* @return a {@link Pair} containing the user and password information or null if the user information can't be parsed
|
||||
*/
|
||||
public static Pair<String, String> parseUserInfo(String userInfo) {
|
||||
if (isNullOrEmpty(userInfo)) {
|
||||
return null;
|
||||
}
|
||||
String[] userInfoParts = userInfo.split(USER_PASS_SEPARATOR, 2);
|
||||
String userName = userInfoParts[0];
|
||||
String password = userInfoParts.length > 1 ? userInfoParts[1] : null;
|
||||
return new Pair<>(userName, password);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses a host:port pair and returns the two elements in a {@link Pair}
|
||||
*
|
||||
* @param hostInfo
|
||||
* the host:pair to parse
|
||||
* @return a {@link Pair} containing the host and port information or null if the host information can't be parsed
|
||||
*/
|
||||
public static Pair<String, Integer> parseHostPortPair(String hostInfo) {
|
||||
if (isNullOrEmpty(hostInfo)) {
|
||||
return null;
|
||||
}
|
||||
Matcher matcher = GENERIC_HOST_PTRN.matcher(hostInfo);
|
||||
if (matcher.matches()) {
|
||||
String host = matcher.group("host");
|
||||
String portAsString = decode(safeTrim(matcher.group("port")));
|
||||
Integer portAsInteger = HostInfo.NO_PORT;
|
||||
if (!isNullOrEmpty(portAsString)) {
|
||||
try {
|
||||
portAsInteger = Integer.parseInt(portAsString);
|
||||
} catch (NumberFormatException e) {
|
||||
throw ExceptionFactory.createException(WrongArgumentException.class, Messages.getString("ConnectionString.3", new Object[] { hostInfo }),
|
||||
e);
|
||||
}
|
||||
}
|
||||
return new Pair<>(host, portAsInteger);
|
||||
}
|
||||
throw ExceptionFactory.createException(WrongArgumentException.class, Messages.getString("ConnectionString.3", new Object[] { hostInfo }));
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses the connection properties section and stores the extracted key/value pairs into a local map.
|
||||
*/
|
||||
private void parseQuerySection() {
|
||||
if (isNullOrEmpty(this.query)) {
|
||||
this.parsedProperties = new HashMap<>();
|
||||
return;
|
||||
}
|
||||
this.parsedProperties = processKeyValuePattern(PROPERTIES_PTRN, this.query);
|
||||
}
|
||||
|
||||
/**
|
||||
* Takes a two-matching-groups (respectively named "key" and "value") pattern which is successively tested against the given string and produces a key/value
|
||||
* map with the matched values. The given pattern must ensure that there are no leftovers between successive tests, i.e., the end of the previous match must
|
||||
* coincide with the beginning of the next.
|
||||
*
|
||||
* @param pattern
|
||||
* the regular expression pattern to match against to
|
||||
* @param input
|
||||
* the input string
|
||||
* @return a key/value map containing the matched values
|
||||
*/
|
||||
private Map<String, String> processKeyValuePattern(Pattern pattern, String input) {
|
||||
Matcher matcher = pattern.matcher(input);
|
||||
int p = 0;
|
||||
Map<String, String> kvMap = new HashMap<>();
|
||||
while (matcher.find()) {
|
||||
if (matcher.start() != p) {
|
||||
throw ExceptionFactory.createException(WrongArgumentException.class,
|
||||
Messages.getString("ConnectionString.4", new Object[] { input.substring(p) }));
|
||||
}
|
||||
String key = decode(safeTrim(matcher.group("key")));
|
||||
String value = decode(safeTrim(matcher.group("value")));
|
||||
if (!isNullOrEmpty(key)) {
|
||||
kvMap.put(key, value);
|
||||
} else if (!isNullOrEmpty(value)) {
|
||||
throw ExceptionFactory.createException(WrongArgumentException.class,
|
||||
Messages.getString("ConnectionString.4", new Object[] { input.substring(p) }));
|
||||
}
|
||||
p = matcher.end();
|
||||
}
|
||||
if (p != input.length()) {
|
||||
throw ExceptionFactory.createException(WrongArgumentException.class, Messages.getString("ConnectionString.4", new Object[] { input.substring(p) }));
|
||||
}
|
||||
return kvMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* URL-decode the given string.
|
||||
*
|
||||
* @param text
|
||||
* the string to decode
|
||||
* @return
|
||||
* the decoded string
|
||||
*/
|
||||
private static String decode(String text) {
|
||||
if (isNullOrEmpty(text)) {
|
||||
return text;
|
||||
}
|
||||
try {
|
||||
return URLDecoder.decode(text, StandardCharsets.UTF_8.name());
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
// Won't happen.
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
/**
|
||||
* URL-decode the given string skipping all occurrences of the plus sign.
|
||||
*
|
||||
* @param text
|
||||
* the string to decode
|
||||
* @return
|
||||
* the decoded string
|
||||
*/
|
||||
private static String decodeSkippingPlusSign(String text) {
|
||||
if (isNullOrEmpty(text)) {
|
||||
return text;
|
||||
}
|
||||
text = text.replace("+", "%2B"); // Percent encode for "+" is "%2B".
|
||||
try {
|
||||
return URLDecoder.decode(text, StandardCharsets.UTF_8.name());
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
// Won't happen.
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the original database URL that produced this connection string parser.
|
||||
*
|
||||
* @return the original database URL
|
||||
*/
|
||||
@Override
|
||||
public String getDatabaseUrl() {
|
||||
return this.baseConnectionString;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the scheme section.
|
||||
*
|
||||
* @return the scheme section
|
||||
*/
|
||||
public String getScheme() {
|
||||
return this.scheme;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the authority section.
|
||||
*
|
||||
* @return the authority section
|
||||
*/
|
||||
public String getAuthority() {
|
||||
return this.authority;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the path section.
|
||||
*
|
||||
* @return the path section
|
||||
*/
|
||||
public String getPath() {
|
||||
return this.path;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the query section.
|
||||
*
|
||||
* @return the query section
|
||||
*/
|
||||
public String getQuery() {
|
||||
return this.query;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the hosts information.
|
||||
*
|
||||
* @return the hosts information
|
||||
*/
|
||||
public List<HostInfo> getHosts() {
|
||||
if (this.parsedHosts == null) {
|
||||
this.parsedHosts = new ArrayList<>();
|
||||
parseAuthoritySection();
|
||||
}
|
||||
return this.parsedHosts;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the properties map contained in this connection string.
|
||||
*
|
||||
* @return the properties map
|
||||
*/
|
||||
public Map<String, String> getProperties() {
|
||||
if (this.parsedProperties == null) {
|
||||
parseQuerySection();
|
||||
}
|
||||
return Collections.unmodifiableMap(this.parsedProperties);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of this object.
|
||||
*
|
||||
* @return a string representation of this object
|
||||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
StringBuilder asStr = new StringBuilder(super.toString());
|
||||
asStr.append(String.format(" :: {scheme: \"%s\", authority: \"%s\", path: \"%s\", query: \"%s\", parsedHosts: %s, parsedProperties: %s}", this.scheme,
|
||||
this.authority, this.path, this.query, this.parsedHosts, this.parsedProperties));
|
||||
return asStr.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* This class is a simple container for two elements.
|
||||
*
|
||||
* @param <T>
|
||||
* left part type
|
||||
* @param <U>
|
||||
* right part type
|
||||
*/
|
||||
public static class Pair<T, U> {
|
||||
public final T left;
|
||||
public final U right;
|
||||
|
||||
public Pair(T left, U right) {
|
||||
this.left = left;
|
||||
this.right = right;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
StringBuilder asStr = new StringBuilder(super.toString());
|
||||
asStr.append(String.format(" :: { left: %s, right: %s }", this.left, this.right));
|
||||
return asStr.toString();
|
||||
}
|
||||
}
|
||||
}
|
||||
+42
@@ -0,0 +1,42 @@
|
||||
/*
|
||||
* Copyright (c) 2016, 2020, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package com.mysql.cj.conf;
|
||||
|
||||
/**
|
||||
* Implementors of this class must be able to provide a database URL.
|
||||
*/
|
||||
public interface DatabaseUrlContainer {
|
||||
/**
|
||||
* Returns the original database URL that produced this connection string.
|
||||
*
|
||||
* @return the original database URL
|
||||
*/
|
||||
String getDatabaseUrl();
|
||||
}
|
||||
+241
@@ -0,0 +1,241 @@
|
||||
/*
|
||||
* Copyright (c) 2016, 2020, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package com.mysql.cj.conf;
|
||||
|
||||
import static com.mysql.cj.util.StringUtils.isNullOrEmpty;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
|
||||
/**
|
||||
* This class holds the following MySQL host information:
|
||||
* <ul>
|
||||
* <li>host: an IP or host name.
|
||||
* <li>port: the port number or 0 if not known.
|
||||
* <li>user: the user name.
|
||||
* <li>password: the password.
|
||||
* <li>host properties: host specific connection arguments.
|
||||
* </ul>
|
||||
*/
|
||||
public class HostInfo implements DatabaseUrlContainer {
|
||||
public static final int NO_PORT = -1;
|
||||
private static final String HOST_PORT_SEPARATOR = ":";
|
||||
|
||||
private final DatabaseUrlContainer originalUrl;
|
||||
private final String host;
|
||||
private final int port;
|
||||
private final String user;
|
||||
private final String password;
|
||||
private final Map<String, String> hostProperties = new HashMap<>();
|
||||
|
||||
/**
|
||||
* Constructs an empty {@link HostInfo} instance.
|
||||
*/
|
||||
public HostInfo() {
|
||||
this(null, null, NO_PORT, null, null, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a {@link HostInfo} instance initialized with the provided host, port and user info.
|
||||
*
|
||||
* @param url
|
||||
* a reference to the original database URL that produced this host info
|
||||
* @param host
|
||||
* the host ip or name
|
||||
* @param port
|
||||
* the port
|
||||
* @param user
|
||||
* the user name
|
||||
* @param password
|
||||
* the user's password
|
||||
*/
|
||||
public HostInfo(DatabaseUrlContainer url, String host, int port, String user, String password) {
|
||||
this(url, host, port, user, password, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a {@link HostInfo} instance initialized with the provided host, port, user, password and connection arguments.
|
||||
*
|
||||
* @param url
|
||||
* a reference to the original database URL that produced this host info
|
||||
* @param host
|
||||
* the host ip or name
|
||||
* @param port
|
||||
* the port
|
||||
* @param user
|
||||
* the user name
|
||||
* @param password
|
||||
* this user's password
|
||||
* @param properties
|
||||
* a connection arguments map.
|
||||
*/
|
||||
public HostInfo(DatabaseUrlContainer url, String host, int port, String user, String password, Map<String, String> properties) {
|
||||
this.originalUrl = url;
|
||||
this.host = host;
|
||||
this.port = port;
|
||||
this.user = user;
|
||||
this.password = password;
|
||||
if (properties != null) {
|
||||
this.hostProperties.putAll(properties);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the host.
|
||||
*
|
||||
* @return the host
|
||||
*/
|
||||
public String getHost() {
|
||||
return this.host;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the port.
|
||||
*
|
||||
* @return the port
|
||||
*/
|
||||
public int getPort() {
|
||||
return this.port;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a host:port representation of this host.
|
||||
*
|
||||
* @return the host:port representation of this host
|
||||
*/
|
||||
public String getHostPortPair() {
|
||||
return this.host + HOST_PORT_SEPARATOR + this.port;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the user name.
|
||||
*
|
||||
* @return the user name
|
||||
*/
|
||||
public String getUser() {
|
||||
return this.user;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the password.
|
||||
*
|
||||
* @return the password
|
||||
*/
|
||||
public String getPassword() {
|
||||
return this.password;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the properties specific to this host.
|
||||
*
|
||||
* @return this host specific properties
|
||||
*/
|
||||
public Map<String, String> getHostProperties() {
|
||||
return Collections.unmodifiableMap(this.hostProperties);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the connection argument for the given key.
|
||||
*
|
||||
* @param key
|
||||
* key
|
||||
*
|
||||
* @return the connection argument for the given key
|
||||
*/
|
||||
public String getProperty(String key) {
|
||||
return this.hostProperties.get(key);
|
||||
}
|
||||
|
||||
/**
|
||||
* Shortcut to the database connection argument.
|
||||
*
|
||||
* @return the database name
|
||||
*/
|
||||
public String getDatabase() {
|
||||
String database = this.hostProperties.get(PropertyKey.DBNAME.getKeyName());
|
||||
return isNullOrEmpty(database) ? "" : database;
|
||||
}
|
||||
|
||||
/**
|
||||
* Exposes this host info as a single properties instance. The values for host, port, user and password are added to the properties map with their standard
|
||||
* keys.
|
||||
*
|
||||
* @return a {@link Properties} instance containing the full host information.
|
||||
*/
|
||||
public Properties exposeAsProperties() {
|
||||
Properties props = new Properties();
|
||||
this.hostProperties.entrySet().stream().forEach(e -> props.setProperty(e.getKey(), e.getValue() == null ? "" : e.getValue()));
|
||||
props.setProperty(PropertyKey.HOST.getKeyName(), getHost());
|
||||
props.setProperty(PropertyKey.PORT.getKeyName(), String.valueOf(getPort()));
|
||||
if (getUser() != null) {
|
||||
props.setProperty(PropertyKey.USER.getKeyName(), getUser());
|
||||
}
|
||||
if (getPassword() != null) {
|
||||
props.setProperty(PropertyKey.PASSWORD.getKeyName(), getPassword());
|
||||
}
|
||||
return props;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the original database URL that produced this host info.
|
||||
*
|
||||
* @return the original database URL
|
||||
*/
|
||||
@Override
|
||||
public String getDatabaseUrl() {
|
||||
return this.originalUrl != null ? this.originalUrl.getDatabaseUrl() : "";
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if this {@link HostInfo} has the same host and port pair as the given {@link HostInfo}.
|
||||
*
|
||||
* @param hi
|
||||
* the {@link HostInfo} to compare with.
|
||||
* @return
|
||||
* <code>true</code> if both objects have equal host and port pairs, <code>false</code> otherwise.
|
||||
*/
|
||||
public boolean equalHostPortPair(HostInfo hi) {
|
||||
return (getHost() != null && getHost().equals(hi.getHost()) || getHost() == null && hi.getHost() == null) && getPort() == hi.getPort();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of this object.
|
||||
*
|
||||
* @return a string representation of this object
|
||||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
StringBuilder asStr = new StringBuilder(super.toString());
|
||||
asStr.append(String.format(" :: {host: \"%s\", port: %d, hostProperties: %s}", this.host, this.port, this.hostProperties));
|
||||
return asStr.toString();
|
||||
}
|
||||
}
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
* Copyright (c) 2019, 2020, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package com.mysql.cj.conf;
|
||||
|
||||
/**
|
||||
* An enumeration that identifies the type of the view intended for getting hosts lists for multi-host connections.
|
||||
*/
|
||||
public enum HostsListView {
|
||||
ALL, SOURCES, REPLICAS;
|
||||
}
|
||||
+160
@@ -0,0 +1,160 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 2020, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package com.mysql.cj.conf;
|
||||
|
||||
import com.mysql.cj.exceptions.ExceptionInterceptor;
|
||||
|
||||
public interface PropertyDefinition<T> {
|
||||
|
||||
/**
|
||||
* Does the property have fixed values based constraints.
|
||||
*
|
||||
* @return true if property has fixed values based constraints.
|
||||
*/
|
||||
boolean hasValueConstraints();
|
||||
|
||||
/**
|
||||
* Returns true if property has range-based constraints
|
||||
*
|
||||
* @return true if property has range-based constraints
|
||||
*/
|
||||
boolean isRangeBased();
|
||||
|
||||
/**
|
||||
* Get the property key.
|
||||
*
|
||||
* @return {@link PropertyKey} or null if it's a custom property.
|
||||
*/
|
||||
PropertyKey getPropertyKey();
|
||||
|
||||
/**
|
||||
* Returns the property name.
|
||||
*
|
||||
* @return the property name
|
||||
*/
|
||||
String getName();
|
||||
|
||||
/**
|
||||
* Returns the property camel-case alias.
|
||||
*
|
||||
* @return the property camel-case alias.
|
||||
*/
|
||||
String getCcAlias();
|
||||
|
||||
/**
|
||||
* Returns true if property has a camel-case alias.
|
||||
*
|
||||
* @return true if property has a camel-case alias.
|
||||
*/
|
||||
boolean hasCcAlias();
|
||||
|
||||
/**
|
||||
* Returns the default value.
|
||||
*
|
||||
* @return default value
|
||||
*/
|
||||
T getDefaultValue();
|
||||
|
||||
/**
|
||||
* May the property be changed after initialization.
|
||||
*
|
||||
* @return true if the property value may be changed after initialization.
|
||||
*/
|
||||
boolean isRuntimeModifiable();
|
||||
|
||||
/**
|
||||
* Returns the property description. Used for documentation.
|
||||
*
|
||||
* @return property description
|
||||
*/
|
||||
String getDescription();
|
||||
|
||||
/**
|
||||
* Returns the driver version where the property was introduced first. Used for documentation.
|
||||
*
|
||||
* @return the driver version where the property was introduced first
|
||||
*/
|
||||
String getSinceVersion();
|
||||
|
||||
/**
|
||||
* Returns the property category.
|
||||
*
|
||||
* @return property category
|
||||
*/
|
||||
String getCategory();
|
||||
|
||||
/**
|
||||
* Returns the property order. Used as preferred property position in properties table in documentation.
|
||||
*
|
||||
* @return property order
|
||||
*/
|
||||
int getOrder();
|
||||
|
||||
/**
|
||||
* Returns the list of allowable values.
|
||||
*
|
||||
* @return the list of allowable values
|
||||
*/
|
||||
String[] getAllowableValues();
|
||||
|
||||
/**
|
||||
* The lowest possible value of range-based property
|
||||
*
|
||||
* @return the lowest possible value of range-based property
|
||||
*/
|
||||
int getLowerBound();
|
||||
|
||||
/**
|
||||
* The highest possible value of range-based property
|
||||
*
|
||||
* @return the highest possible value of range-based property
|
||||
*/
|
||||
int getUpperBound();
|
||||
|
||||
/**
|
||||
* Returns the value object parsed from it's string representation and checked against allowable values.
|
||||
*
|
||||
* @param value
|
||||
* value
|
||||
* @param exceptionInterceptor
|
||||
* exception interceptor
|
||||
*
|
||||
* @return the value object
|
||||
*/
|
||||
T parseObject(String value, ExceptionInterceptor exceptionInterceptor);
|
||||
|
||||
/**
|
||||
* Creates instance of ReadableProperty or ModifiableProperty depending on isRuntimeModifiable() result.
|
||||
*
|
||||
* @return {@link RuntimeProperty} instance
|
||||
*/
|
||||
RuntimeProperty<T> createRuntimeProperty();
|
||||
|
||||
}
|
||||
+879
@@ -0,0 +1,879 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 2021, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package com.mysql.cj.conf;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import com.mysql.cj.Messages;
|
||||
import com.mysql.cj.PerConnectionLRUFactory;
|
||||
import com.mysql.cj.log.Log;
|
||||
import com.mysql.cj.log.StandardLogger;
|
||||
import com.mysql.cj.util.PerVmServerConfigCacheFactory;
|
||||
|
||||
public class PropertyDefinitions {
|
||||
/*
|
||||
* Built-in system properties.
|
||||
*/
|
||||
public static final String SYSP_line_separator = "line.separator";
|
||||
public static final String SYSP_java_vendor = "java.vendor";
|
||||
public static final String SYSP_java_version = "java.version";
|
||||
public static final String SYSP_java_vm_vendor = "java.vm.vendor";
|
||||
public static final String SYSP_os_name = "os.name";
|
||||
public static final String SYSP_os_arch = "os.arch";
|
||||
public static final String SYSP_os_version = "os.version";
|
||||
public static final String SYSP_file_encoding = "file.encoding";
|
||||
|
||||
/*
|
||||
* Operational system properties.
|
||||
*/
|
||||
public static final String SYSP_disableAbandonedConnectionCleanup = "com.mysql.cj.disableAbandonedConnectionCleanup";
|
||||
|
||||
/*
|
||||
* Testsuite system properties.
|
||||
*/
|
||||
public static final String SYSP_testsuite_url /* */ = "com.mysql.cj.testsuite.url";
|
||||
public final static String SYSP_testsuite_url_admin /* */ = "com.mysql.cj.testsuite.url.admin";
|
||||
public static final String SYSP_testsuite_url_cluster /* */ = "com.mysql.cj.testsuite.url.cluster";
|
||||
/** Connection string to server compiled with OpenSSL */
|
||||
public static final String SYSP_testsuite_url_openssl /* */ = "com.mysql.cj.testsuite.url.openssl";
|
||||
|
||||
public static final String SYSP_testsuite_url_mysqlx /* */ = "com.mysql.cj.testsuite.mysqlx.url";
|
||||
public static final String SYSP_testsuite_url_mysqlx_openssl /* */ = "com.mysql.cj.testsuite.mysqlx.url.openssl";
|
||||
|
||||
public static final String SYSP_testsuite_cantGrant /* */ = "com.mysql.cj.testsuite.cantGrant";
|
||||
public static final String SYSP_testsuite_disable_multihost_tests /* */ = "com.mysql.cj.testsuite.disable.multihost.tests"; // TODO should be more specific for different types of multi-host configs
|
||||
|
||||
public static final String SYSP_testsuite_unavailable_host /* */ = "com.mysql.cj.testsuite.unavailable.host";
|
||||
|
||||
/** Option to indicate that the server was installed without the test package */
|
||||
public static final String SYSP_testsuite_no_server_testsuite /* */ = "com.mysql.cj.testsuite.no.server.testsuite";
|
||||
|
||||
/** For testsuite.regression.DataSourceRegressionTest */
|
||||
public static final String SYSP_testsuite_ds_host /* */ = "com.mysql.cj.testsuite.ds.host";
|
||||
/** For testsuite.regression.DataSourceRegressionTest */
|
||||
public static final String SYSP_testsuite_ds_port /* */ = "com.mysql.cj.testsuite.ds.port";
|
||||
/** For testsuite.regression.DataSourceRegressionTest */
|
||||
public static final String SYSP_testsuite_ds_db /* */ = "com.mysql.cj.testsuite.ds.db";
|
||||
/** For testsuite.regression.DataSourceRegressionTest */
|
||||
public static final String SYSP_testsuite_ds_user /* */ = "com.mysql.cj.testsuite.ds.user";
|
||||
/** For testsuite.regression.DataSourceRegressionTest */
|
||||
public static final String SYSP_testsuite_ds_password /* */ = "com.mysql.cj.testsuite.ds.password";
|
||||
|
||||
/** For testsuite.perf.LoadStorePerfTest */
|
||||
public static final String SYSP_testsuite_loadstoreperf_tabletype /* */ = "com.mysql.cj.testsuite.loadstoreperf.tabletype"; // TODO document allowed types
|
||||
/** For testsuite.perf.LoadStorePerfTest */
|
||||
public static final String SYSP_testsuite_loadstoreperf_useBigResults /* */ = "com.mysql.cj.testsuite.loadstoreperf.useBigResults";
|
||||
|
||||
/** The system property that must exist to run the shutdown test in testsuite.simple.MiniAdminTest */
|
||||
public static final String SYSP_testsuite_miniAdminTest_runShutdown /* */ = "com.mysql.cj.testsuite.miniAdminTest.runShutdown";
|
||||
|
||||
/** Suppress debug output when running testsuite */
|
||||
public static final String SYSP_testsuite_noDebugOutput /* */ = "com.mysql.cj.testsuite.noDebugOutput";
|
||||
/** Don't remove database object created by tests */
|
||||
public static final String SYSP_testsuite_retainArtifacts /* */ = "com.mysql.cj.testsuite.retainArtifacts";
|
||||
public static final String SYSP_testsuite_runLongTests /* */ = "com.mysql.cj.testsuite.runLongTests";
|
||||
public static final String SYSP_testsuite_serverController_basedir /* */ = "com.mysql.cj.testsuite.serverController.basedir";
|
||||
|
||||
/*
|
||||
* Build system properties.
|
||||
*/
|
||||
public static final String SYSP_com_mysql_cj_build_verbose /* */ = "com.mysql.cj.build.verbose";
|
||||
|
||||
/*
|
||||
* Categories of connection properties.
|
||||
*/
|
||||
public static final String CATEGORY_AUTH = Messages.getString("ConnectionProperties.categoryAuthentication");
|
||||
public static final String CATEGORY_CONNECTION = Messages.getString("ConnectionProperties.categoryConnection");
|
||||
public static final String CATEGORY_SESSION = Messages.getString("ConnectionProperties.categorySession");
|
||||
public static final String CATEGORY_NETWORK = Messages.getString("ConnectionProperties.categoryNetworking");
|
||||
public static final String CATEGORY_SECURITY = Messages.getString("ConnectionProperties.categorySecurity");
|
||||
public static final String CATEGORY_STATEMENTS = Messages.getString("ConnectionProperties.categoryStatements");
|
||||
public static final String CATEGORY_PREPARED_STATEMENTS = Messages.getString("ConnectionProperties.categoryPreparedStatements");
|
||||
public static final String CATEGORY_RESULT_SETS = Messages.getString("ConnectionProperties.categoryResultSets");
|
||||
public static final String CATEGORY_METADATA = Messages.getString("ConnectionProperties.categoryMetadata");
|
||||
public static final String CATEGORY_BLOBS = Messages.getString("ConnectionProperties.categoryBlobs");
|
||||
public static final String CATEGORY_DATETIMES = Messages.getString("ConnectionProperties.categoryDatetimes");
|
||||
public static final String CATEGORY_HA = Messages.getString("ConnectionProperties.categoryHA");
|
||||
public static final String CATEGORY_PERFORMANCE = Messages.getString("ConnectionProperties.categoryPerformance");
|
||||
public static final String CATEGORY_DEBUGING_PROFILING = Messages.getString("ConnectionProperties.categoryDebuggingProfiling");
|
||||
public static final String CATEGORY_EXCEPTIONS = Messages.getString("ConnectionProperties.categoryExceptions");
|
||||
public static final String CATEGORY_INTEGRATION = Messages.getString("ConnectionProperties.categoryIntegration");
|
||||
public static final String CATEGORY_JDBC = Messages.getString("ConnectionProperties.categoryJDBC");
|
||||
public static final String CATEGORY_XDEVAPI = Messages.getString("ConnectionProperties.categoryXDevAPI");
|
||||
public static final String CATEGORY_USER_DEFINED = Messages.getString("ConnectionProperties.categoryUserDefined");
|
||||
|
||||
public static final String[] PROPERTY_CATEGORIES = new String[] { CATEGORY_AUTH, CATEGORY_CONNECTION, CATEGORY_SESSION, CATEGORY_NETWORK, CATEGORY_SECURITY,
|
||||
CATEGORY_STATEMENTS, CATEGORY_PREPARED_STATEMENTS, CATEGORY_RESULT_SETS, CATEGORY_METADATA, CATEGORY_BLOBS, CATEGORY_DATETIMES, CATEGORY_HA,
|
||||
CATEGORY_PERFORMANCE, CATEGORY_DEBUGING_PROFILING, CATEGORY_EXCEPTIONS, CATEGORY_INTEGRATION, CATEGORY_JDBC, CATEGORY_XDEVAPI };
|
||||
|
||||
/*
|
||||
* Property modifiers.
|
||||
*/
|
||||
public static final boolean DEFAULT_VALUE_TRUE = true;
|
||||
public static final boolean DEFAULT_VALUE_FALSE = false;
|
||||
public static final String DEFAULT_VALUE_NULL_STRING = null;
|
||||
public static final String NO_ALIAS = null;
|
||||
|
||||
/** is modifiable in run-time */
|
||||
public static final boolean RUNTIME_MODIFIABLE = true;
|
||||
|
||||
/** is not modifiable in run-time (will allow to set not-null value only once) */
|
||||
public static final boolean RUNTIME_NOT_MODIFIABLE = false;
|
||||
|
||||
/*
|
||||
* Property enums.
|
||||
*/
|
||||
public enum ZeroDatetimeBehavior { // zeroDateTimeBehavior
|
||||
CONVERT_TO_NULL, EXCEPTION, ROUND;
|
||||
}
|
||||
|
||||
public enum SslMode {
|
||||
PREFERRED, REQUIRED, VERIFY_CA, VERIFY_IDENTITY, DISABLED;
|
||||
}
|
||||
|
||||
public enum XdevapiSslMode {
|
||||
REQUIRED, VERIFY_CA, VERIFY_IDENTITY, DISABLED;
|
||||
}
|
||||
|
||||
public enum AuthMech { // xdevapi.auth
|
||||
PLAIN, MYSQL41, SHA256_MEMORY, EXTERNAL;
|
||||
}
|
||||
|
||||
public enum Compression { // xdevapi.compress
|
||||
PREFERRED, REQUIRED, DISABLED;
|
||||
}
|
||||
|
||||
public enum DatabaseTerm {
|
||||
CATALOG, SCHEMA;
|
||||
}
|
||||
|
||||
/**
|
||||
* Static unmodifiable {@link PropertyKey} -> {@link PropertyDefinition} map.
|
||||
*/
|
||||
public static final Map<PropertyKey, PropertyDefinition<?>> PROPERTY_KEY_TO_PROPERTY_DEFINITION;
|
||||
|
||||
static {
|
||||
String STANDARD_LOGGER_NAME = StandardLogger.class.getName();
|
||||
|
||||
PropertyDefinition<?>[] pdefs = new PropertyDefinition<?>[] {
|
||||
//
|
||||
// CATEGORY_AUTHENTICATION
|
||||
//
|
||||
new StringPropertyDefinition(PropertyKey.USER, DEFAULT_VALUE_NULL_STRING, RUNTIME_NOT_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.Username"), Messages.getString("ConnectionProperties.allVersions"), CATEGORY_AUTH,
|
||||
Integer.MIN_VALUE + 1),
|
||||
|
||||
new StringPropertyDefinition(PropertyKey.PASSWORD, DEFAULT_VALUE_NULL_STRING, RUNTIME_NOT_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.Password"), Messages.getString("ConnectionProperties.allVersions"), CATEGORY_AUTH,
|
||||
Integer.MIN_VALUE + 2),
|
||||
|
||||
new StringPropertyDefinition(PropertyKey.authenticationPlugins, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.authenticationPlugins"), "5.1.19", CATEGORY_AUTH, Integer.MIN_VALUE + 3),
|
||||
|
||||
new StringPropertyDefinition(PropertyKey.disabledAuthenticationPlugins, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.disabledAuthenticationPlugins"), "5.1.19", CATEGORY_AUTH, Integer.MIN_VALUE + 4),
|
||||
|
||||
new StringPropertyDefinition(PropertyKey.defaultAuthenticationPlugin, "mysql_native_password", RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.defaultAuthenticationPlugin"), "5.1.19", CATEGORY_AUTH, Integer.MIN_VALUE + 5),
|
||||
|
||||
new StringPropertyDefinition(PropertyKey.ldapServerHostname, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.ldapServerHostname"), "8.0.23", CATEGORY_AUTH, Integer.MIN_VALUE + 6),
|
||||
|
||||
//
|
||||
// CATEGORY_CONNECTION
|
||||
//
|
||||
new StringPropertyDefinition(PropertyKey.passwordCharacterEncoding, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.passwordCharacterEncoding"), "5.1.7", CATEGORY_CONNECTION, Integer.MIN_VALUE),
|
||||
|
||||
new StringPropertyDefinition(PropertyKey.connectionAttributes, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.connectionAttributes"), "5.1.25", CATEGORY_CONNECTION, 7),
|
||||
|
||||
new StringPropertyDefinition(PropertyKey.clientInfoProvider, "com.mysql.cj.jdbc.CommentClientInfoProvider", RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.clientInfoProvider"), "5.1.0", CATEGORY_CONNECTION, Integer.MIN_VALUE),
|
||||
|
||||
new StringPropertyDefinition(PropertyKey.connectionLifecycleInterceptors, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.connectionLifecycleInterceptors"), "5.1.4", CATEGORY_CONNECTION, Integer.MAX_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.createDatabaseIfNotExist, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.createDatabaseIfNotExist"), "3.1.9", CATEGORY_CONNECTION, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.interactiveClient, DEFAULT_VALUE_FALSE, RUNTIME_NOT_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.interactiveClient"), "3.1.0", CATEGORY_CONNECTION, Integer.MIN_VALUE),
|
||||
|
||||
new StringPropertyDefinition(PropertyKey.propertiesTransform, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.connectionPropertiesTransform"), "3.1.4", CATEGORY_CONNECTION, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.rollbackOnPooledClose, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.rollbackOnPooledClose"), "3.0.15", CATEGORY_CONNECTION, Integer.MIN_VALUE),
|
||||
|
||||
new StringPropertyDefinition(PropertyKey.useConfigs, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.useConfigs"), "3.1.5", CATEGORY_CONNECTION, Integer.MAX_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.useAffectedRows, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.useAffectedRows"), "5.1.7", CATEGORY_CONNECTION, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.disconnectOnExpiredPasswords, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.disconnectOnExpiredPasswords"), "5.1.23", CATEGORY_CONNECTION, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.detectCustomCollations, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.detectCustomCollations"), "5.1.29", CATEGORY_CONNECTION, Integer.MIN_VALUE),
|
||||
|
||||
new EnumPropertyDefinition<>(PropertyKey.databaseTerm, DatabaseTerm.CATALOG, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.databaseTerm"), "8.0.17", CATEGORY_CONNECTION, Integer.MIN_VALUE),
|
||||
|
||||
//
|
||||
// CATEGORY_SESSION
|
||||
//
|
||||
new StringPropertyDefinition(PropertyKey.characterEncoding, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.characterEncoding"), "1.1g", CATEGORY_SESSION, Integer.MIN_VALUE),
|
||||
|
||||
new StringPropertyDefinition(PropertyKey.characterSetResults, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.characterSetResults"), "3.0.13", CATEGORY_SESSION, Integer.MIN_VALUE),
|
||||
|
||||
new StringPropertyDefinition(PropertyKey.customCharsetMapping, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.customCharsetMapping"), "8.0.26", CATEGORY_SESSION, Integer.MIN_VALUE),
|
||||
|
||||
new StringPropertyDefinition(PropertyKey.connectionCollation, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.connectionCollation"), "3.0.13", CATEGORY_SESSION, Integer.MIN_VALUE),
|
||||
|
||||
new StringPropertyDefinition(PropertyKey.sessionVariables, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.sessionVariables"), "3.1.8", CATEGORY_SESSION, Integer.MAX_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.trackSessionState, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.trackSessionState"), "8.0.26", CATEGORY_SESSION, Integer.MIN_VALUE),
|
||||
|
||||
//
|
||||
// CATEGORY_NETWORK
|
||||
//
|
||||
new BooleanPropertyDefinition(PropertyKey.useUnbufferedInput, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.useUnbufferedInput"), "3.0.11", CATEGORY_NETWORK, Integer.MIN_VALUE),
|
||||
|
||||
new IntegerPropertyDefinition(PropertyKey.connectTimeout, 0, RUNTIME_MODIFIABLE, Messages.getString("ConnectionProperties.connectTimeout"),
|
||||
"3.0.1", CATEGORY_NETWORK, 9, 0, Integer.MAX_VALUE),
|
||||
|
||||
new StringPropertyDefinition(PropertyKey.localSocketAddress, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.localSocketAddress"), "5.0.5", CATEGORY_NETWORK, Integer.MIN_VALUE),
|
||||
|
||||
new StringPropertyDefinition(PropertyKey.socketFactory, "com.mysql.cj.protocol.StandardSocketFactory", RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.socketFactory"), "3.0.3", CATEGORY_NETWORK, 4),
|
||||
|
||||
new StringPropertyDefinition(PropertyKey.socksProxyHost, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.socksProxyHost"), "5.1.34", CATEGORY_NETWORK, 1),
|
||||
|
||||
new IntegerPropertyDefinition(PropertyKey.socksProxyPort, 1080, RUNTIME_MODIFIABLE, Messages.getString("ConnectionProperties.socksProxyPort"),
|
||||
"5.1.34", CATEGORY_NETWORK, 2, 0, 65535),
|
||||
|
||||
new IntegerPropertyDefinition(PropertyKey.socketTimeout, 0, RUNTIME_MODIFIABLE, Messages.getString("ConnectionProperties.socketTimeout"),
|
||||
"3.0.1", CATEGORY_NETWORK, 10, 0, Integer.MAX_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.tcpNoDelay, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.tcpNoDelay"), "5.0.7", CATEGORY_NETWORK, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.tcpKeepAlive, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.tcpKeepAlive"), "5.0.7", CATEGORY_NETWORK, Integer.MIN_VALUE),
|
||||
|
||||
new IntegerPropertyDefinition(PropertyKey.tcpRcvBuf, 0, RUNTIME_MODIFIABLE, Messages.getString("ConnectionProperties.tcpSoRcvBuf"), "5.0.7",
|
||||
CATEGORY_NETWORK, Integer.MIN_VALUE, 0, Integer.MAX_VALUE),
|
||||
|
||||
new IntegerPropertyDefinition(PropertyKey.tcpSndBuf, 0, RUNTIME_MODIFIABLE, Messages.getString("ConnectionProperties.tcpSoSndBuf"), "5.0.7",
|
||||
CATEGORY_NETWORK, Integer.MIN_VALUE, 0, Integer.MAX_VALUE),
|
||||
|
||||
new IntegerPropertyDefinition(PropertyKey.tcpTrafficClass, 0, RUNTIME_MODIFIABLE, Messages.getString("ConnectionProperties.tcpTrafficClass"),
|
||||
"5.0.7", CATEGORY_NETWORK, Integer.MIN_VALUE, 0, 255),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.useCompression, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.useCompression"), "3.0.17", CATEGORY_NETWORK, Integer.MIN_VALUE),
|
||||
|
||||
new IntegerPropertyDefinition(PropertyKey.maxAllowedPacket, 65535, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.maxAllowedPacket"), "5.1.8", CATEGORY_NETWORK, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.dnsSrv, DEFAULT_VALUE_FALSE, RUNTIME_NOT_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.dnsSrv"), "8.0.19", CATEGORY_NETWORK, Integer.MIN_VALUE),
|
||||
|
||||
//
|
||||
// CATEGORY_SECURITY
|
||||
//
|
||||
new BooleanPropertyDefinition(PropertyKey.paranoid, DEFAULT_VALUE_FALSE, RUNTIME_NOT_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.paranoid"), "3.0.1", CATEGORY_SECURITY, 1),
|
||||
|
||||
new StringPropertyDefinition(PropertyKey.serverRSAPublicKeyFile, DEFAULT_VALUE_NULL_STRING, RUNTIME_NOT_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.serverRSAPublicKeyFile"), "5.1.31", CATEGORY_SECURITY, 2),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.allowPublicKeyRetrieval, DEFAULT_VALUE_FALSE, RUNTIME_NOT_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.allowPublicKeyRetrieval"), "5.1.31", CATEGORY_SECURITY, 3),
|
||||
|
||||
new EnumPropertyDefinition<>(PropertyKey.sslMode, SslMode.PREFERRED, RUNTIME_MODIFIABLE, Messages.getString("ConnectionProperties.sslMode"),
|
||||
"8.0.13", CATEGORY_SECURITY, 4),
|
||||
|
||||
new StringPropertyDefinition(PropertyKey.trustCertificateKeyStoreUrl, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.trustCertificateKeyStoreUrl"), "5.1.0", CATEGORY_SECURITY, 5),
|
||||
|
||||
new StringPropertyDefinition(PropertyKey.trustCertificateKeyStoreType, "JKS", RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.trustCertificateKeyStoreType"), "5.1.0", CATEGORY_SECURITY, 6),
|
||||
|
||||
new StringPropertyDefinition(PropertyKey.trustCertificateKeyStorePassword, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.trustCertificateKeyStorePassword"), "5.1.0", CATEGORY_SECURITY, 7),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.fallbackToSystemTrustStore, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.fallbackToSystemTrustStore"), "8.0.22", CATEGORY_SECURITY, 8),
|
||||
|
||||
new StringPropertyDefinition(PropertyKey.clientCertificateKeyStoreUrl, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.clientCertificateKeyStoreUrl"), "5.1.0", CATEGORY_SECURITY, 9),
|
||||
|
||||
new StringPropertyDefinition(PropertyKey.clientCertificateKeyStoreType, "JKS", RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.clientCertificateKeyStoreType"), "5.1.0", CATEGORY_SECURITY, 10),
|
||||
|
||||
new StringPropertyDefinition(PropertyKey.clientCertificateKeyStorePassword, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.clientCertificateKeyStorePassword"), "5.1.0", CATEGORY_SECURITY, 11),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.fallbackToSystemKeyStore, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.fallbackToSystemKeyStore"), "8.0.22", CATEGORY_SECURITY, 12),
|
||||
|
||||
new StringPropertyDefinition(PropertyKey.enabledSSLCipherSuites, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.enabledSSLCipherSuites"), "5.1.35", CATEGORY_SECURITY, 13),
|
||||
|
||||
new StringPropertyDefinition(PropertyKey.enabledTLSProtocols, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.enabledTLSProtocols"), "8.0.8", CATEGORY_SECURITY, 14),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.allowLoadLocalInfile, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.loadDataLocal"), "3.0.3", CATEGORY_SECURITY, Integer.MAX_VALUE),
|
||||
|
||||
new StringPropertyDefinition(PropertyKey.allowLoadLocalInfileInPath, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.loadDataLocalInPath"), "8.0.22", CATEGORY_SECURITY, Integer.MAX_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.allowMultiQueries, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.allowMultiQueries"), "3.1.1", CATEGORY_SECURITY, Integer.MAX_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.allowUrlInLocalInfile, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.allowUrlInLoadLocal"), "3.1.4", CATEGORY_SECURITY, Integer.MAX_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.useSSL, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE, Messages.getString("ConnectionProperties.useSSL"),
|
||||
"3.0.2", CATEGORY_SECURITY, Integer.MAX_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.requireSSL, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.requireSSL"), "3.1.0", CATEGORY_SECURITY, Integer.MAX_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.verifyServerCertificate, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.verifyServerCertificate"), "5.1.6", CATEGORY_SECURITY, Integer.MAX_VALUE),
|
||||
|
||||
//
|
||||
// CATEGORY_STATEMENTS
|
||||
//
|
||||
new BooleanPropertyDefinition(PropertyKey.continueBatchOnError, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.continueBatchOnError"), "3.0.3", CATEGORY_STATEMENTS, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.dontTrackOpenResources, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.dontTrackOpenResources"), "3.1.7", CATEGORY_STATEMENTS, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.queryTimeoutKillsConnection, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.queryTimeoutKillsConnection"), "5.1.9", CATEGORY_STATEMENTS, Integer.MIN_VALUE),
|
||||
|
||||
new StringPropertyDefinition(PropertyKey.queryInterceptors, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.queryInterceptors"), "8.0.7", CATEGORY_STATEMENTS, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.cacheDefaultTimeZone, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.cacheDefaultTimeZone"), "8.0.20", CATEGORY_STATEMENTS, Integer.MIN_VALUE),
|
||||
|
||||
//
|
||||
// CATEGORY_PREPARED_STATEMENTS
|
||||
//
|
||||
new BooleanPropertyDefinition(PropertyKey.allowNanAndInf, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.allowNANandINF"), "3.1.5", CATEGORY_PREPARED_STATEMENTS, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.autoClosePStmtStreams, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.autoClosePstmtStreams"), "3.1.12", CATEGORY_PREPARED_STATEMENTS, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.compensateOnDuplicateKeyUpdateCounts, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.compensateOnDuplicateKeyUpdateCounts"), "5.1.7", CATEGORY_PREPARED_STATEMENTS,
|
||||
Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.useServerPrepStmts, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.useServerPrepStmts"), "3.1.0", CATEGORY_PREPARED_STATEMENTS, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.emulateUnsupportedPstmts, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.emulateUnsupportedPstmts"), "3.1.7", CATEGORY_PREPARED_STATEMENTS, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.generateSimpleParameterMetadata, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.generateSimpleParameterMetadata"), "5.0.5", CATEGORY_PREPARED_STATEMENTS, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.processEscapeCodesForPrepStmts, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.processEscapeCodesForPrepStmts"), "3.1.12", CATEGORY_PREPARED_STATEMENTS, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.useStreamLengthsInPrepStmts, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.useStreamLengthsInPrepStmts"), "3.0.2", CATEGORY_PREPARED_STATEMENTS, Integer.MIN_VALUE),
|
||||
|
||||
//
|
||||
// CATEGORY_RESULT_SETS
|
||||
//
|
||||
new BooleanPropertyDefinition(PropertyKey.clobberStreamingResults, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.clobberStreamingResults"), "3.0.9", CATEGORY_RESULT_SETS, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.emptyStringsConvertToZero, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.emptyStringsConvertToZero"), "3.1.8", CATEGORY_RESULT_SETS, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.holdResultsOpenOverStatementClose, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.holdRSOpenOverStmtClose"), "3.1.7", CATEGORY_RESULT_SETS, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.jdbcCompliantTruncation, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.jdbcCompliantTruncation"), "3.1.2", CATEGORY_RESULT_SETS, Integer.MIN_VALUE),
|
||||
|
||||
new IntegerPropertyDefinition(PropertyKey.maxRows, -1, RUNTIME_MODIFIABLE, Messages.getString("ConnectionProperties.maxRows"),
|
||||
Messages.getString("ConnectionProperties.allVersions"), CATEGORY_RESULT_SETS, Integer.MIN_VALUE, -1, Integer.MAX_VALUE),
|
||||
|
||||
new IntegerPropertyDefinition(PropertyKey.netTimeoutForStreamingResults, 600, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.netTimeoutForStreamingResults"), "5.1.0", CATEGORY_RESULT_SETS, Integer.MIN_VALUE, 0,
|
||||
Integer.MAX_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.padCharsWithSpace, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.padCharsWithSpace"), "5.0.6", CATEGORY_RESULT_SETS, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.populateInsertRowWithDefaultValues, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.populateInsertRowWithDefaultValues"), "5.0.5", CATEGORY_RESULT_SETS, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.strictUpdates, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.strictUpdates"), "3.0.4", CATEGORY_RESULT_SETS, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.tinyInt1isBit, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.tinyInt1isBit"), "3.0.16", CATEGORY_RESULT_SETS, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.transformedBitIsBoolean, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.transformedBitIsBoolean"), "3.1.9", CATEGORY_RESULT_SETS, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.scrollTolerantForwardOnly, DEFAULT_VALUE_FALSE, RUNTIME_NOT_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.scrollTolerantForwardOnly"), "8.0.24", CATEGORY_RESULT_SETS, Integer.MIN_VALUE),
|
||||
|
||||
//
|
||||
// CATEGORY_METADATA
|
||||
//
|
||||
new BooleanPropertyDefinition(PropertyKey.noAccessToProcedureBodies, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.noAccessToProcedureBodies"), "5.0.3", CATEGORY_METADATA, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.nullDatabaseMeansCurrent, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.nullCatalogMeansCurrent"), "3.1.8", CATEGORY_METADATA, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.useHostsInPrivileges, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.useHostsInPrivileges"), "3.0.2", CATEGORY_METADATA, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.useInformationSchema, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.useInformationSchema"), "5.0.0", CATEGORY_METADATA, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.getProceduresReturnsFunctions, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.getProceduresReturnsFunctions"), "5.1.26", CATEGORY_METADATA, Integer.MIN_VALUE),
|
||||
|
||||
//
|
||||
// CATEGORY_BLOBS
|
||||
//
|
||||
new BooleanPropertyDefinition(PropertyKey.autoDeserialize, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.autoDeserialize"), "3.1.5", CATEGORY_BLOBS, Integer.MIN_VALUE),
|
||||
|
||||
new MemorySizePropertyDefinition(PropertyKey.blobSendChunkSize, 1024 * 1024, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.blobSendChunkSize"), "3.1.9", CATEGORY_BLOBS, Integer.MIN_VALUE, 0, 0),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.blobsAreStrings, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.blobsAreStrings"), "5.0.8", CATEGORY_BLOBS, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.functionsNeverReturnBlobs, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.functionsNeverReturnBlobs"), "5.0.8", CATEGORY_BLOBS, Integer.MIN_VALUE),
|
||||
|
||||
new StringPropertyDefinition(PropertyKey.clobCharacterEncoding, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.clobCharacterEncoding"), "5.0.0", CATEGORY_BLOBS, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.emulateLocators, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.emulateLocators"), "3.1.0", CATEGORY_BLOBS, Integer.MIN_VALUE),
|
||||
|
||||
new MemorySizePropertyDefinition(PropertyKey.locatorFetchBufferSize, 1024 * 1024, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.locatorFetchBufferSize"), "3.2.1", CATEGORY_BLOBS, Integer.MIN_VALUE, 0, Integer.MAX_VALUE),
|
||||
|
||||
//
|
||||
// CATEGORY_DATETIMES
|
||||
//
|
||||
new BooleanPropertyDefinition(PropertyKey.noDatetimeStringSync, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.noDatetimeStringSync"), "3.1.7", CATEGORY_DATETIMES, Integer.MIN_VALUE),
|
||||
|
||||
new StringPropertyDefinition(PropertyKey.connectionTimeZone, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.connectionTimeZone"), "3.0.2", CATEGORY_DATETIMES, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.forceConnectionTimeZoneToSession, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.forceConnectionTimeZoneToSession"), "8.0.23", CATEGORY_DATETIMES, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.preserveInstants, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.preserveInstants"), "8.0.23", CATEGORY_DATETIMES, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.treatUtilDateAsTimestamp, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.treatUtilDateAsTimestamp"), "5.0.5", CATEGORY_DATETIMES, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.sendFractionalSeconds, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.sendFractionalSeconds"), "5.1.37", CATEGORY_DATETIMES, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.sendFractionalSecondsForTime, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.sendFractionalSecondsForTime"), "8.0.23", CATEGORY_DATETIMES, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.yearIsDateType, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.yearIsDateType"), "3.1.9", CATEGORY_DATETIMES, Integer.MIN_VALUE),
|
||||
|
||||
new EnumPropertyDefinition<>(PropertyKey.zeroDateTimeBehavior, ZeroDatetimeBehavior.EXCEPTION, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.zeroDateTimeBehavior",
|
||||
new Object[] { ZeroDatetimeBehavior.EXCEPTION, ZeroDatetimeBehavior.ROUND, ZeroDatetimeBehavior.CONVERT_TO_NULL }),
|
||||
"3.1.4", CATEGORY_DATETIMES, Integer.MIN_VALUE),
|
||||
|
||||
//
|
||||
// CATEGORY_HA
|
||||
//
|
||||
new BooleanPropertyDefinition(PropertyKey.allowSourceDownConnections, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.allowSourceDownConnections"), "5.1.27", CATEGORY_HA, Integer.MAX_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.allowReplicaDownConnections, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.allowReplicaDownConnections"), "6.0.2", CATEGORY_HA, Integer.MAX_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.readFromSourceWhenNoReplicas, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.readFromSourceWhenNoReplicas"), "6.0.2", CATEGORY_HA, Integer.MAX_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.autoReconnect, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.autoReconnect"), "1.1", CATEGORY_HA, 0),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.autoReconnectForPools, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.autoReconnectForPools"), "3.1.3", CATEGORY_HA, 1),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.failOverReadOnly, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.failoverReadOnly"), "3.0.12", CATEGORY_HA, 2),
|
||||
|
||||
new IntegerPropertyDefinition(PropertyKey.initialTimeout, 2, RUNTIME_NOT_MODIFIABLE, Messages.getString("ConnectionProperties.initialTimeout"),
|
||||
"1.1", CATEGORY_HA, 5, 1, Integer.MAX_VALUE),
|
||||
|
||||
new StringPropertyDefinition(PropertyKey.ha_loadBalanceStrategy, "random", RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.loadBalanceStrategy"), "5.0.6", CATEGORY_HA, Integer.MIN_VALUE),
|
||||
|
||||
new IntegerPropertyDefinition(PropertyKey.loadBalanceBlocklistTimeout, 0, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.loadBalanceBlocklistTimeout"), "5.1.0", CATEGORY_HA, Integer.MIN_VALUE, 0, Integer.MAX_VALUE),
|
||||
|
||||
new IntegerPropertyDefinition(PropertyKey.loadBalancePingTimeout, 0, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.loadBalancePingTimeout"), "5.1.13", CATEGORY_HA, Integer.MIN_VALUE, 0, Integer.MAX_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.loadBalanceValidateConnectionOnSwapServer, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.loadBalanceValidateConnectionOnSwapServer"), "5.1.13", CATEGORY_HA, Integer.MIN_VALUE),
|
||||
|
||||
new StringPropertyDefinition(PropertyKey.loadBalanceConnectionGroup, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.loadBalanceConnectionGroup"), "5.1.13", CATEGORY_HA, Integer.MIN_VALUE),
|
||||
|
||||
new StringPropertyDefinition(PropertyKey.loadBalanceExceptionChecker, "com.mysql.cj.jdbc.ha.StandardLoadBalanceExceptionChecker",
|
||||
RUNTIME_MODIFIABLE, Messages.getString("ConnectionProperties.loadBalanceExceptionChecker"), "5.1.13", CATEGORY_HA, Integer.MIN_VALUE),
|
||||
|
||||
new StringPropertyDefinition(PropertyKey.loadBalanceSQLStateFailover, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.loadBalanceSQLStateFailover"), "5.1.13", CATEGORY_HA, Integer.MIN_VALUE),
|
||||
|
||||
new StringPropertyDefinition(PropertyKey.loadBalanceSQLExceptionSubclassFailover, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.loadBalanceSQLExceptionSubclassFailover"), "5.1.13", CATEGORY_HA, Integer.MIN_VALUE),
|
||||
|
||||
new StringPropertyDefinition(PropertyKey.loadBalanceAutoCommitStatementRegex, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.loadBalanceAutoCommitStatementRegex"), "5.1.15", CATEGORY_HA, Integer.MIN_VALUE),
|
||||
|
||||
new IntegerPropertyDefinition(PropertyKey.loadBalanceAutoCommitStatementThreshold, 0, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.loadBalanceAutoCommitStatementThreshold"), "5.1.15", CATEGORY_HA, Integer.MIN_VALUE, 0,
|
||||
Integer.MAX_VALUE),
|
||||
|
||||
new IntegerPropertyDefinition(PropertyKey.maxReconnects, 3, RUNTIME_MODIFIABLE, Messages.getString("ConnectionProperties.maxReconnects"), "1.1",
|
||||
CATEGORY_HA, 4, 1, Integer.MAX_VALUE),
|
||||
|
||||
new IntegerPropertyDefinition(PropertyKey.retriesAllDown, 120, RUNTIME_MODIFIABLE, Messages.getString("ConnectionProperties.retriesAllDown"),
|
||||
"5.1.6", CATEGORY_HA, 4, 0, Integer.MAX_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.pinGlobalTxToPhysicalConnection, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.pinGlobalTxToPhysicalConnection"), "5.0.1", CATEGORY_HA, Integer.MIN_VALUE),
|
||||
|
||||
new IntegerPropertyDefinition(PropertyKey.queriesBeforeRetrySource, 50, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.queriesBeforeRetrySource"), "3.0.2", CATEGORY_HA, 7, 0, Integer.MAX_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.reconnectAtTxEnd, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.reconnectAtTxEnd"), "3.0.10", CATEGORY_HA, 4),
|
||||
|
||||
new StringPropertyDefinition(PropertyKey.replicationConnectionGroup, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.replicationConnectionGroup"), "8.0.7", CATEGORY_HA, Integer.MIN_VALUE),
|
||||
|
||||
new StringPropertyDefinition(PropertyKey.resourceId, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.resourceId"), "5.0.1", CATEGORY_HA, Integer.MIN_VALUE),
|
||||
|
||||
new IntegerPropertyDefinition(PropertyKey.secondsBeforeRetrySource, 30, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.secondsBeforeRetrySource"), "3.0.2", CATEGORY_HA, 8, 0, Integer.MAX_VALUE),
|
||||
|
||||
new IntegerPropertyDefinition(PropertyKey.selfDestructOnPingSecondsLifetime, 0, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.selfDestructOnPingSecondsLifetime"), "5.1.6", CATEGORY_HA, Integer.MAX_VALUE, 0,
|
||||
Integer.MAX_VALUE),
|
||||
|
||||
new IntegerPropertyDefinition(PropertyKey.selfDestructOnPingMaxOperations, 0, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.selfDestructOnPingMaxOperations"), "5.1.6", CATEGORY_HA, Integer.MAX_VALUE, 0,
|
||||
Integer.MAX_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.ha_enableJMX, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.ha.enableJMX"), "5.1.27", CATEGORY_HA, Integer.MAX_VALUE),
|
||||
|
||||
new IntegerPropertyDefinition(PropertyKey.loadBalanceHostRemovalGracePeriod, 15000, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.loadBalanceHostRemovalGracePeriod"), "6.0.3", CATEGORY_HA, Integer.MAX_VALUE, 0,
|
||||
Integer.MAX_VALUE),
|
||||
|
||||
new StringPropertyDefinition(PropertyKey.serverAffinityOrder, DEFAULT_VALUE_NULL_STRING, RUNTIME_NOT_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.serverAffinityOrder"), "8.0.8", CATEGORY_HA, Integer.MIN_VALUE),
|
||||
|
||||
//
|
||||
// CATEGORY_PERFORMANCE
|
||||
//
|
||||
new BooleanPropertyDefinition(PropertyKey.alwaysSendSetIsolation, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.alwaysSendSetIsolation"), "3.1.7", CATEGORY_PERFORMANCE, Integer.MAX_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.cacheCallableStmts, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.cacheCallableStatements"), "3.1.2", CATEGORY_PERFORMANCE, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.cachePrepStmts, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.cachePrepStmts"), "3.0.10", CATEGORY_PERFORMANCE, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.cacheResultSetMetadata, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.cacheRSMetadata"), "3.1.1", CATEGORY_PERFORMANCE, Integer.MIN_VALUE),
|
||||
|
||||
new StringPropertyDefinition(PropertyKey.serverConfigCacheFactory, PerVmServerConfigCacheFactory.class.getName(), RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.serverConfigCacheFactory"), "5.1.1", CATEGORY_PERFORMANCE, 12),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.cacheServerConfiguration, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.cacheServerConfiguration"), "3.1.5", CATEGORY_PERFORMANCE, Integer.MIN_VALUE),
|
||||
|
||||
new IntegerPropertyDefinition(PropertyKey.callableStmtCacheSize, 100, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.callableStmtCacheSize"), "3.1.2", CATEGORY_PERFORMANCE, 5, 0, Integer.MAX_VALUE),
|
||||
|
||||
new IntegerPropertyDefinition(PropertyKey.defaultFetchSize, 0, RUNTIME_MODIFIABLE, Messages.getString("ConnectionProperties.defaultFetchSize"),
|
||||
"3.1.9", CATEGORY_PERFORMANCE, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.elideSetAutoCommits, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.eliseSetAutoCommit"), "3.1.3", CATEGORY_PERFORMANCE, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.enableQueryTimeouts, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.enableQueryTimeouts"), "5.0.6", CATEGORY_PERFORMANCE, Integer.MIN_VALUE),
|
||||
|
||||
new MemorySizePropertyDefinition(PropertyKey.largeRowSizeThreshold, 2048, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.largeRowSizeThreshold"), "5.1.1", CATEGORY_PERFORMANCE, Integer.MIN_VALUE, 0,
|
||||
Integer.MAX_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.maintainTimeStats, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.maintainTimeStats"), "3.1.9", CATEGORY_PERFORMANCE, Integer.MAX_VALUE),
|
||||
|
||||
new IntegerPropertyDefinition(PropertyKey.metadataCacheSize, 50, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.metadataCacheSize"), "3.1.1", CATEGORY_PERFORMANCE, 5, 1, Integer.MAX_VALUE),
|
||||
|
||||
new IntegerPropertyDefinition(PropertyKey.prepStmtCacheSize, 25, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.prepStmtCacheSize"), "3.0.10", CATEGORY_PERFORMANCE, 10, 0, Integer.MAX_VALUE),
|
||||
|
||||
new IntegerPropertyDefinition(PropertyKey.prepStmtCacheSqlLimit, 256, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.prepStmtCacheSqlLimit"), "3.0.10", CATEGORY_PERFORMANCE, 11, 1, Integer.MAX_VALUE),
|
||||
|
||||
new StringPropertyDefinition(PropertyKey.parseInfoCacheFactory, PerConnectionLRUFactory.class.getName(), RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.parseInfoCacheFactory"), "5.1.1", CATEGORY_PERFORMANCE, 12),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.rewriteBatchedStatements, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.rewriteBatchedStatements"), "3.1.13", CATEGORY_PERFORMANCE, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.useCursorFetch, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.useCursorFetch"), "5.0.0", CATEGORY_PERFORMANCE, Integer.MAX_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.useLocalSessionState, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.useLocalSessionState"), "3.1.7", CATEGORY_PERFORMANCE, 5),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.useLocalTransactionState, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.useLocalTransactionState"), "5.1.7", CATEGORY_PERFORMANCE, 6),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.useReadAheadInput, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.useReadAheadInput"), "3.1.5", CATEGORY_PERFORMANCE, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.dontCheckOnDuplicateKeyUpdateInSQL, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.dontCheckOnDuplicateKeyUpdateInSQL"), "5.1.32", CATEGORY_PERFORMANCE, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.readOnlyPropagatesToServer, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.readOnlyPropagatesToServer"), "5.1.35", CATEGORY_PERFORMANCE, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.enableEscapeProcessing, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.enableEscapeProcessing"), "6.0.1", CATEGORY_PERFORMANCE, Integer.MIN_VALUE),
|
||||
|
||||
//
|
||||
// CATEGORY_DEBUGING_PROFILING
|
||||
//
|
||||
new StringPropertyDefinition(PropertyKey.logger, STANDARD_LOGGER_NAME, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.logger", new Object[] { Log.class.getName(), STANDARD_LOGGER_NAME }), "3.1.1",
|
||||
CATEGORY_DEBUGING_PROFILING, 0),
|
||||
|
||||
new StringPropertyDefinition(PropertyKey.profilerEventHandler, "com.mysql.cj.log.LoggingProfilerEventHandler", RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.profilerEventHandler"), "5.1.6", CATEGORY_DEBUGING_PROFILING, 1),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.useNanosForElapsedTime, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.useNanosForElapsedTime"), "5.0.7", CATEGORY_DEBUGING_PROFILING, 2),
|
||||
|
||||
new IntegerPropertyDefinition(PropertyKey.maxQuerySizeToLog, 2048, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.maxQuerySizeToLog"), "3.1.3", CATEGORY_DEBUGING_PROFILING, 3, 0, Integer.MAX_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.profileSQL, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.profileSQL"), "3.1.0", CATEGORY_DEBUGING_PROFILING, 4),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.logSlowQueries, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.logSlowQueries"), "3.1.2", CATEGORY_DEBUGING_PROFILING, 5),
|
||||
|
||||
new IntegerPropertyDefinition(PropertyKey.slowQueryThresholdMillis, 2000, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.slowQueryThresholdMillis"), "3.1.2", CATEGORY_DEBUGING_PROFILING, 6, 0, Integer.MAX_VALUE),
|
||||
|
||||
new LongPropertyDefinition(PropertyKey.slowQueryThresholdNanos, 0, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.slowQueryThresholdNanos"), "5.0.7", CATEGORY_DEBUGING_PROFILING, 7),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.autoSlowLog, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.autoSlowLog"), "5.1.4", CATEGORY_DEBUGING_PROFILING, 8),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.explainSlowQueries, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.explainSlowQueries"), "3.1.2", CATEGORY_DEBUGING_PROFILING, 9),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.gatherPerfMetrics, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.gatherPerfMetrics"), "3.1.2", CATEGORY_DEBUGING_PROFILING, 10),
|
||||
|
||||
new IntegerPropertyDefinition(PropertyKey.reportMetricsIntervalMillis, 30000, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.reportMetricsIntervalMillis"), "3.1.2", CATEGORY_DEBUGING_PROFILING, 11, 0, Integer.MAX_VALUE), // TODO currently is not used !!!
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.logXaCommands, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.logXaCommands"), "5.0.5", CATEGORY_DEBUGING_PROFILING, 12),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.traceProtocol, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.traceProtocol"), "3.1.2", CATEGORY_DEBUGING_PROFILING, 13),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.enablePacketDebug, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.enablePacketDebug"), "3.1.3", CATEGORY_DEBUGING_PROFILING, 14),
|
||||
|
||||
new IntegerPropertyDefinition(PropertyKey.packetDebugBufferSize, 20, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.packetDebugBufferSize"), "3.1.3", CATEGORY_DEBUGING_PROFILING, 15, 1, Integer.MAX_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.useUsageAdvisor, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.useUsageAdvisor"), "3.1.1", CATEGORY_DEBUGING_PROFILING, 16),
|
||||
|
||||
new IntegerPropertyDefinition(PropertyKey.resultSetSizeThreshold, 100, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.resultSetSizeThreshold"), "5.0.5", CATEGORY_DEBUGING_PROFILING, 17),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.autoGenerateTestcaseScript, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.autoGenerateTestcaseScript"), "3.1.9", CATEGORY_DEBUGING_PROFILING, 18),
|
||||
|
||||
//
|
||||
// CATEGORY_EXCEPTIONS
|
||||
//
|
||||
new BooleanPropertyDefinition(PropertyKey.dumpQueriesOnException, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.dumpQueriesOnException"), "3.1.3", CATEGORY_EXCEPTIONS, Integer.MIN_VALUE),
|
||||
|
||||
new StringPropertyDefinition(PropertyKey.exceptionInterceptors, DEFAULT_VALUE_NULL_STRING, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.exceptionInterceptors"), "5.1.8", CATEGORY_EXCEPTIONS, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.includeInnodbStatusInDeadlockExceptions, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.includeInnodbStatusInDeadlockExceptions"), "5.0.7", CATEGORY_EXCEPTIONS, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.includeThreadDumpInDeadlockExceptions, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.includeThreadDumpInDeadlockExceptions"), "5.1.15", CATEGORY_EXCEPTIONS, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.includeThreadNamesAsStatementComment, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.includeThreadNamesAsStatementComment"), "5.1.15", CATEGORY_EXCEPTIONS, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.ignoreNonTxTables, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.ignoreNonTxTables"), "3.0.9", CATEGORY_EXCEPTIONS, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.useOnlyServerErrorMessages, DEFAULT_VALUE_TRUE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.useOnlyServerErrorMessages"), "3.0.15", CATEGORY_EXCEPTIONS, Integer.MIN_VALUE),
|
||||
|
||||
//
|
||||
// CATEGORY_INTEGRATION
|
||||
//
|
||||
new BooleanPropertyDefinition(PropertyKey.overrideSupportsIntegrityEnhancementFacility, false, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.overrideSupportsIEF"), "3.1.12", CATEGORY_INTEGRATION, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.ultraDevHack, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.ultraDevHack"), "2.0.3", CATEGORY_INTEGRATION, Integer.MIN_VALUE),
|
||||
|
||||
//
|
||||
// CATEGORY_JDBC
|
||||
//
|
||||
new BooleanPropertyDefinition(PropertyKey.pedantic, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.pedantic"), "3.0.0", CATEGORY_JDBC, Integer.MIN_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.useColumnNamesInFindColumn, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.useColumnNamesInFindColumn"), "5.1.7", CATEGORY_JDBC, Integer.MAX_VALUE),
|
||||
|
||||
new BooleanPropertyDefinition(PropertyKey.useOldAliasMetadataBehavior, DEFAULT_VALUE_FALSE, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.useOldAliasMetadataBehavior"), "5.0.4", CATEGORY_JDBC, Integer.MIN_VALUE),
|
||||
|
||||
//
|
||||
// CATEGORY_XDEVAPI
|
||||
//
|
||||
new EnumPropertyDefinition<>(PropertyKey.xdevapiSslMode, XdevapiSslMode.REQUIRED, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.xdevapiSslMode"), "8.0.7", CATEGORY_XDEVAPI, Integer.MIN_VALUE),
|
||||
new StringPropertyDefinition(PropertyKey.xdevapiTlsCiphersuites, DEFAULT_VALUE_NULL_STRING, RUNTIME_NOT_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.xdevapiTlsCiphersuites"), "8.0.19", CATEGORY_XDEVAPI, Integer.MIN_VALUE),
|
||||
new StringPropertyDefinition(PropertyKey.xdevapiTlsVersions, DEFAULT_VALUE_NULL_STRING, RUNTIME_NOT_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.xdevapiTlsVersions"), "8.0.19", CATEGORY_XDEVAPI, Integer.MIN_VALUE),
|
||||
new StringPropertyDefinition(PropertyKey.xdevapiSslKeyStoreUrl, DEFAULT_VALUE_NULL_STRING, RUNTIME_NOT_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.xdevapiSslKeyStoreUrl"), "8.0.22", CATEGORY_XDEVAPI, Integer.MIN_VALUE),
|
||||
new StringPropertyDefinition(PropertyKey.xdevapiSslKeyStorePassword, DEFAULT_VALUE_NULL_STRING, RUNTIME_NOT_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.xdevapiSslKeyStorePassword"), "8.0.22", CATEGORY_XDEVAPI, Integer.MIN_VALUE),
|
||||
new StringPropertyDefinition(PropertyKey.xdevapiSslKeyStoreType, "JKS", RUNTIME_NOT_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.xdevapiSslKeyStoreType"), "8.0.22", CATEGORY_XDEVAPI, Integer.MIN_VALUE),
|
||||
new BooleanPropertyDefinition(PropertyKey.xdevapiFallbackToSystemKeyStore, DEFAULT_VALUE_TRUE, RUNTIME_NOT_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.xdevapiFallbackToSystemKeyStore"), "8.0.22", CATEGORY_XDEVAPI, Integer.MIN_VALUE),
|
||||
new StringPropertyDefinition(PropertyKey.xdevapiSslTrustStoreUrl, DEFAULT_VALUE_NULL_STRING, RUNTIME_NOT_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.xdevapiSslTrustStoreUrl"), "6.0.6", CATEGORY_XDEVAPI, Integer.MIN_VALUE),
|
||||
new StringPropertyDefinition(PropertyKey.xdevapiSslTrustStorePassword, DEFAULT_VALUE_NULL_STRING, RUNTIME_NOT_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.xdevapiSslTrustStorePassword"), "6.0.6", CATEGORY_XDEVAPI, Integer.MIN_VALUE),
|
||||
new StringPropertyDefinition(PropertyKey.xdevapiSslTrustStoreType, "JKS", RUNTIME_NOT_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.xdevapiSslTrustStoreType"), "6.0.6", CATEGORY_XDEVAPI, Integer.MIN_VALUE),
|
||||
new BooleanPropertyDefinition(PropertyKey.xdevapiFallbackToSystemTrustStore, DEFAULT_VALUE_TRUE, RUNTIME_NOT_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.xdevapiFallbackToSystemTrustStore"), "8.0.22", CATEGORY_XDEVAPI, Integer.MIN_VALUE),
|
||||
new EnumPropertyDefinition<>(PropertyKey.xdevapiAuth, AuthMech.PLAIN, RUNTIME_NOT_MODIFIABLE, Messages.getString("ConnectionProperties.auth"),
|
||||
"8.0.8", CATEGORY_XDEVAPI, Integer.MIN_VALUE),
|
||||
new IntegerPropertyDefinition(PropertyKey.xdevapiConnectTimeout, 10000, RUNTIME_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.xdevapiConnectTimeout"), "8.0.13", CATEGORY_XDEVAPI, Integer.MIN_VALUE, 0, Integer.MAX_VALUE),
|
||||
new StringPropertyDefinition(PropertyKey.xdevapiConnectionAttributes, DEFAULT_VALUE_NULL_STRING, RUNTIME_NOT_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.xdevapiConnectionAttributes"), "8.0.16", CATEGORY_XDEVAPI, Integer.MIN_VALUE),
|
||||
new BooleanPropertyDefinition(PropertyKey.xdevapiDnsSrv, DEFAULT_VALUE_FALSE, RUNTIME_NOT_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.xdevapiDnsSrv"), "8.0.19", CATEGORY_XDEVAPI, Integer.MIN_VALUE),
|
||||
new EnumPropertyDefinition<>(PropertyKey.xdevapiCompression, Compression.PREFERRED, RUNTIME_NOT_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.xdevapiCompression"), "8.0.20", CATEGORY_XDEVAPI, Integer.MIN_VALUE),
|
||||
new StringPropertyDefinition(PropertyKey.xdevapiCompressionAlgorithms, "zstd_stream,lz4_message,deflate_stream", RUNTIME_NOT_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.xdevapiCompressionAlgorithms"), "8.0.22", CATEGORY_XDEVAPI, Integer.MIN_VALUE),
|
||||
new StringPropertyDefinition(PropertyKey.xdevapiCompressionExtensions, DEFAULT_VALUE_NULL_STRING, RUNTIME_NOT_MODIFIABLE,
|
||||
Messages.getString("ConnectionProperties.xdevapiCompressionExtensions"), "8.0.22", CATEGORY_XDEVAPI, Integer.MIN_VALUE)
|
||||
//
|
||||
};
|
||||
|
||||
HashMap<PropertyKey, PropertyDefinition<?>> propertyKeyToPropertyDefinitionMap = new HashMap<>();
|
||||
for (PropertyDefinition<?> pdef : pdefs) {
|
||||
propertyKeyToPropertyDefinitionMap.put(pdef.getPropertyKey(), pdef);
|
||||
}
|
||||
PROPERTY_KEY_TO_PROPERTY_DEFINITION = Collections.unmodifiableMap(propertyKeyToPropertyDefinitionMap);
|
||||
}
|
||||
|
||||
public static PropertyDefinition<?> getPropertyDefinition(PropertyKey propertyKey) {
|
||||
return PROPERTY_KEY_TO_PROPERTY_DEFINITION.get(propertyKey);
|
||||
}
|
||||
}
|
||||
+382
@@ -0,0 +1,382 @@
|
||||
/*
|
||||
* Copyright (c) 2018, 2021, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package com.mysql.cj.conf;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.TreeMap;
|
||||
|
||||
/**
|
||||
* PropertyKey handles connection property names, their camel-case aliases and case sensitivity.
|
||||
*/
|
||||
public enum PropertyKey {
|
||||
/*
|
||||
* Properties individually managed after parsing connection string. These property keys are case insensitive.
|
||||
*/
|
||||
/** The database user name. */
|
||||
USER("user", false),
|
||||
/** The database user password. */
|
||||
PASSWORD("password", false),
|
||||
/** The hostname value from the properties instance passed to the driver. */
|
||||
HOST("host", false),
|
||||
/** The port number value from the properties instance passed to the driver. */
|
||||
PORT("port", false),
|
||||
/** The communications protocol. Possible values: "tcp" and "pipe". */
|
||||
PROTOCOL("protocol", false),
|
||||
/** The name pipes path to use when "protocol=pipe'. */
|
||||
PATH("path", "namedPipePath", false),
|
||||
/** The server type in a replication setup. Possible values: "source" and "replica". */
|
||||
TYPE("type", false),
|
||||
/** The address value ("host:port") from the properties instance passed to the driver. */
|
||||
ADDRESS("address", false),
|
||||
/** The host priority in a list of hosts. */
|
||||
PRIORITY("priority", false),
|
||||
/** The database value from the properties instance passed to the driver. */
|
||||
DBNAME("dbname", false), //
|
||||
|
||||
allowLoadLocalInfile("allowLoadLocalInfile", true), //
|
||||
allowLoadLocalInfileInPath("allowLoadLocalInfileInPath", true), //
|
||||
allowSourceDownConnections("allowSourceDownConnections", "allowMasterDownConnections", true), //
|
||||
allowMultiQueries("allowMultiQueries", true), //
|
||||
allowNanAndInf("allowNanAndInf", true), //
|
||||
allowPublicKeyRetrieval("allowPublicKeyRetrieval", true), //
|
||||
allowReplicaDownConnections("allowReplicaDownConnections", "allowSlaveDownConnections", true), //
|
||||
allowUrlInLocalInfile("allowUrlInLocalInfile", true), //
|
||||
alwaysSendSetIsolation("alwaysSendSetIsolation", true), //
|
||||
authenticationPlugins("authenticationPlugins", true), //
|
||||
autoClosePStmtStreams("autoClosePStmtStreams", true), //
|
||||
autoDeserialize("autoDeserialize", true), //
|
||||
autoGenerateTestcaseScript("autoGenerateTestcaseScript", true), //
|
||||
autoReconnect("autoReconnect", true), //
|
||||
autoReconnectForPools("autoReconnectForPools", true), //
|
||||
autoSlowLog("autoSlowLog", true), //
|
||||
blobsAreStrings("blobsAreStrings", true), //
|
||||
blobSendChunkSize("blobSendChunkSize", true), //
|
||||
cacheCallableStmts("cacheCallableStmts", true), //
|
||||
cacheDefaultTimeZone("cacheDefaultTimeZone", "cacheDefaultTimezone", true), //
|
||||
cachePrepStmts("cachePrepStmts", true), //
|
||||
cacheResultSetMetadata("cacheResultSetMetadata", true), //
|
||||
cacheServerConfiguration("cacheServerConfiguration", true), //
|
||||
callableStmtCacheSize("callableStmtCacheSize", true), //
|
||||
characterEncoding("characterEncoding", true), //
|
||||
characterSetResults("characterSetResults", true), //
|
||||
clientCertificateKeyStorePassword("clientCertificateKeyStorePassword", true), //
|
||||
clientCertificateKeyStoreType("clientCertificateKeyStoreType", true), //
|
||||
clientCertificateKeyStoreUrl("clientCertificateKeyStoreUrl", true), //
|
||||
clientInfoProvider("clientInfoProvider", true), //
|
||||
clobberStreamingResults("clobberStreamingResults", true), //
|
||||
clobCharacterEncoding("clobCharacterEncoding", true), //
|
||||
compensateOnDuplicateKeyUpdateCounts("compensateOnDuplicateKeyUpdateCounts", true), //
|
||||
connectionAttributes("connectionAttributes", true), //
|
||||
connectionCollation("connectionCollation", true), //
|
||||
connectionLifecycleInterceptors("connectionLifecycleInterceptors", true), //
|
||||
connectionTimeZone("connectionTimeZone", "serverTimezone", true), //
|
||||
connectTimeout("connectTimeout", true), //
|
||||
continueBatchOnError("continueBatchOnError", true), //
|
||||
createDatabaseIfNotExist("createDatabaseIfNotExist", true), //
|
||||
customCharsetMapping("customCharsetMapping", true), //
|
||||
databaseTerm("databaseTerm", true), //
|
||||
defaultAuthenticationPlugin("defaultAuthenticationPlugin", true), //
|
||||
defaultFetchSize("defaultFetchSize", true), //
|
||||
detectCustomCollations("detectCustomCollations", true), //
|
||||
disabledAuthenticationPlugins("disabledAuthenticationPlugins", true), //
|
||||
disconnectOnExpiredPasswords("disconnectOnExpiredPasswords", true), //
|
||||
dnsSrv("dnsSrv", true), //
|
||||
dontCheckOnDuplicateKeyUpdateInSQL("dontCheckOnDuplicateKeyUpdateInSQL", true), //
|
||||
dontTrackOpenResources("dontTrackOpenResources", true), //
|
||||
dumpQueriesOnException("dumpQueriesOnException", true), //
|
||||
elideSetAutoCommits("elideSetAutoCommits", true), //
|
||||
emptyStringsConvertToZero("emptyStringsConvertToZero", true), //
|
||||
emulateLocators("emulateLocators", true), //
|
||||
emulateUnsupportedPstmts("emulateUnsupportedPstmts", true), //
|
||||
enabledSSLCipherSuites("enabledSSLCipherSuites", true), //
|
||||
enabledTLSProtocols("enabledTLSProtocols", true), //
|
||||
enableEscapeProcessing("enableEscapeProcessing", true), //
|
||||
enablePacketDebug("enablePacketDebug", true), //
|
||||
enableQueryTimeouts("enableQueryTimeouts", true), //
|
||||
exceptionInterceptors("exceptionInterceptors", true), //
|
||||
explainSlowQueries("explainSlowQueries", true), //
|
||||
failOverReadOnly("failOverReadOnly", true), //
|
||||
fallbackToSystemKeyStore("fallbackToSystemKeyStore", true), //
|
||||
fallbackToSystemTrustStore("fallbackToSystemTrustStore", true), //
|
||||
functionsNeverReturnBlobs("functionsNeverReturnBlobs", true), //
|
||||
gatherPerfMetrics("gatherPerfMetrics", true), //
|
||||
generateSimpleParameterMetadata("generateSimpleParameterMetadata", true), //
|
||||
getProceduresReturnsFunctions("getProceduresReturnsFunctions", true), //
|
||||
holdResultsOpenOverStatementClose("holdResultsOpenOverStatementClose", true), //
|
||||
ha_enableJMX("ha.enableJMX", "haEnableJMX", true), //
|
||||
ha_loadBalanceStrategy("ha.loadBalanceStrategy", "haLoadBalanceStrategy", true), //
|
||||
ignoreNonTxTables("ignoreNonTxTables", true), //
|
||||
includeInnodbStatusInDeadlockExceptions("includeInnodbStatusInDeadlockExceptions", true), //
|
||||
includeThreadDumpInDeadlockExceptions("includeThreadDumpInDeadlockExceptions", true), //
|
||||
includeThreadNamesAsStatementComment("includeThreadNamesAsStatementComment", true), //
|
||||
initialTimeout("initialTimeout", true), //
|
||||
interactiveClient("interactiveClient", true), //
|
||||
jdbcCompliantTruncation("jdbcCompliantTruncation", true), //
|
||||
largeRowSizeThreshold("largeRowSizeThreshold", true), //
|
||||
ldapServerHostname("ldapServerHostname", true), //
|
||||
loadBalanceAutoCommitStatementRegex("loadBalanceAutoCommitStatementRegex", true), //
|
||||
loadBalanceAutoCommitStatementThreshold("loadBalanceAutoCommitStatementThreshold", true), //
|
||||
loadBalanceBlocklistTimeout("loadBalanceBlocklistTimeout", "loadBalanceBlacklistTimeout", true), //
|
||||
loadBalanceConnectionGroup("loadBalanceConnectionGroup", true), //
|
||||
loadBalanceExceptionChecker("loadBalanceExceptionChecker", true), //
|
||||
loadBalanceHostRemovalGracePeriod("loadBalanceHostRemovalGracePeriod", true), //
|
||||
loadBalancePingTimeout("loadBalancePingTimeout", true), //
|
||||
loadBalanceSQLStateFailover("loadBalanceSQLStateFailover", true), //
|
||||
loadBalanceSQLExceptionSubclassFailover("loadBalanceSQLExceptionSubclassFailover", true), //
|
||||
loadBalanceValidateConnectionOnSwapServer("loadBalanceValidateConnectionOnSwapServer", true), //
|
||||
localSocketAddress("localSocketAddress", true), //
|
||||
locatorFetchBufferSize("locatorFetchBufferSize", true), //
|
||||
logger("logger", true), //
|
||||
logSlowQueries("logSlowQueries", true), //
|
||||
logXaCommands("logXaCommands", true), //
|
||||
maintainTimeStats("maintainTimeStats", true), //
|
||||
maxAllowedPacket("maxAllowedPacket", true), //
|
||||
maxQuerySizeToLog("maxQuerySizeToLog", true), //
|
||||
maxReconnects("maxReconnects", true), //
|
||||
maxRows("maxRows", true), //
|
||||
metadataCacheSize("metadataCacheSize", true), //
|
||||
netTimeoutForStreamingResults("netTimeoutForStreamingResults", true), //
|
||||
noAccessToProcedureBodies("noAccessToProcedureBodies", true), //
|
||||
noDatetimeStringSync("noDatetimeStringSync", true), //
|
||||
nullDatabaseMeansCurrent("nullDatabaseMeansCurrent", "nullCatalogMeansCurrent", true), //
|
||||
overrideSupportsIntegrityEnhancementFacility("overrideSupportsIntegrityEnhancementFacility", true), //
|
||||
packetDebugBufferSize("packetDebugBufferSize", true), //
|
||||
padCharsWithSpace("padCharsWithSpace", true), //
|
||||
paranoid("paranoid", false), //
|
||||
parseInfoCacheFactory("parseInfoCacheFactory", true), //
|
||||
passwordCharacterEncoding("passwordCharacterEncoding", true), //
|
||||
pedantic("pedantic", true), //
|
||||
pinGlobalTxToPhysicalConnection("pinGlobalTxToPhysicalConnection", true), //
|
||||
populateInsertRowWithDefaultValues("populateInsertRowWithDefaultValues", true), //
|
||||
prepStmtCacheSize("prepStmtCacheSize", true), //
|
||||
prepStmtCacheSqlLimit("prepStmtCacheSqlLimit", true), //
|
||||
preserveInstants("preserveInstants", true), //
|
||||
processEscapeCodesForPrepStmts("processEscapeCodesForPrepStmts", true), //
|
||||
profilerEventHandler("profilerEventHandler", true), //
|
||||
profileSQL("profileSQL", true), //
|
||||
forceConnectionTimeZoneToSession("forceConnectionTimeZoneToSession", true), //
|
||||
propertiesTransform("propertiesTransform", true), //
|
||||
queriesBeforeRetrySource("queriesBeforeRetrySource", "queriesBeforeRetryMaster", true), //
|
||||
queryInterceptors("queryInterceptors", true), //
|
||||
queryTimeoutKillsConnection("queryTimeoutKillsConnection", true), //
|
||||
readFromSourceWhenNoReplicas("readFromSourceWhenNoReplicas", "readFromMasterWhenNoSlaves", true), //
|
||||
readOnlyPropagatesToServer("readOnlyPropagatesToServer", true), //
|
||||
reconnectAtTxEnd("reconnectAtTxEnd", true), //
|
||||
replicationConnectionGroup("replicationConnectionGroup", true), //
|
||||
reportMetricsIntervalMillis("reportMetricsIntervalMillis", true), //
|
||||
requireSSL("requireSSL", true), //
|
||||
resourceId("resourceId", true), //
|
||||
resultSetSizeThreshold("resultSetSizeThreshold", true), //
|
||||
retriesAllDown("retriesAllDown", true), //
|
||||
rewriteBatchedStatements("rewriteBatchedStatements", true), //
|
||||
rollbackOnPooledClose("rollbackOnPooledClose", true), //
|
||||
scrollTolerantForwardOnly("scrollTolerantForwardOnly", true), //
|
||||
secondsBeforeRetrySource("secondsBeforeRetrySource", "secondsBeforeRetryMaster", true), //
|
||||
selfDestructOnPingMaxOperations("selfDestructOnPingMaxOperations", true), //
|
||||
selfDestructOnPingSecondsLifetime("selfDestructOnPingSecondsLifetime", true), //
|
||||
sendFractionalSeconds("sendFractionalSeconds", true), //
|
||||
sendFractionalSecondsForTime("sendFractionalSecondsForTime", true), //
|
||||
serverAffinityOrder("serverAffinityOrder", true), //
|
||||
serverConfigCacheFactory("serverConfigCacheFactory", true), //
|
||||
serverRSAPublicKeyFile("serverRSAPublicKeyFile", true), //
|
||||
sessionVariables("sessionVariables", true), //
|
||||
trackSessionState("trackSessionState", true), //
|
||||
slowQueryThresholdMillis("slowQueryThresholdMillis", true), //
|
||||
slowQueryThresholdNanos("slowQueryThresholdNanos", true), //
|
||||
socketFactory("socketFactory", true), //
|
||||
socketTimeout("socketTimeout", true), //
|
||||
socksProxyHost("socksProxyHost", true), //
|
||||
socksProxyPort("socksProxyPort", true), //
|
||||
sslMode("sslMode", true), //
|
||||
strictUpdates("strictUpdates", true), //
|
||||
tcpKeepAlive("tcpKeepAlive", true), //
|
||||
tcpNoDelay("tcpNoDelay", true), //
|
||||
tcpRcvBuf("tcpRcvBuf", true), //
|
||||
tcpSndBuf("tcpSndBuf", true), //
|
||||
tcpTrafficClass("tcpTrafficClass", true), //
|
||||
tinyInt1isBit("tinyInt1isBit", true), //
|
||||
traceProtocol("traceProtocol", true), //
|
||||
transformedBitIsBoolean("transformedBitIsBoolean", true), //
|
||||
treatUtilDateAsTimestamp("treatUtilDateAsTimestamp", true), //
|
||||
trustCertificateKeyStorePassword("trustCertificateKeyStorePassword", true), //
|
||||
trustCertificateKeyStoreType("trustCertificateKeyStoreType", true), //
|
||||
trustCertificateKeyStoreUrl("trustCertificateKeyStoreUrl", true), //
|
||||
ultraDevHack("ultraDevHack", true), //
|
||||
useAffectedRows("useAffectedRows", true), //
|
||||
useColumnNamesInFindColumn("useColumnNamesInFindColumn", true), //
|
||||
useCompression("useCompression", true), //
|
||||
useConfigs("useConfigs", true), //
|
||||
useCursorFetch("useCursorFetch", true), //
|
||||
useHostsInPrivileges("useHostsInPrivileges", true), //
|
||||
useInformationSchema("useInformationSchema", true), //
|
||||
useLocalSessionState("useLocalSessionState", true), //
|
||||
useLocalTransactionState("useLocalTransactionState", true), //
|
||||
useNanosForElapsedTime("useNanosForElapsedTime", true), //
|
||||
useOldAliasMetadataBehavior("useOldAliasMetadataBehavior", true), //
|
||||
useOnlyServerErrorMessages("useOnlyServerErrorMessages", true), //
|
||||
useReadAheadInput("useReadAheadInput", true), //
|
||||
useServerPrepStmts("useServerPrepStmts", true), //
|
||||
useSSL("useSSL", true), //
|
||||
useStreamLengthsInPrepStmts("useStreamLengthsInPrepStmts", true), //
|
||||
useUnbufferedInput("useUnbufferedInput", true), //
|
||||
useUsageAdvisor("useUsageAdvisor", true), //
|
||||
verifyServerCertificate("verifyServerCertificate", true), //
|
||||
|
||||
xdevapiAsyncResponseTimeout("xdevapi.asyncResponseTimeout", "xdevapiAsyncResponseTimeout", true), //
|
||||
xdevapiAuth("xdevapi.auth", "xdevapiAuth", true), //
|
||||
xdevapiConnectTimeout("xdevapi.connect-timeout", "xdevapiConnectTimeout", true), //
|
||||
xdevapiConnectionAttributes("xdevapi.connection-attributes", "xdevapiConnectionAttributes", true), //
|
||||
xdevapiCompression("xdevapi.compression", "xdevapiCompression", true), //
|
||||
xdevapiCompressionAlgorithms("xdevapi.compression-algorithms", "xdevapiCompressionAlgorithms", true), //
|
||||
xdevapiCompressionExtensions("xdevapi.compression-extensions", "xdevapiCompressionExtensions", true), //
|
||||
xdevapiDnsSrv("xdevapi.dns-srv", "xdevapiDnsSrv", true), //
|
||||
xdevapiFallbackToSystemKeyStore("xdevapi.fallback-to-system-keystore", "xdevapiFallbackToSystemKeyStore", true), //
|
||||
xdevapiFallbackToSystemTrustStore("xdevapi.fallback-to-system-truststore", "xdevapiFallbackToSystemTrustStore", true), //
|
||||
xdevapiSslKeyStorePassword("xdevapi.ssl-keystore-password", "xdevapiSslKeystorePassword", true), //
|
||||
xdevapiSslKeyStoreType("xdevapi.ssl-keystore-type", "xdevapiSslKeystoreType", true), //
|
||||
xdevapiSslKeyStoreUrl("xdevapi.ssl-keystore", "xdevapiSslKeystore", true), //
|
||||
xdevapiSslMode("xdevapi.ssl-mode", "xdevapiSslMode", true), //
|
||||
xdevapiSslTrustStorePassword("xdevapi.ssl-truststore-password", "xdevapiSslTruststorePassword", true), //
|
||||
xdevapiSslTrustStoreType("xdevapi.ssl-truststore-type", "xdevapiSslTruststoreType", true), //
|
||||
xdevapiSslTrustStoreUrl("xdevapi.ssl-truststore", "xdevapiSslTruststore", true), //
|
||||
xdevapiTlsCiphersuites("xdevapi.tls-ciphersuites", "xdevapiTlsCiphersuites", true), //
|
||||
xdevapiTlsVersions("xdevapi.tls-versions", "xdevapiTlsVersions", true), //
|
||||
xdevapiUseAsyncProtocol("xdevapi.useAsyncProtocol", "xdevapiUseAsyncProtocol", true), //
|
||||
|
||||
yearIsDateType("yearIsDateType", true), //
|
||||
zeroDateTimeBehavior("zeroDateTimeBehavior", true) //
|
||||
;
|
||||
|
||||
private String keyName;
|
||||
private String ccAlias = null;
|
||||
private boolean isCaseSensitive = false;
|
||||
|
||||
private static Map<String, PropertyKey> caseInsensitiveValues = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
|
||||
static {
|
||||
for (PropertyKey pk : values()) {
|
||||
if (!pk.isCaseSensitive) {
|
||||
caseInsensitiveValues.put(pk.getKeyName(), pk);
|
||||
if (pk.getCcAlias() != null) {
|
||||
caseInsensitiveValues.put(pk.getCcAlias(), pk);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes each enum element with the proper key name to be used in the connection string or properties maps.
|
||||
*
|
||||
* @param keyName
|
||||
* the key name for the enum element.
|
||||
* @param isCaseSensitive
|
||||
* is this name case sensitive
|
||||
*/
|
||||
PropertyKey(String keyName, boolean isCaseSensitive) {
|
||||
this.keyName = keyName;
|
||||
this.isCaseSensitive = isCaseSensitive;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes each enum element with the proper key name to be used in the connection string or properties maps.
|
||||
*
|
||||
* @param keyName
|
||||
* the key name for the enum element.
|
||||
* @param alias
|
||||
* camel-case alias key name
|
||||
* @param isCaseSensitive
|
||||
* is this name case sensitive
|
||||
*/
|
||||
PropertyKey(String keyName, String alias, boolean isCaseSensitive) {
|
||||
this(keyName, isCaseSensitive);
|
||||
this.ccAlias = alias;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return this.keyName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the key name of this enum element.
|
||||
*
|
||||
* @return
|
||||
* the key name associated with the enum element.
|
||||
*/
|
||||
public String getKeyName() {
|
||||
return this.keyName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the camel-case alias key name of this enum element.
|
||||
*
|
||||
* @return
|
||||
* the camel-case alias key name associated with the enum element or null.
|
||||
*/
|
||||
public String getCcAlias() {
|
||||
return this.ccAlias;
|
||||
}
|
||||
|
||||
/**
|
||||
* Looks for a {@link PropertyKey} that matches the given value as key name.
|
||||
*
|
||||
* @param value
|
||||
* the key name to look for.
|
||||
* @return
|
||||
* the {@link PropertyKey} element that matches the given key name value or <code>null</code> if none is found.
|
||||
*/
|
||||
public static PropertyKey fromValue(String value) {
|
||||
for (PropertyKey k : values()) {
|
||||
if (k.isCaseSensitive) {
|
||||
if (k.getKeyName().equals(value) || (k.getCcAlias() != null && k.getCcAlias().equals(value))) {
|
||||
return k;
|
||||
}
|
||||
} else {
|
||||
if (k.getKeyName().equalsIgnoreCase(value) || (k.getCcAlias() != null && k.getCcAlias().equalsIgnoreCase(value))) {
|
||||
return k;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper method that normalizes the case of the given key, if it is one of {@link PropertyKey} elements.
|
||||
*
|
||||
* @param keyName
|
||||
* the key name to normalize.
|
||||
* @return
|
||||
* the normalized key name if it belongs to this enum, otherwise returns the input unchanged.
|
||||
*/
|
||||
public static String normalizeCase(String keyName) {
|
||||
PropertyKey pk = caseInsensitiveValues.get(keyName);
|
||||
return pk == null ? keyName : pk.getKeyName();
|
||||
//return keyName;
|
||||
}
|
||||
}
|
||||
+87
@@ -0,0 +1,87 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 2020, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package com.mysql.cj.conf;
|
||||
|
||||
import java.util.Properties;
|
||||
|
||||
public interface PropertySet {
|
||||
|
||||
void addProperty(RuntimeProperty<?> prop);
|
||||
|
||||
void removeProperty(String name);
|
||||
|
||||
void removeProperty(PropertyKey key);
|
||||
|
||||
<T> RuntimeProperty<T> getProperty(String name);
|
||||
|
||||
<T> RuntimeProperty<T> getProperty(PropertyKey key);
|
||||
|
||||
RuntimeProperty<Boolean> getBooleanProperty(String name);
|
||||
|
||||
RuntimeProperty<Boolean> getBooleanProperty(PropertyKey key);
|
||||
|
||||
RuntimeProperty<Integer> getIntegerProperty(String name);
|
||||
|
||||
RuntimeProperty<Integer> getIntegerProperty(PropertyKey key);
|
||||
|
||||
RuntimeProperty<Long> getLongProperty(String name);
|
||||
|
||||
RuntimeProperty<Long> getLongProperty(PropertyKey key);
|
||||
|
||||
RuntimeProperty<Integer> getMemorySizeProperty(String name);
|
||||
|
||||
RuntimeProperty<Integer> getMemorySizeProperty(PropertyKey key);
|
||||
|
||||
RuntimeProperty<String> getStringProperty(String name);
|
||||
|
||||
RuntimeProperty<String> getStringProperty(PropertyKey key);
|
||||
|
||||
<T extends Enum<T>> RuntimeProperty<T> getEnumProperty(String name);
|
||||
|
||||
<T extends Enum<T>> RuntimeProperty<T> getEnumProperty(PropertyKey key);
|
||||
|
||||
/**
|
||||
* Initializes the property set with driver properties that come from URL or passed to
|
||||
* the driver manager.
|
||||
*
|
||||
* @param props
|
||||
* properties
|
||||
*/
|
||||
void initializeProperties(Properties props);
|
||||
|
||||
void postInitialization();
|
||||
|
||||
Properties exposeAsProperties();
|
||||
|
||||
/**
|
||||
* Reset all properties to their initial values.
|
||||
*/
|
||||
void reset();
|
||||
}
|
||||
+120
@@ -0,0 +1,120 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 2020, Oracle and/or its affiliates.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License, version 2.0, as published by the
|
||||
* Free Software Foundation.
|
||||
*
|
||||
* This program is also distributed with certain software (including but not
|
||||
* limited to OpenSSL) that is licensed under separate terms, as designated in a
|
||||
* particular file or component or in included license documentation. The
|
||||
* authors of MySQL hereby grant you an additional permission to link the
|
||||
* program and your derivative works with the separately licensed software that
|
||||
* they have included with MySQL.
|
||||
*
|
||||
* Without limiting anything contained in the foregoing, this file, which is
|
||||
* part of MySQL Connector/J, is also subject to the Universal FOSS Exception,
|
||||
* version 1.0, a copy of which can be found at
|
||||
* http://oss.oracle.com/licenses/universal-foss-exception.
|
||||
*
|
||||
* 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, version 2.0,
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
package com.mysql.cj.conf;
|
||||
|
||||
import java.util.Properties;
|
||||
|
||||
import javax.naming.Reference;
|
||||
|
||||
import com.mysql.cj.exceptions.ExceptionInterceptor;
|
||||
|
||||
public interface RuntimeProperty<T> {
|
||||
|
||||
PropertyDefinition<T> getPropertyDefinition();
|
||||
|
||||
/**
|
||||
* Explicitly set value of this RuntimeProperty according to the self-titled property value contained in extractFrom.
|
||||
* This method is called during PropertySet initialization thus ignores the RUNTIME_NOT_MODIFIABLE flag.
|
||||
* <p>
|
||||
* This value will also be the initial one, i.e. {@link #resetValue()} will reset to this value, not the default one.
|
||||
* <p>
|
||||
* If extractFrom does not contain such property then this RuntimeProperty remains unchanged.
|
||||
*
|
||||
* @param extractFrom
|
||||
* {@link Properties} object containing key-value pairs usually passed from connection string.
|
||||
* @param exceptionInterceptor
|
||||
* exceptionInterceptor
|
||||
*/
|
||||
void initializeFrom(Properties extractFrom, ExceptionInterceptor exceptionInterceptor);
|
||||
|
||||
void initializeFrom(Reference ref, ExceptionInterceptor exceptionInterceptor);
|
||||
|
||||
/**
|
||||
* Reset to initial value (default or defined in connection string/Properties)
|
||||
*/
|
||||
void resetValue();
|
||||
|
||||
boolean isExplicitlySet();
|
||||
|
||||
/**
|
||||
* Add listener for this property changes.
|
||||
*
|
||||
* @param l
|
||||
* {@link RuntimePropertyListener}
|
||||
*/
|
||||
void addListener(RuntimePropertyListener l);
|
||||
|
||||
void removeListener(RuntimePropertyListener l);
|
||||
|
||||
@FunctionalInterface
|
||||
public static interface RuntimePropertyListener {
|
||||
void handlePropertyChange(RuntimeProperty<?> prop);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get internal value representation as Object.
|
||||
*
|
||||
* @return value
|
||||
*/
|
||||
T getValue();
|
||||
|
||||
/**
|
||||
* Get initial value (default or defined in connection string/Properties)
|
||||
*
|
||||
* @return value
|
||||
*/
|
||||
T getInitialValue();
|
||||
|
||||
/**
|
||||
* Get internal value representation as String.
|
||||
*
|
||||
* @return value
|
||||
*/
|
||||
String getStringValue();
|
||||
|
||||
/**
|
||||
* Set the object value of a property directly. Validation against allowable values will be performed.
|
||||
*
|
||||
* @param value
|
||||
* value
|
||||
*/
|
||||
void setValue(T value);
|
||||
|
||||
/**
|
||||
* Set the object value of a property directly. Validation against allowable values will be performed.
|
||||
*
|
||||
* @param value
|
||||
* value
|
||||
* @param exceptionInterceptor
|
||||
* exception interceptor
|
||||
*/
|
||||
void setValue(T value, ExceptionInterceptor exceptionInterceptor);
|
||||
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user