/// <summary> /// Purge des logs opérateur > durée /// </summary> private static Boolean PurgerSessionsCle(int cdLogiciel, int dureeSecondes, int transac) { OracleTrans o = OracleTrans.getInstance; Boolean res = true; try { // Purge à la durée + une minute dureeSecondes += 60; ExtendedReturnedUpdate resultLogOpe = o.ExecuterUpdate( " DELETE FROM LOGICIEL_SESSIONS WHERE (SYSDATE - DATE_MAJ) > (:1 / 60 / 60 / 24) ", //CD_LOGICIEL = :1 AND transac, dureeSecondes); res = res && resultLogOpe.ErrCode == 0; if (!res) { throw new Exception("Impossible de purger les sessions d'utilisation. " + (resultLogOpe.OracleException != null ? resultLogOpe.OracleException.Message : "")); } return(res); } catch (Exception ex) { throw ex; } }
/// <summary> /// Suppression de la session d'utilisation du logiciel /// </summary> public static Boolean SupprimerSessionCle(int cdLogiciel, String sessionId) { OracleTrans o = OracleTrans.getInstance; int transac = o.DebutTransaction(); Boolean res = true; try { ExtendedReturnedUpdate result = OracleTrans.getInstance.ExecuterUpdate( " DELETE FROM LOGICIEL_SESSIONS WHERE CD_LOGICIEL = :1 AND SESSION_ID = :2 ", -1, cdLogiciel, sessionId); res = res && result.ErrCode == 0; if (!res) { throw new Exception("Impossible de supprimer la session utilisateur. " + (result.OracleException != null ? result.OracleException.Message : "")); } if (res) { if (_COMMIT) { o.Commit(transac); } else { o.RollBack(transac); } } else { o.RollBack(transac); } return(res); } catch (Exception ex) { o.RollBack(transac); throw ex; } }
/// <summary> /// Enregistrement d'une nouvelle session d'utilisation à un logiciel et vérification de la clé associée /// </summary> public static Boolean CreerNouvelleSessionCle(int cdLogiciel, string sessionId, string infos) { lock (LOCK) { if (DateTime.Now.Subtract(_dateDernierePurge).TotalSeconds > _FREQUENCE_PURGE) { try { _dateDernierePurge = DateTime.Now; // Purge des sessions existantes qui dépassent le délai d'inactivité PurgerSessionsCle(cdLogiciel, _DUREE_INACTIVITE); } catch (Exception) { } } } OracleTrans o = OracleTrans.getInstance; int transac = o.DebutTransaction(); Boolean res = true; try { // Test si session existe déjà Boolean existsSession = false; if (sessionId != "") { ExtendedReturnedScalar resultSessionCourante = o.ExecuterSelectScalar( " SELECT COUNT(*)" + " FROM LOGICIEL_SESSIONS " + " WHERE CD_LOGICIEL = :1 " + " AND SESSION_ID = :2", transac, cdLogiciel, sessionId); if (Convert.ToInt32(resultSessionCourante.Result) > 0) { existsSession = true; Boolean sessionAMAJ = false; // SI DATE_MAJ session courante > DUREE_INACTIVITE => SESSION NON ACTIVE => test clé ExtendedReturnedScalar resultSessionCouranteActive = o.ExecuterSelectScalar( " SELECT CASE WHEN (SYSDATE - DATE_MAJ) < (:2 / 60 / 60 / 24) THEN 1 ELSE 0 END as SESSION_ACTIVE " + " FROM LOGICIEL_SESSIONS " + " WHERE CD_LOGICIEL = :1 " + " AND SESSION_ID = :3", transac, cdLogiciel, _DUREE_INACTIVITE, sessionId); // Si session non active -> test clé if (Convert.ToInt32(resultSessionCouranteActive.Result) == 0) { sessionAMAJ = TestCle(cdLogiciel, sessionId, _DUREE_INACTIVITE, transac); } else { // Sinon mise à jour activité session sessionAMAJ = true; } if (sessionAMAJ) { //MajActiviteSessionCle(cdLogiciel, sessionId, transac); ExtendedReturnedUpdate resultLogOpe = o.ExecuterUpdate( " UPDATE LOGICIEL_SESSIONS SET " + " DATE_MAJ = SYSDATE, " + " DUREE_ACTIVITE = Round((DATE_MAJ - DATE_CREAT) * 24 * 60, 2) " + // EN MINUTES " WHERE CD_LOGICIEL = :1 " + " AND SESSION_ID = :2 ", transac, cdLogiciel, sessionId); res = res && resultLogOpe.ErrCode == 0; if (!res) { throw new Exception("Impossible de mettre à jour l'activité de la session d'utilisation. " + (resultLogOpe.OracleException != null ? resultLogOpe.OracleException.Message : "")); } } } else { existsSession = false; } if (!existsSession) { res = res && TestCle(cdLogiciel, null, _DUREE_INACTIVITE, transac); if (res) { // - OK, nouvelle session ExtendedReturnedUpdate resultLogOpe = o.ExecuterUpdate( " INSERT INTO LOGICIEL_SESSIONS " + " (CD_LOGICIEL_SESSIONS, CD_LOGICIEL, SESSION_ID, INFOS, DATE_CREAT, DATE_MAJ, DUREE_ACTIVITE) " + " VALUES (SEQ_LOGICIEL_SESSIONS.NEXTVAL, :1, :2, :3, SYSDATE, SYSDATE, 0)", transac, cdLogiciel, sessionId, infos); res = res && resultLogOpe.ErrCode == 0; if (!res) { throw new Exception("Impossible d'enregistrer la session d'utilisation. " + (resultLogOpe.OracleException != null ? resultLogOpe.OracleException.Message : "")); } } } if (res) { if (_COMMIT) { o.Commit(transac); } else { o.RollBack(transac); } return(res); } else { o.RollBack(transac); return(false); } } else { o.RollBack(transac); return(false); } } catch (Exception ex) { o.RollBack(transac); throw ex; } }