Finally allowed "username@domain.com" to be specified
[clearscm.git] / maps / lib / MAPSUtil.pm
1 #!/usr/bin/perl
2 ################################################################################
3 #
4 # File:         $RCSfile: MAPSUtil.pm,v $
5 # Revision:     $Revision: 1.1 $
6 # Description:  MAPS Utilities
7 # Author:       Andrew@DeFaria.com
8 # Created:      Fri Nov 29 14:17:21  2002
9 # Modified:     $Date: 2013/06/12 14:05:47 $
10 # Language:     perl
11 #
12 # (c) Copyright 2000-2006, Andrew@DeFaria.com, all rights reserved.
13 #
14 ################################################################################
15 package MAPSUtil;
16
17 use strict;
18 use warnings;
19
20 use vars qw (@ISA @EXPORT);
21
22 # Not sure why I was setting TZ to LA but I'm in Phoenix now. This is best
23 # handled by configuring the OS correctly anyway.
24 #BEGIN {
25 #  $ENV{TZ}='America/Los_Angeles';
26 #} # BEGIN
27
28 @ISA = qw (Exporter);
29
30 @EXPORT = qw(
31   CheckEmail
32   FormatDate
33   FormatTime
34   SQLDatetime2UnixDatetime
35   SubtractDays
36   Today2SQLDatetime
37   UnixDatetime2SQLDatetime
38 );
39
40 sub Today2SQLDatetime;
41
42 sub FormatDate($) {
43   my ($date) = @_;
44
45   return substr ($date, 5, 2)  . '/' .
46          substr ($date, 8, 2)  . '/' .
47          substr ($date, 0, 4);
48 } # FormatDate
49
50 sub FormatTime($) {
51   my ($time) = @_;
52
53   my $hours   = substr $time, 0, 2;
54
55   $hours = substr $hours, 1, 1 if $hours < 10;
56
57   my $minutes = substr $time, 3, 2;
58   my $seconds = substr $time, 6, 2;
59   my $AmPm    = $hours > 12 ? 'Pm' : 'Am';
60
61   $hours = $hours - 12 if $hours > 12;
62
63   return "$hours:$minutes:$seconds $AmPm";
64 } # FormatTime
65
66 sub SQLDatetime2UnixDatetime($) {
67   my ($sqldatetime) = @_;
68
69   my %months = (
70     '01' => 'Jan',
71     '02' => 'Feb',
72     '03' => 'Mar',
73     '04' => 'Apr',
74     '05' => 'May',
75     '06' => 'Jun',
76     '07' => 'Jul',
77     '08' => 'Aug',
78     '09' => 'Sep',
79     '10' => 'Oct',
80     '11' => 'Nov',
81     '12' => 'Dec',
82   );
83
84   my $year  = substr $sqldatetime, 0, 4;
85   my $month = substr $sqldatetime, 5, 2;
86   my $day   = substr $sqldatetime, 8, 2;
87   my $time  = FormatTime substr $sqldatetime, 11;
88
89   return $months {$month} . " $day, $year \@ $time";
90 } # SQLDatetime2UnixDatetime
91
92 sub SubtractDays($$) {
93   my ($timestamp,$nbr_of_days) = @_;
94
95   my @months = (
96     31, # January
97     28, # February
98     31, # March
99     30, # April
100     31, # May
101     30, # June
102     31, # July
103     31, # August
104     30, # September
105     31, # October
106     30, # November
107     31  # Descember
108   );
109
110   my $year  = substr $timestamp, 0, 4;
111   my $month = substr $timestamp, 5, 2;
112   my $day   = substr $timestamp, 8, 2;
113
114   # Convert to Julian
115   my $days = 0;
116   my $m    = 1;
117
118   for (@months) {
119     last if $m >= $month;
120     $m++;
121     $days += $_;
122   } # for
123
124   # Subtract $nbr_of_days
125   $days += $day - $nbr_of_days;
126
127   # Compute $days_in_year
128   my $days_in_year;
129
130   # Adjust if crossing year boundary
131   if ($days <= 0) {
132     $year--;
133     $days_in_year = (($year % 4) == 0) ? 366 : 365;
134     $days = $days_in_year + $days;
135   } else {
136     $days_in_year = (($year % 4) == 0) ? 366 : 365;
137   } # if
138
139   # Convert back
140   $month = 0;
141
142   while ($days > 28) {
143     # If remaining days is less than the current month then last
144     last if ($days <= $months[$month]);
145
146     # Subtract off the number of days in this month
147     $days -= $months[$month++];
148   } # while
149
150   # Prefix month with 0 if necessary
151   $month++;
152   if ($month < 10) {
153     $month = '0' . $month;
154   } # if
155
156   # Prefix days with 0 if necessary
157   if ($days == 0) { 
158      $days = '01';
159   } elsif ($days < 10) {
160     $days = '0' . $days;
161   } # if  
162
163   return $year . '-' . $month . '-' . $days . substr $timestamp, 10;
164 } # SubtractDays
165
166 sub UnixDatetime2SQLDatetime($) {
167   my ($datetime) = @_;
168
169   my $orig_datetime = $datetime;
170   my %months = (
171     'Jan' => '01',
172     'Feb' => '02',
173     'Mar' => '03',
174     'Apr' => '04',
175     'May' => '05',
176     'Jun' => '06',
177     'Jul' => '07',
178     'Aug' => '08',
179     'Sep' => '09',
180     'Oct' => '10',
181     'Nov' => '11',
182     'Dec' => '12',
183   );
184
185   # Some mailers neglect to put the leading day of the week field in.
186   # Check for this and compensate.
187   my $dow = substr $datetime, 0, 3;
188
189   if ($dow ne 'Mon' &&
190       $dow ne 'Tue' &&
191       $dow ne 'Wed' &&
192       $dow ne 'Thu' &&
193       $dow ne 'Fri' &&
194       $dow ne 'Sat' &&
195       $dow ne 'Sun') {
196     $datetime = 'XXX, ' . $datetime;
197   } # if
198
199   # Some mailers have day before month. We need to correct this
200   my $day = substr $datetime, 5, 2;
201
202   if ($day =~ /\d /) {
203     $day = '0' . (substr $day, 0, 1);
204     $datetime = (substr $datetime, 0, 5) . $day . (substr $datetime, 6);
205   } # if
206
207   if ($day !~ /\d\d/) {
208     $day = substr $datetime, 8, 2;
209   } # if
210
211   # Check for 1 digit date
212   if ((substr $day, 0, 1) eq ' ') {
213     $day = '0' . (substr $day, 1, 1);
214     $datetime = (substr $datetime, 0, 8) . $day . (substr $datetime, 10);
215   } # if
216
217   my $year  = substr $datetime, 20, 4;
218
219   if ($year !~ /\d\d\d\d/) {
220     $year = substr $datetime, 12, 4;
221     if ($year !~ /\d\d\d\d/) {
222       $year = substr $datetime, 12, 2;
223     } #if
224   } # if
225
226   # Check for 2 digit year. Argh!
227   if (length $year == 2 or (substr $year, 2, 1) eq ' ') {
228       $year = '20' . (substr $year, 0, 2);
229       $datetime = (substr $datetime, 0, 12) . '20' . (substr $datetime, 12);
230   } # if
231
232   my $month_name = substr $datetime, 4, 3;
233
234   if (!defined $months {$month_name}) {
235     $month_name = substr $datetime, 8, 3;
236   } # if
237   my $month = $months {$month_name};
238
239   my $time  = substr $datetime, 11, 8;
240
241   if ($time !~ /\d\d:\d\d:\d\d/) {
242     $time = substr $datetime, 17, 8
243   } # if
244
245   if (!defined $year) {
246     print "WARNING: Year undefined for $orig_datetime\nReturning today's date\n";
247     return Today2SQLDatetime;
248   } # if
249   if (!defined $month) {
250     print "Month undefined for $orig_datetime\nReturning today's date\n";
251     return Today2SQLDatetime;
252   } # if
253   if (!defined $day) {
254     print "Day undefined for $orig_datetime\nReturning today's date\n";
255     return Today2SQLDatetime;
256   } # if
257   if (!defined $time) {
258     print "Time undefined for $orig_datetime\nReturning today's date\n";
259     return Today2SQLDatetime;
260   } # if
261
262   return "$year-$month-$day $time";
263 } # UnixDatetime2SQLDatetime
264
265 sub Today2SQLDatetime() {
266   return UnixDatetime2SQLDatetime(scalar localtime);
267 } # Today2SQLDatetime
268
269 sub CheckEmail($$) {
270   my ($username, $domain) = @_;
271
272   # Check to see if a full email address in either $username or $domain
273   if ($username eq '') {
274     return '' if $domain eq '';
275
276     if ($domain =~ /(.*)\@(.*)/) {
277       ($username, $domain) = split '@', $domain;
278     } # if
279   } elsif ($domain eq '') {
280     if ($username =~ /(.*)\@(.*)/) {
281       ($username, $domain) = split '@', $username;
282     } # if
283   } # if
284
285    return lc "$username\@$domain";
286 } # CheckEmail
287
288 1;