mirror of
https://github.com/mdbtools/mdbtools.git
synced 2026-03-10 00:20:54 +08:00
missed added files
This commit is contained in:
127
src/libmdb/props.c
Normal file
127
src/libmdb/props.c
Normal file
@@ -0,0 +1,127 @@
|
||||
/* MDB Tools - A library for reading MS Access database file
|
||||
* Copyright (C) 2000 Brian Bruns
|
||||
*
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include "mdbtools.h"
|
||||
|
||||
GPtrArray *
|
||||
mdb_read_props_list(gchar *kkd, int len)
|
||||
{
|
||||
guint32 record_len;
|
||||
int pos = 0;
|
||||
gchar *name;
|
||||
GPtrArray *names = NULL;
|
||||
int i = 0;
|
||||
|
||||
names = g_ptr_array_new();
|
||||
#ifdef MDB_DEBUG
|
||||
buffer_dump(kkd, 0, len - 1);
|
||||
#endif
|
||||
pos = 0;
|
||||
while (pos < len) {
|
||||
record_len = mdb_get_int16(kkd, pos);
|
||||
pos += 2;
|
||||
#ifdef MDB_DEBUG
|
||||
printf("%02d ",i++);
|
||||
buffer_dump(kkd, pos - 2, pos + record_len - 1);
|
||||
#endif
|
||||
name = g_malloc(record_len + 1);
|
||||
strncpy(name, &kkd[pos], record_len);
|
||||
name[record_len] = '\0';
|
||||
pos += record_len;
|
||||
g_ptr_array_add(names, name);
|
||||
#ifdef MDB_DEBUG
|
||||
printf("new len = %d\n", names->len);
|
||||
#endif
|
||||
}
|
||||
return names;
|
||||
}
|
||||
void
|
||||
mdb_free_props(MdbProperties *props)
|
||||
{
|
||||
if (!props) return;
|
||||
|
||||
if (props->name) g_free(props->name);
|
||||
g_free(props);
|
||||
}
|
||||
MdbProperties *
|
||||
mdb_alloc_props()
|
||||
{
|
||||
MdbProperties *props;
|
||||
|
||||
props = g_malloc0(sizeof(MdbProperties));
|
||||
|
||||
return props;
|
||||
}
|
||||
MdbProperties *
|
||||
mdb_read_props(MdbHandle *mdb, GPtrArray *names, gchar *kkd, int len)
|
||||
{
|
||||
guint32 record_len, name_len;
|
||||
int pos = 0;
|
||||
int elem, dtype, dsize;
|
||||
gchar *name, *value;
|
||||
MdbProperties *props;
|
||||
int i = 0;
|
||||
|
||||
#ifdef MDB_DEBUG
|
||||
buffer_dump(kkd, 0, len - 1);
|
||||
#endif
|
||||
pos = 0;
|
||||
|
||||
/* skip the name record */
|
||||
record_len = mdb_get_int16(kkd, pos);
|
||||
pos += 4;
|
||||
name_len = mdb_get_int16(kkd, pos);
|
||||
pos += 2;
|
||||
props = mdb_alloc_props();
|
||||
if (name_len) {
|
||||
props->name = g_malloc(name_len + 1);
|
||||
strncpy(props->name, &kkd[pos], name_len);
|
||||
props->name[name_len]='\0';
|
||||
}
|
||||
pos += name_len;
|
||||
|
||||
props->hash = g_hash_table_new(g_str_hash, g_str_equal);
|
||||
|
||||
while (pos < len) {
|
||||
record_len = mdb_get_int16(kkd, pos);
|
||||
elem = mdb_get_int16(kkd, pos + 4);
|
||||
dtype = kkd[pos + 3];
|
||||
dsize = mdb_get_int16(kkd, pos + 6);
|
||||
value = g_malloc(dsize + 1);
|
||||
strncpy(value, &kkd[pos + 8], dsize);
|
||||
value[dsize] = '\0';
|
||||
name = g_ptr_array_index(names,elem);
|
||||
#ifdef MDB_DEBUG
|
||||
printf("%02d ",i++);
|
||||
buffer_dump(kkd, pos, pos + record_len - 1);
|
||||
printf("elem %d dsize %d dtype %d\n", elem, dsize, dtype);
|
||||
#endif
|
||||
if (dtype == MDB_MEMO) dtype = MDB_TEXT;
|
||||
if (dtype == MDB_BOOL) {
|
||||
g_hash_table_insert(props->hash, g_strdup(name), g_strdup(kkd[pos + 8] ? "yes" : "no"));
|
||||
} else {
|
||||
g_hash_table_insert(props->hash, g_strdup(name), g_strdup(mdb_col_to_string(mdb, kkd, pos + 8, dtype, dsize)));
|
||||
}
|
||||
g_free(value);
|
||||
pos += record_len;
|
||||
}
|
||||
return props;
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user