Так супермаг считает ко-во использованных лицензий:
SELECT COUNT( * ) LIS FROM ( SELECT
S.MACHINE, SUBSTR( L.LOCKLABEL, 9, 8 ) FROM supermag.SSLOCKS L, supermag.SUPERMAG_SESSIONS S
WHERE L.OBJTYPE = 'CP' AND S.SID = L.SID AND S.SERIAL# = L.SERNUM
AND L.LOCKLABEL IS NOT NULL AND NOT ( L.ID IN ( 'Controller', 'Worker' )
OR EXISTS( SELECT * FROM supermag.SSLOCKS L1 WHERE S.SID = L1.SID AND S.SERIAL# = L1.SERNUM
AND ( L1.OBJTYPE = 'PT' AND L1.ID = '1' OR L1.OBJTYPE = 'CM' AND L1.ID = '1' ) ) )
GROUP BY S.MACHINE, SUBSTR( L.LOCKLABEL, 9, 8 ))
По поводу кол-ва лицензий можно вызвать из CORE процедуру (она например вызывается Административным модулем "права доступа"->"Версия" ):
PROCEDURE GETLICENSEINFO( SERIALNUM OUT NUMBER, WSMAXCOUNT OUT NUMBER, EXPDATE OUT DATE )
только в начале процедуры стоит проверка на существование клиентского процесса, так что возможно придется либо поправить CORE body, либо создать "ложный" процесс (думаю надо покопать в сторону служебных почтовик например или кассовый, они немного по другому обрабатываются сервером супермага)
Либо вот процедура непосредственно которая парстит запись лицензии (PARSELICRECORD там же в CORE):
PROCEDURE PARSELICRECORD( LICRECORDDECODED IN VARCHAR2 )
IS
BADRECORD EXCEPTION;
R SSSYSINFO.PARAMVALUE%TYPE;
R1 SSSYSINFO.PARAMVALUE%TYPE;
TAG PLS_INTEGER;
WSCOUNT PLS_INTEGER;
SERIALNUM NUMBER;
EXPTIME DATE;
POS PLS_INTEGER;
POS1 PLS_INTEGER;
BEGIN
R := LICRECORDDECODED;
IF R IS NULL OR LENGTH( R ) = 0 THEN
RAISE BADRECORD;
END IF;
POS := INSTR( R, '*' );
IF POS = 0 THEN
RAISE BADRECORD;
END IF;
R1 := SUBSTR( R, 1, POS - 1 );
LICCHECKSUM := TO_NUMBER( R1 );
IF LICCHECKSUM IS NULL OR LICCHECKSUM < 0 THEN
RAISE BADRECORD;
END IF;
R := SUBSTR( R, POS + 1 );
POS := INSTR( R, '/' );
IF POS = 0 THEN
RAISE BADRECORD;
END IF;
R1 := SUBSTR( R, 1, POS - 1 );
POS1 := INSTR( R1, GETDBNAME, -1 );
IF POS1 != LENGTH( R1 ) - LENGTH( GETDBNAME ) + 1 THEN
LOGEVENT( 'License record is not for this database' );
RAISE BADRECORD;
END IF;
TAG := TO_NUMBER( SUBSTR( R1, 1, POS1 - 1 ) );
R := SUBSTR( R, POS + 1 );
POS := INSTR( R, '/' );
IF POS = 0 THEN
RAISE BADRECORD;
END IF;
WSCOUNT := TO_NUMBER( SUBSTR( R, 1, POS - 1 ) );
R := SUBSTR( R, POS + 1 );
POS := INSTR( R, '/' );
IF POS = 0 THEN
RAISE BADRECORD;
END IF;
SERIALNUM := TO_NUMBER( SUBSTR( R, 1, POS - 1 ) );
R := SUBSTR( R, POS + 1 );
EXPTIME := TO_DATE( R, 'DD.MM.YYYY' );
IF EXPTIME = TO_DATE( '28.10.1997', 'DD.MM.YYYY' ) THEN
EXPTIME := NULL;
END IF;
IF NOT ( WSCOUNT = 0 AND TAG = 0 OR TAG = SERIALNUM MOD WSCOUNT ) THEN
RAISE BADRECORD;
END IF;
LICEXPDATE := EXPTIME;
LICMAXWS := WSCOUNT; -- <<<<< собственно кол-во лицензий
LICKEYSERIAL := SERIALNUM;
EXCEPTION
WHEN OTHERS THEN
LOGEVENT( 'Invalid license record' );
LICKEYSERIAL := INVALIDLICNUMBER;
LICMAXWS := 0;
LICEXPDATE := NULL;
LICCHECKSUM := NULL;
END;