Simplifications to the localtime() interface. Fix the case where

localtime_r() is available so that it works.  Ticket [bd484a090c8077].

FossilOrigin-Name: 5b68dae320d0fa3dc433826811e5018a47461de7
This commit is contained in:
drh 2011-06-21 14:35:30 +00:00
parent 7c8b355e65
commit 8720aeb564
3 changed files with 45 additions and 83 deletions

View File

@ -1,5 +1,5 @@
C Change\sthe\serror\smessage\sreturned\swhen\slocaltime_r()\sfails\sto\s"local\stime\sunavailable".
D 2011-06-21T13:46:11.287
C Simplifications\sto\sthe\slocaltime()\sinterface.\s\sFix\sthe\scase\swhere\nlocaltime_r()\sis\savailable\sso\sthat\sit\sworks.\s\sTicket\s[bd484a090c8077].
D 2011-06-21T14:35:30.890
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
F Makefile.in c1d7a7f4fd8da6b1815032efca950e3d5125407e
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@ -131,7 +131,7 @@ F src/build.c 5a428625d21ad409514afb40ad083bee25dd957a
F src/callback.c 0425c6320730e6d3981acfb9202c1bed9016ad1a
F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac
F src/ctime.c 7deec4534f3b5a0c3b4a4cbadf809d321f64f9c4
F src/date.c 193172e7a5e46b710bbf0f4211583ff6c23c7e21
F src/date.c 2c5b336a05029c1647f7a4fe03d7ee50b9747bba
F src/delete.c cecc926c70783452f3e8eb452c728291ce1a0b21
F src/expr.c ab46ab0f0c44979a8164ca31728d7d10ae5e8106
F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb
@ -948,7 +948,7 @@ F tool/symbols.sh bc2a3709940d47c8ac8e0a1fdf17ec801f015a00
F tool/tostr.awk 11760e1b94a5d3dcd42378f3cc18544c06cfa576
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
F tool/warnings.sh 347d974d143cf132f953b565fbc03026f19fcb4d
P 97e86ec6df4d893527fe9f43eb46163d9b06416a
R e0015d917e226c6056689f5a9862debe
U dan
Z 66bfa4b384ab8dfebefd27a1fbb7cf7e
P 0e82175fd86f0ca5da90676aaee3118a70264d85
R 39249556a57f6de5d465bb75e25a77c9
U drh
Z f3f5de06e02a4cdc489a3c883165212f

View File

@ -1 +1 @@
0e82175fd86f0ca5da90676aaee3118a70264d85
5b68dae320d0fa3dc433826811e5018a47461de7

View File

@ -412,41 +412,41 @@ static void clearYMD_HMS_TZ(DateTime *p){
}
#ifndef SQLITE_OMIT_LOCALTIME
/*
** The following three functions - osLocaltime_r(), osLocaltime_s() and
** osLocaltime() - are wrappers around system functions localtime_r(),
** localtime_s() and localtime(), respectively.
** The following routine implements the rough equivalent of localtime_r()
** using whatever operating-system specific localtime facility that
** is available. This routine returns 0 on success and
** non-zero on any kind of error.
**
** If the sqlite3GlobalConfig.bLocaltimeFault variable is true when one
** of the following wrappers is called, it returns an error.
** If the sqlite3GlobalConfig.bLocaltimeFault variable is true then this
** routine will always fail.
*/
int osLocaltime(time_t *t, struct tm *pTm){
int rc;
#ifndef SQLITE_OMIT_BUILTIN_TEST
#ifdef HAVE_LOCALTIME_R
static struct tm * osLocaltime_r(time_t *t, struct tm *pTm){
if( sqlite3GlobalConfig.bLocaltimeFault ) return 0;
return localtime_r(t);
}
#elif defined(HAVE_LOCALTIME_S) && HAVE_LOCALTIME_S
static int osLocaltime_s(struct tm *pTm, time_t *t){
if( sqlite3GlobalConfig.bLocaltimeFault ) return 1;
return (int)localtime_s(pTm, t);
}
#else
static struct tm * osLocaltime(time_t *t){
if( sqlite3GlobalConfig.bLocaltimeFault ) return 0;
return localtime(t);
}
#endif
#ifdef HAVE_LOCALTIME_R
rc = localtime_r(t, pTm)==0;
#elif defined(HAVE_LOCALTIME_S) && HAVE_LOCALTIME_S
rc = localtime_s(pTm, t);
#else
# define osLocaltime_r(x,y) localtime_r(x,y)
# define osLocaltime_s(x,y) localtime_s(x,y)
# define osLocaltime(x) localtime(x)
{
struct tm *pX;
sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);
sqlite3_mutex_enter(mutex);
pX = localtime(t);
if( pX ) *pTm = *pX;
sqlite3_mutex_leave(mutex);
rc = pX==0;
}
#endif
return rc;
}
#endif /* SQLITE_OMIT_LOCALTIME */
#ifndef SQLITE_OMIT_LOCALTIME
/*
** Compute the difference (in milliseconds) between localtime and UTC
** (a.k.a. GMT) for the time value p where p is in UTC. If no error occurs,
@ -462,6 +462,8 @@ static sqlite3_int64 localtimeOffset(
){
DateTime x, y;
time_t t;
struct tm sLocal;
x = *p;
computeYMD_HMS(&x);
if( x.Y<1971 || x.Y>=2038 ){
@ -479,57 +481,17 @@ static sqlite3_int64 localtimeOffset(
x.validJD = 0;
computeJD(&x);
t = (time_t)(x.iJD/1000 - 21086676*(i64)10000);
#ifdef HAVE_LOCALTIME_R
{
struct tm sLocal;
if( 0==osLocaltime_r(&t, &sLocal) ){
sqlite3_result_error(pCtx, "local time unavailable", -1);
*pRc = SQLITE_ERROR;
return 0;
}
y.Y = sLocal.tm_year + 1900;
y.M = sLocal.tm_mon + 1;
y.D = sLocal.tm_mday;
y.h = sLocal.tm_hour;
y.m = sLocal.tm_min;
y.s = sLocal.tm_sec;
if( osLocaltime(&t, &sLocal) ){
sqlite3_result_error(pCtx, "local time unavailable", -1);
*pRc = SQLITE_ERROR;
return 0;
}
#elif defined(HAVE_LOCALTIME_S) && HAVE_LOCALTIME_S
{
struct tm sLocal;
if( 0!=osLocaltime_s(&sLocal, &t) ){
sqlite3_result_error(pCtx, "local time unavailable", -1);
*pRc = SQLITE_ERROR;
return 0;
}
y.Y = sLocal.tm_year + 1900;
y.M = sLocal.tm_mon + 1;
y.D = sLocal.tm_mday;
y.h = sLocal.tm_hour;
y.m = sLocal.tm_min;
y.s = sLocal.tm_sec;
}
#else
{
struct tm *pTm;
sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
pTm = osLocaltime(&t);
if( pTm ){
y.Y = pTm->tm_year + 1900;
y.M = pTm->tm_mon + 1;
y.D = pTm->tm_mday;
y.h = pTm->tm_hour;
y.m = pTm->tm_min;
y.s = pTm->tm_sec;
}
sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
if( !pTm ){
sqlite3_result_error(pCtx, "local time unavailable", -1);
*pRc = SQLITE_ERROR;
return 0;
}
}
#endif
y.Y = sLocal.tm_year + 1900;
y.M = sLocal.tm_mon + 1;
y.D = sLocal.tm_mday;
y.h = sLocal.tm_hour;
y.m = sLocal.tm_min;
y.s = sLocal.tm_sec;
y.validYMD = 1;
y.validHMS = 1;
y.validJD = 0;