mirror of
https://github.com/mdbtools/mdbtools.git
synced 2025-11-26 10:29:27 +08:00
Make better use of glib function
This commit is contained in:
@@ -1,3 +1,6 @@
|
|||||||
|
Mon May 31 12:19:05 CDT 2004 Jeff Smith <whydoubt@yahoo.com>
|
||||||
|
* src/libmdb/file.c: Make better use of glib functions
|
||||||
|
|
||||||
Sun May 30 00:04:55 CDT 2004 Jeff Smith <whydoubt@yahoo.com>
|
Sun May 30 00:04:55 CDT 2004 Jeff Smith <whydoubt@yahoo.com>
|
||||||
* src/libmdb/data.c:
|
* src/libmdb/data.c:
|
||||||
* src/libmdb/file.c:
|
* src/libmdb/file.c:
|
||||||
|
|||||||
@@ -53,45 +53,35 @@ MdbFormatConstants MdbJet3Constants = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static size_t _mdb_read_pg(MdbHandle *mdb, unsigned char *pg_buf, unsigned long pg);
|
static size_t _mdb_read_pg(MdbHandle *mdb, unsigned char *pg_buf, unsigned long pg);
|
||||||
static int mdb_find_file(char *file_name, char *file_path, int bufsize)
|
|
||||||
|
static gchar *mdb_find_file(char *file_name)
|
||||||
{
|
{
|
||||||
struct stat status;
|
struct stat status;
|
||||||
gchar *s, *mdbpath;
|
gchar *mdbpath, **dir, *tmpfname;
|
||||||
gchar *dir, *tmpfname;
|
unsigned int i = 0;
|
||||||
int ret;
|
|
||||||
|
|
||||||
/* try the provided file name first */
|
/* try the provided file name first */
|
||||||
if (!stat(file_name, &status)) {
|
if (!stat(file_name, &status)) {
|
||||||
if (strlen(file_name)> bufsize)
|
return g_strdup(file_name);
|
||||||
return strlen(file_name);
|
|
||||||
strcpy(file_path, file_name);
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now pull apart $MDBPATH and try those */
|
/* Now pull apart $MDBPATH and try those */
|
||||||
s = (gchar *) getenv("MDBPATH");
|
mdbpath = (gchar *) getenv("MDBPATH");
|
||||||
if (!s || !strlen(s)) return -1; /* no path, can't find file */
|
/* no path, can't find file */
|
||||||
|
if (!mdbpath || !strlen(mdbpath)) return NULL;
|
||||||
|
|
||||||
mdbpath = g_strdup(s);
|
dir = g_strsplit(mdbpath, ":", 0);
|
||||||
dir = strtok(mdbpath,":");
|
while (dir[i]) {
|
||||||
do {
|
if (!strlen(dir[i])) continue;
|
||||||
tmpfname = (gchar *) g_malloc(strlen(dir)+strlen(file_name)+2);
|
tmpfname = g_strconcat(dir[i++], "/", file_name, NULL);
|
||||||
strcpy(tmpfname, dir);
|
|
||||||
if (dir[strlen(dir)-1]!='/') strcat(tmpfname, "/");
|
|
||||||
strcat(tmpfname, file_name);
|
|
||||||
if (!stat(tmpfname, &status)) {
|
if (!stat(tmpfname, &status)) {
|
||||||
if (strlen(tmpfname)> bufsize) {
|
g_strfreev(dir);
|
||||||
ret = strlen(tmpfname);
|
return tmpfname;
|
||||||
g_free(tmpfname);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
strcpy(file_path, tmpfname);
|
|
||||||
g_free(tmpfname);
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
g_free(tmpfname);
|
g_free(tmpfname);
|
||||||
} while ((dir = strtok(NULL, ":")));
|
}
|
||||||
return -1;
|
g_strfreev(dir);
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* mdb_open:
|
* mdb_open:
|
||||||
@@ -106,40 +96,31 @@ int ret;
|
|||||||
**/
|
**/
|
||||||
MdbHandle *mdb_open(char *filename, MdbFileFlags flags)
|
MdbHandle *mdb_open(char *filename, MdbFileFlags flags)
|
||||||
{
|
{
|
||||||
MdbHandle *mdb;
|
MdbHandle *mdb;
|
||||||
int bufsize;
|
|
||||||
MdbFile *f;
|
|
||||||
|
|
||||||
mdb = (MdbHandle *) g_malloc0(sizeof(MdbHandle));
|
mdb = (MdbHandle *) g_malloc0(sizeof(MdbHandle));
|
||||||
mdb_set_default_backend(mdb, "access");
|
mdb_set_default_backend(mdb, "access");
|
||||||
/* need something to bootstrap with, reassign after page 0 is read */
|
/* need something to bootstrap with, reassign after page 0 is read */
|
||||||
mdb->fmt = &MdbJet3Constants;
|
mdb->fmt = &MdbJet3Constants;
|
||||||
mdb->f = f = (MdbFile *) g_malloc0(sizeof(MdbFile));
|
mdb->f = (MdbFile *) g_malloc0(sizeof(MdbFile));
|
||||||
f->filename = (char *) g_malloc(strlen(filename)+1);
|
mdb->f->filename = (char *) mdb_find_file(filename);
|
||||||
bufsize = strlen(filename)+1;
|
if (!mdb->f->filename) {
|
||||||
bufsize = mdb_find_file(filename, f->filename, bufsize);
|
fprintf(stderr, "Can't alloc filename\n");
|
||||||
if (bufsize) {
|
g_free(mdb->f->filename);
|
||||||
f->filename = (char *) g_realloc(f->filename, bufsize+1);
|
g_free(mdb->f);
|
||||||
bufsize = mdb_find_file(filename, f->filename, bufsize);
|
g_free(mdb->backend_name);
|
||||||
if (bufsize) {
|
g_free(mdb);
|
||||||
fprintf(stderr, "Can't alloc filename\n");
|
return NULL;
|
||||||
g_free(f->filename);
|
|
||||||
g_free(f);
|
|
||||||
g_free(mdb->backend_name);
|
|
||||||
g_free(mdb);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
//strcpy(f->filename, filename);
|
|
||||||
if (flags & MDB_WRITABLE) {
|
if (flags & MDB_WRITABLE) {
|
||||||
f->writable = TRUE;
|
mdb->f->writable = TRUE;
|
||||||
f->fd = open(f->filename,O_RDWR);
|
mdb->f->fd = open(mdb->f->filename,O_RDWR);
|
||||||
} else {
|
} else {
|
||||||
f->fd = open(f->filename,O_RDONLY);
|
mdb->f->fd = open(mdb->f->filename,O_RDONLY);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (f->fd==-1) {
|
if (mdb->f->fd==-1) {
|
||||||
fprintf(stderr,"Couldn't open file %s\n",f->filename);
|
fprintf(stderr,"Couldn't open file %s\n",mdb->f->filename);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (!mdb_read_pg(mdb, 0)) {
|
if (!mdb_read_pg(mdb, 0)) {
|
||||||
@@ -147,10 +128,10 @@ MdbFile *f;
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (mdb->pg_buf[0] != 0) {
|
if (mdb->pg_buf[0] != 0) {
|
||||||
close(f->fd);
|
close(mdb->f->fd);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
f->jet_version = mdb_pg_get_int32(mdb, 0x14);
|
mdb->f->jet_version = mdb_pg_get_int32(mdb, 0x14);
|
||||||
if (IS_JET4(mdb)) {
|
if (IS_JET4(mdb)) {
|
||||||
mdb->fmt = &MdbJet4Constants;
|
mdb->fmt = &MdbJet4Constants;
|
||||||
} else if (IS_JET3(mdb)) {
|
} else if (IS_JET3(mdb)) {
|
||||||
@@ -160,7 +141,7 @@ MdbFile *f;
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
f->refs++;
|
mdb->f->refs++;
|
||||||
return mdb;
|
return mdb;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user