⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unixsocketseqfile.c

📁 适合于Unix/Linux下的一个持久数据库连接池
💻 C
字号:
// Copyright (c) 1999-2004  David Muse// See the file COPYING for more information#include <sqlrconnection.h>#include <stdio.h>// for umask#include <sys/types.h>#include <sys/stat.h>#include <math.h>#include <rudiments/permissions.h>#include <config.h>bool sqlrconnection_svr::getUnixSocket(const char *tmpdir, char *unixsocketptr) {	#ifdef SERVER_DEBUG	debugPrint("connection",0,"getting unix socket...");	#endif	file	sockseq;	if (!openSequenceFile(&sockseq,tmpdir,unixsocketptr) ||						!lockSequenceFile(&sockseq)) {		return false;	}	if (!getAndIncrementSequenceNumber(&sockseq,unixsocketptr)) {		unLockSequenceFile(&sockseq);		sockseq.close();		return false;	}	if (!unLockSequenceFile(&sockseq)) {		sockseq.close();		return false;	}	if (!sockseq.close()) {		return false;	}	#ifdef SERVER_DEBUG	debugPrint("connection",0,"done getting unix socket");	#endif	return true;}bool sqlrconnection_svr::openSequenceFile(file *sockseq,				const char *tmpdir, char *unixsocketptr) {	// open the sequence file and get the current port number	size_t	sockseqnamelen=charstring::length(tmpdir)+9;	char	*sockseqname=new char[sockseqnamelen];	snprintf(sockseqname,sockseqnamelen,"%s/sockseq",tmpdir);	#ifdef SERVER_DEBUG	size_t	stringlen=8+charstring::length(sockseqname)+1;	char	*string=new char[stringlen];	snprintf(string,stringlen,"opening %s",sockseqname);	debugPrint("connection",1,string);	delete[] string;	#endif	mode_t	oldumask=umask(011);	bool	success=sockseq->open(sockseqname,O_RDWR|O_CREAT,				permissions::everyoneReadWrite());	umask(oldumask);	// handle error	if (!success) {		fprintf(stderr,"Could not open: %s\n",sockseqname);		fprintf(stderr,"Make sure that the file and directory are \n");		fprintf(stderr,"readable and writable.\n\n");		unixsocketptr[0]=(char)NULL;		#ifdef SERVER_DEBUG		stringlen=14+charstring::length(sockseqname)+1;		string=new char[stringlen];		snprintf(string,stringlen,"couldn't open %s",sockseqname);		debugPrint("connection",1,string);		delete[] string;		#endif	}	delete[] sockseqname;	return success;}bool sqlrconnection_svr::lockSequenceFile(file *sockseq) {	#ifdef SERVER_DEBUG	debugPrint("connection",1,"locking...");	#endif	return sockseq->lockFile(F_WRLCK);}bool sqlrconnection_svr::getAndIncrementSequenceNumber(file *sockseq,							char *unixsocketptr) {	// get the sequence number from the file	int32_t	buffer;	if (sockseq->read(&buffer)!=sizeof(int32_t)) {		buffer=0;	}	sprintf(unixsocketptr,"%d",buffer);	#ifdef SERVER_DEBUG	size_t	stringlen=21+charstring::length(unixsocketptr)+1;	char	*string=new char[stringlen];	snprintf(string,stringlen,"got sequence number: %s",unixsocketptr);	debugPrint("connection",1,string);	delete[] string;	#endif	// increment the sequence number	// (the (double) cast is required for solaris with -compat=4)	if (buffer==pow((double)2,31)) {		buffer=0;	} else {		buffer=buffer+1;	}	#ifdef SERVER_DEBUG	string=new char[50];	snprintf(string,50,"writing new sequence number: %d",buffer);	debugPrint("connection",1,string);	delete[] string;	#endif	// write the sequence number back to the file	if (sockseq->setPositionRelativeToBeginning(0)==-1) {		return false;	}	return (sockseq->write(buffer)==sizeof(int32_t));}bool sqlrconnection_svr::unLockSequenceFile(file *sockseq) {	// unlock and close the file in a platform-independent manner	#ifdef SERVER_DEBUG	debugPrint("connection",1,"unlocking...");	#endif	return sockseq->unlockFile();}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -