Documentation updates (sql_counter with postgresql)
Stephen Gran
steve at lobefin.net
Fri Jul 28 04:07:20 CEST 2006
Hello all,
After making this work for myself, I thought I would send the
documentation on so that others could do it more easily. There are some
duplicates that could be cut, but I leave that to you to decide. I have
tried to be clear without being completely repetitive. Hopefully others
will find it useful.
There are 3 long lines in doc/rlm_sqlcounter that I see wrap badly -
sorry about that. I was just trying to stay with the style of the file.
Thanks,
Index: doc/rlm_sqlcounter
===================================================================
--- doc/rlm_sqlcounter (revision 939)
+++ doc/rlm_sqlcounter (working copy)
@@ -19,7 +19,7 @@
[1] Create a text file called sqlcounter.conf in the same
directory where radiusd.conf resides (usually /usr/local/etc/raddb)
-with the following content:
+with the following content (for mysql):
#-----#
sqlcounter noresetcounter {
@@ -59,6 +59,39 @@
#-----#
+The respective lines for postgresql are:
+
+query = "SELECT SUM(AcctSessionTime) FROM radacct WHERE UserName='%{%k}'"
+query = "SELECT SUM(AcctSessionTime - GREATER((%b - AcctStartTime::ABSTIME::INT4), 0)) FROM radacct WHERE UserName='%{%k}' AND AcctStartTime::ABSTIME::INT4 + AcctSessionTime > '%b'"
+query = "SELECT SUM(AcctSessionTime - GREATER((%b - AcctStartTime::ABSTIME::INT4), 0)) FROM radacct WHERE UserName='%{%k}' AND AcctStartTime::ABSTIME::INT4 + AcctSessionTime > '%b'"
+
+If you are running postgres 7.x, you may not have a GREATER function.
+
+An example of one is:
+
+CREATE OR REPLACE FUNCTION "greater"(integer, integer) RETURNS integer AS '
+DECLARE
+ res INTEGER;
+ one INTEGER := 0;
+ two INTEGER := 0;
+BEGIN
+ one = $1;
+ two = $2;
+ IF one IS NULL THEN
+ one = 0;
+ END IF;
+ IF two IS NULL THEN
+ two = 0;
+ END IF;
+ IF one > two THEN
+ res := one;
+ ELSE
+ res := two;
+ END IF;
+ RETURN res;
+END;
+' LANGUAGE 'plpgsql';
+
[2] Include the above file to radiusd.conf by adding a line in
modules{ } section
Index: raddb/radiusd.conf.in
===================================================================
--- raddb/radiusd.conf.in (revision 939)
+++ raddb/radiusd.conf.in (working copy)
@@ -1454,24 +1454,42 @@
# This query properly handles calls that span from the
# previous reset period into the current period but
# involves more work for the SQL server than those
- # below
+ # below. For mysql:
query = "SELECT SUM(AcctSessionTime - \
GREATEST((%b - UNIX_TIMESTAMP(AcctStartTime)), 0)) \
FROM radacct WHERE UserName='%{%k}' AND \
UNIX_TIMESTAMP(AcctStartTime) + AcctSessionTime > '%b'"
+ # For postgresql:
+ # Note - if you are running 7.x, you may not have a GREATER
+ # function. Please see doc/sql_counter for an example.
+ # query = "SELECT SUM(AcctSessionTime - \
+ # GREATER((%b - AcctStartTime::ABSTIME::INT4), 0)) \
+ # FROM radacct WHERE UserName='%{%k}' AND \
+ # AcctStartTime::ABSTIME::INT4 + AcctSessionTime > '%b'"
+
# This query ignores calls that started in a previous
# reset period and continue into into this one. But it
- # is a little easier on the SQL server
+ # is a little easier on the SQL server. For mysql:
# query = "SELECT SUM(AcctSessionTime) FROM radacct WHERE \
# UserName='%{%k}' AND AcctStartTime > FROM_UNIXTIME('%b')"
+ # For postgresql:
+ # query = "SELECT SUM(AcctSessionTime) FROM radacct WHERE \
+ # UserName='%{%k}' AND AcctStartTime::ABSTIME::INT4 > '%b'"
+
# This query is the same as above, but demonstrates an
# additional counter parameter '%e' which is the
# timestamp for the end of the period
+ # For mysql:
# query = "SELECT SUM(AcctSessionTime) FROM radacct \
# WHERE UserName='%{%k}' AND AcctStartTime BETWEEN \
# FROM_UNIXTIME('%b') AND FROM_UNIXTIME('%e')"
+#
+ # For postgresql:
+ # query = "SELECT SUM(AcctSessionTime) FROM radacct \
+ # WHERE UserName='%{%k}' AND AcctStartTime::ABSTIME::INT4 \
+ # BETWEEN '%b' AND '%e'"
}
sqlcounter monthlycounter {
@@ -1484,7 +1502,9 @@
# This query properly handles calls that span from the
# previous reset period into the current period but
# involves more work for the SQL server than those
- # below
+ # below.
+ # The same notes above about the differences between mysql
+ # versus postgres queries apply here.
query = "SELECT SUM(AcctSessionTime - \
GREATEST((%b - UNIX_TIMESTAMP(AcctStartTime)), 0)) \
FROM radacct WHERE UserName='%{%k}' AND \
--
--------------------------------------------------------------------------
| Stephen Gran | What nonsense people talk about happy |
| steve at lobefin.net | marriages! A man can be happy with any |
| http://www.lobefin.net/~steve | woman so long as he doesn't love her. |
| | -- Oscar Wilde |
--------------------------------------------------------------------------
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lists.freeradius.org/pipermail/freeradius-devel/attachments/20060728/391a6ed5/attachment.pgp>
More information about the Freeradius-Devel
mailing list