Bundle-OS2_default

 view release on metacpan or  search on metacpan

patches/diff_DBD-SQLite-0.28  view on Meta::CPAN

+};
+
+#if OS_UNIX
+#  if defined(HAVE_FLOCK) || defined(__EMX__)
+static int
+sqlite_flock(int fd, enum sqlite_flock_t how)
+{
+    int type;
+    int s, rc;
+
+    switch (how) {
+    case sqlite_flock_rlock:
+	type = LOCK_SH;
+	break;	
+    case sqlite_flock_wlock:
+	type = LOCK_EX;
+	break;
+    case sqlite_flock_unlock:
+	type = LOCK_UN;
+	break;
+    }
+    rc = flock(fd, type);
+    if( rc != 0 )
+      rc = (errno==EINVAL) ? SQLITE_NOLFS : SQLITE_BUSY;
+    else
+      rc = SQLITE_OK;
+    return rc;
+}
+#  else
+static int
+sqlite_flock(int fd, sqlite_flock_t how)
+{
+    struct flock lock;
+    int s, rc;
+
+    switch (how) {
+    case sqlite_flock_rlock:
+	lock.l_type = F_RDLCK;
+	break;	
+    case sqlite_flock_wlock:
+	lock.l_type = F_WRLCK;
+	break;
+    case sqlite_flock_unlock:
+	lock.l_type = F_UNLCK;
+	break;
+    }
+    lock.l_whence = SEEK_SET;
+    lock.l_start = lock.l_len = 0L;
+    s = fcntl(fd, F_SETLK, &lock);
+    if( s!=0 )
+      rc = (errno==EINVAL) ? SQLITE_NOLFS : SQLITE_BUSY;
+    else
+      rc = SQLITE_OK;
+    return rc;
+}
+#  endif
+#endif
+
 /*
 ** Change the status of the lock on the file "id" to be a readlock.
 ** If the file was write locked, then this reduces the lock to a read.
@@ -1139,16 +1206,8 @@ int sqliteOsReadLock(OsFile *id){
     }
     rc = SQLITE_OK;
   }else if( id->locked || id->pLock->cnt==0 ){
-    struct flock lock;
-    int s;
-    lock.l_type = F_RDLCK;
-    lock.l_whence = SEEK_SET;
-    lock.l_start = lock.l_len = 0L;
-    s = fcntl(id->fd, F_SETLK, &lock);
-    if( s!=0 ){
-      rc = (errno==EINVAL) ? SQLITE_NOLFS : SQLITE_BUSY;
-    }else{
-      rc = SQLITE_OK;
+    rc = sqlite_flock(id->fd, sqlite_flock_rlock);
+    if (rc == SQLITE_OK) {
       id->pLock->cnt = 1;
       id->locked = 1;
     }
@@ -1243,16 +1302,8 @@ int sqliteOsWriteLock(OsFile *id){
   int rc;
   sqliteOsEnterMutex();
   if( id->pLock->cnt==0 || (id->pLock->cnt==1 && id->locked==1) ){
-    struct flock lock;
-    int s;
-    lock.l_type = F_WRLCK;
-    lock.l_whence = SEEK_SET;
-    lock.l_start = lock.l_len = 0L;
-    s = fcntl(id->fd, F_SETLK, &lock);
-    if( s!=0 ){
-      rc = (errno==EINVAL) ? SQLITE_NOLFS : SQLITE_BUSY;
-    }else{
-      rc = SQLITE_OK;
+    rc = sqlite_flock(id->fd, sqlite_flock_wlock);
+    if (rc == SQLITE_OK) {
       id->pLock->cnt = -1;
       id->locked = 1;
     }
@@ -1355,18 +1406,9 @@ int sqliteOsUnlock(OsFile *id){
     id->pLock->cnt--;
     rc = SQLITE_OK;
   }else{
-    struct flock lock;
-    int s;
-    lock.l_type = F_UNLCK;
-    lock.l_whence = SEEK_SET;
-    lock.l_start = lock.l_len = 0L;
-    s = fcntl(id->fd, F_SETLK, &lock);
-    if( s!=0 ){
-      rc = (errno==EINVAL) ? SQLITE_NOLFS : SQLITE_BUSY;
-    }else{
-      rc = SQLITE_OK;
+    rc = sqlite_flock(id->fd, sqlite_flock_wlock);
+    if (rc == SQLITE_OK)
       id->pLock->cnt = 0;
-    }
   }
   sqliteOsLeaveMutex();
   id->locked = 0;



( run in 0.825 second using v1.01-cache-2.11-cpan-39bf76dae61 )