Compare commits
12 Commits
e5e02c40ec
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| f2f48cac5d | |||
| 7eaf3fd84c | |||
| f0e47fb9eb | |||
| 0b7fd87036 | |||
| 5b6784c07a | |||
| 952b7e3c9e | |||
| 0a95f19d31 | |||
| f6af7b7e3c | |||
| c93e367700 | |||
| af46d0424e | |||
| da07391042 | |||
| 179cc28502 |
@@ -1,6 +1,6 @@
|
||||
Package: rmodb
|
||||
Title: Metadata-Object pair database
|
||||
Version: 0.0.1
|
||||
Version: 0.1.0
|
||||
Author: Craig Williams [aut, cre]
|
||||
Maintainer: Craig Williams <craig@avsdev.uk>
|
||||
Description: RMODB implements a metadata-object database for storing R
|
||||
@@ -18,7 +18,7 @@ Encoding: UTF-8
|
||||
NeedsCompilation: yes
|
||||
LazyData: true
|
||||
Roxygen: list(markdown = TRUE)
|
||||
RoxygenNote: 7.0.2
|
||||
RoxygenNote: 7.1.1
|
||||
Suggests:
|
||||
testthat
|
||||
SystemRequirements: libmariadb-client-dev | libmariadb-client-lgpl-dev | libmysqlclient-dev (deb)
|
||||
|
||||
28
NAMESPACE
28
NAMESPACE
@@ -4,6 +4,7 @@ export(TYPE_BLOB)
|
||||
export(TYPE_BOOL)
|
||||
export(TYPE_DOUBLE)
|
||||
export(TYPE_FLOAT)
|
||||
export(TYPE_ID)
|
||||
export(TYPE_INT16)
|
||||
export(TYPE_INT32)
|
||||
export(TYPE_INT64)
|
||||
@@ -15,6 +16,23 @@ export(TYPE_UINT16)
|
||||
export(TYPE_UINT32)
|
||||
export(TYPE_UINT64)
|
||||
export(TYPE_UINT8)
|
||||
export(group)
|
||||
export(group_create)
|
||||
export(group_delete)
|
||||
export(group_exists)
|
||||
export(group_id)
|
||||
export(groups)
|
||||
export(link_user_group)
|
||||
export(metadata)
|
||||
export(metadata_query)
|
||||
export(metadatas)
|
||||
export(metaobject)
|
||||
export(metaobject_create)
|
||||
export(metaobject_delete)
|
||||
export(metaobject_ids)
|
||||
export(metaobject_query)
|
||||
export(metaobject_update)
|
||||
export(metaobjects)
|
||||
export(modb_conn_ref)
|
||||
export(modb_connect)
|
||||
export(modb_connectionExists)
|
||||
@@ -26,4 +44,14 @@ export(modb_destroy)
|
||||
export(modb_disconnect)
|
||||
export(modb_exists)
|
||||
export(modb_use)
|
||||
export(object)
|
||||
export(object_query)
|
||||
export(objects)
|
||||
export(unlink_user_group)
|
||||
export(user)
|
||||
export(user_create)
|
||||
export(user_delete)
|
||||
export(user_exists)
|
||||
export(user_id)
|
||||
export(users)
|
||||
useDynLib(rmodb, .registration = TRUE, .fixes = "c_")
|
||||
|
||||
@@ -230,4 +230,10 @@ modb_use <- function(modb_name, override = FALSE, ...) {
|
||||
conn_ref <- modb_conn_ref(args = list(...))
|
||||
res <- .Call(c_rmodb_use, conn_ref, modb_name, as.logical(override))
|
||||
return(res)
|
||||
}
|
||||
|
||||
modb_get_last_query <- function(...) {
|
||||
conn_ref <- modb_conn_ref(args = list(...))
|
||||
res <- .Call(c_rmodb_getLastQuery, conn_ref)
|
||||
return(res)
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
|
||||
#' @export
|
||||
group_id <- function(name, ...) {
|
||||
checkmate::assert_string(name)
|
||||
conn_ref <- modb_conn_ref(args = list(...))
|
||||
@@ -6,9 +7,11 @@ group_id <- function(name, ...) {
|
||||
res <- .Call(c_rmodb_groupId, conn_ref, name)
|
||||
return(res)
|
||||
}
|
||||
#' @export
|
||||
group_exists <- function(name, ...) {
|
||||
return(!is.na(group_id(name)))
|
||||
}
|
||||
#' @export
|
||||
group_create <- function(name, id = NULL, ...) {
|
||||
checkmate::assert_string(name)
|
||||
if (!checkmate::test_null(id)) {
|
||||
@@ -21,6 +24,7 @@ group_create <- function(name, id = NULL, ...) {
|
||||
res <- .Call(c_rmodb_createGroup, conn_ref, as.integer(id), name)
|
||||
return(res)
|
||||
}
|
||||
#' @export
|
||||
group_delete <- function(id, ...) {
|
||||
checkmate::assert_int(id)
|
||||
conn_ref <- modb_conn_ref(args = list(...))
|
||||
@@ -28,6 +32,7 @@ group_delete <- function(id, ...) {
|
||||
res <- .Call(c_rmodb_deleteGroup, conn_ref, as.integer(id))
|
||||
return(res)
|
||||
}
|
||||
#' @export
|
||||
group <- function(id, withMembers = TRUE, ...) {
|
||||
checkmate::assert_int(id)
|
||||
checkmate::assert_logical(withMembers)
|
||||
@@ -36,6 +41,7 @@ group <- function(id, withMembers = TRUE, ...) {
|
||||
res <- .Call(c_rmodb_group, conn_ref, as.integer(id), as.logical(withMembers))
|
||||
return(res)
|
||||
}
|
||||
#' @export
|
||||
groups <- function(withMembers = FALSE, withDeleted = FALSE, ...)
|
||||
{
|
||||
checkmate::assert_logical(withMembers)
|
||||
|
||||
178
R/Metaobject.R
178
R/Metaobject.R
@@ -1,13 +1,58 @@
|
||||
|
||||
metaobject_ids <- function(title, ...) {
|
||||
checkmate::assert_string(title)
|
||||
#' @export
|
||||
metaobject_ids <- function(query = list(), withDeleted = FALSE, ...) {
|
||||
checkmate::assert_list(query)
|
||||
checkmate::assert_logical(withDeleted)
|
||||
conn_ref <- modb_conn_ref(args = list(...))
|
||||
|
||||
res <- .Call(c_rmodb_metaobjectId, conn_ref, title)
|
||||
res <- .Call(c_rmodb_metaobjectIds, conn_ref, query, withDeleted)
|
||||
|
||||
return(res)
|
||||
}
|
||||
#' @export
|
||||
metaobject_query <- function(query = list(), withDeleted = FALSE, restrict_owner = 0, ...) {
|
||||
checkmate::assert_list(query)
|
||||
checkmate::assert_logical(withDeleted)
|
||||
checkmate::assert_int(restrict_owner)
|
||||
conn_ref <- modb_conn_ref(args = list(...))
|
||||
|
||||
res <- .Call(
|
||||
c_rmodb_metaobjectQuery, conn_ref,
|
||||
query, withDeleted, as.integer(restrict_owner)
|
||||
)
|
||||
|
||||
return(res)
|
||||
}
|
||||
#' @export
|
||||
metadata_query <- function(query = list(), withDeleted = FALSE, restrict_owner = 0, ...) {
|
||||
checkmate::assert_list(query)
|
||||
checkmate::assert_logical(withDeleted)
|
||||
checkmate::assert_int(restrict_owner)
|
||||
conn_ref <- modb_conn_ref(args = list(...))
|
||||
|
||||
res <- .Call(
|
||||
c_rmodb_metadataQuery, conn_ref,
|
||||
query, withDeleted, as.integer(restrict_owner)
|
||||
)
|
||||
|
||||
return(res)
|
||||
}
|
||||
#' @export
|
||||
object_query <- function(query = list(), withDeleted = FALSE, restrict_owner = 0, ...) {
|
||||
checkmate::assert_list(query)
|
||||
checkmate::assert_logical(withDeleted)
|
||||
checkmate::assert_int(restrict_owner)
|
||||
conn_ref <- modb_conn_ref(args = list(...))
|
||||
|
||||
res <- .Call(
|
||||
c_rmodb_metadataQuery, conn_ref,
|
||||
query, withDeleted, as.integer(restrict_owner)
|
||||
)
|
||||
|
||||
return(res)
|
||||
}
|
||||
|
||||
#' @export
|
||||
metaobject_create <- function(meta, obj, id = NULL, ...) {
|
||||
if (!checkmate::test_null(id)) {
|
||||
checkmate::assert_int(id)
|
||||
@@ -61,17 +106,87 @@ metaobject_create <- function(meta, obj, id = NULL, ...) {
|
||||
"created_on", "updated_on", "deleted_on"
|
||||
)
|
||||
ext <- meta[!(names(meta) %in% meta_fields)]
|
||||
meta <- meta[names(meta) %in% c("title", "owner_id", "group_ids")]
|
||||
meta <- meta[names(meta) %in% meta_fields]
|
||||
|
||||
|
||||
# utils::str(meta)
|
||||
# utils::str(ext)
|
||||
# utils::str(obj)
|
||||
|
||||
res <- .Call(c_rmodb_createMetaobject, conn_ref, as.integer(id), meta, obj, ext)
|
||||
|
||||
return(res)
|
||||
}
|
||||
|
||||
#' @export
|
||||
metaobject_update <- function(id, meta, obj, ...) {
|
||||
checkmate::assert_int(id)
|
||||
|
||||
# TODO: validate meta and obj
|
||||
# checkmate::assert_list(meta)
|
||||
# checkmate::assert_names(names(meta), must.include = c("title"))
|
||||
# assert_namesInclude(names(meta), one.of = c("owner", "owner_id"))
|
||||
# if (test_namesInclude(names(meta), all.of = c("owner"))) {
|
||||
# checkmate::assert_class(meta$owner, "modb_user")
|
||||
# meta$owner_id <- meta$owner$id
|
||||
# } else {
|
||||
# checkmate::assert_int(meta$owner_id)
|
||||
# }
|
||||
# meta$owner_id <- as.integer(meta$owner_id)
|
||||
|
||||
# assert_namesInclude(names(meta), one.of = c("groups", "group_ids"))
|
||||
# if (checkmate::test_null(meta$group_ids)) {
|
||||
# meta$group_ids <- list()
|
||||
# } else if (test_namesInclude(names(meta), all.of = c("groups"))) {
|
||||
# meta$group_ids <- list()
|
||||
# for (g in meta$groups) {
|
||||
# checkmate::assert_class(g, "modb_group")
|
||||
# meta$group_ids <- c(meta$group_ids, g$id)
|
||||
# }
|
||||
# } else if (checkmate::test_list(meta$group_ids)) {
|
||||
# if (length(meta$group_ids) > 0) {
|
||||
# checkmate::assert_integerish(unlist(meta$group_ids))
|
||||
# }
|
||||
# } else {
|
||||
# checkmate::assert_integerish(meta$group_ids)
|
||||
# }
|
||||
# meta$group_ids <- c(as.integer(meta$group_ids))
|
||||
|
||||
|
||||
conn_ref <- modb_conn_ref(args = list(...))
|
||||
|
||||
if (!missing(meta)) {
|
||||
meta_fields <- c(
|
||||
"id", "title", "owner_id", "owner", "groups", "group_ids",
|
||||
"created_on", "updated_on", "deleted_on"
|
||||
)
|
||||
ext <- meta[!(names(meta) %in% meta_fields)]
|
||||
meta <- meta[names(meta) %in% meta_fields[-1]]
|
||||
if (length(meta) == 0) {
|
||||
meta <- list(NULL)
|
||||
}
|
||||
if (length(ext) == 0) {
|
||||
ext <- list(NULL)
|
||||
}
|
||||
} else {
|
||||
meta <- list(NULL)
|
||||
ext <- list(NULL)
|
||||
}
|
||||
|
||||
if (missing(obj)) {
|
||||
obj <- list(NULL)
|
||||
}
|
||||
|
||||
|
||||
utils::str(meta)
|
||||
utils::str(ext)
|
||||
utils::str(obj)
|
||||
|
||||
res <- .Call(c_rmodb_createMetaobject, conn_ref, as.integer(id), meta, obj, ext)
|
||||
res <- .Call(c_rmodb_updateMetaobject, conn_ref, as.integer(id), meta, obj, ext)
|
||||
|
||||
return(res)
|
||||
}
|
||||
#' @export
|
||||
metaobject_delete <- function(id, ...) {
|
||||
checkmate::assert_int(id)
|
||||
conn_ref <- modb_conn_ref(args = list(...))
|
||||
@@ -79,6 +194,8 @@ metaobject_delete <- function(id, ...) {
|
||||
res <- .Call(c_rmodb_deleteMetaobject, conn_ref, as.integer(id))
|
||||
return(res)
|
||||
}
|
||||
|
||||
#' @export
|
||||
metaobject <- function(id, ...) {
|
||||
checkmate::assert_int(id)
|
||||
conn_ref <- modb_conn_ref(args = list(...))
|
||||
@@ -87,7 +204,8 @@ metaobject <- function(id, ...) {
|
||||
|
||||
return(res)
|
||||
}
|
||||
metaobjects <- function(withDeleted = FALSE, ...)
|
||||
#' @export
|
||||
metaobjects <- function(id_list = NULL, withDeleted = FALSE, ...)
|
||||
{
|
||||
checkmate::assert_logical(withDeleted)
|
||||
conn_ref <- modb_conn_ref(args = list(...))
|
||||
@@ -97,4 +215,52 @@ metaobjects <- function(withDeleted = FALSE, ...)
|
||||
)
|
||||
|
||||
return(res)
|
||||
}
|
||||
|
||||
#' @export
|
||||
metadata <- function(id, ...) {
|
||||
checkmate::assert_int(id)
|
||||
conn_ref <- modb_conn_ref(args = list(...))
|
||||
|
||||
res <- .Call(c_rmodb_metaobject, conn_ref, as.integer(id))
|
||||
res[names(res) %in% c("object")] <- NULL
|
||||
|
||||
return(res)
|
||||
}
|
||||
#' @export
|
||||
metadatas <- function(id_list = NULL, withDeleted = FALSE, ...) {
|
||||
if (!checkmate::test_null(id_list)) {
|
||||
return(lapply(
|
||||
id_list, rmodb:::metadata, conn_ref = conn_id, withDeleted = withDeleted
|
||||
))
|
||||
}
|
||||
conn_ref <- modb_conn_ref(args = list(...))
|
||||
|
||||
res <- .Call(c_rmodb_metadatas, conn_ref, as.logical(withDeleted))
|
||||
|
||||
return(res)
|
||||
}
|
||||
|
||||
#' @export
|
||||
object <- function(id, ...) {
|
||||
checkmate::assert_int(id)
|
||||
conn_ref <- modb_conn_ref(args = list(...))
|
||||
|
||||
res <- .Call(c_rmodb_metaobject, conn_ref, as.integer(id))
|
||||
|
||||
return(res$object)
|
||||
}
|
||||
#' @export
|
||||
objects <- function(id_list = NULL, withDeleted = FALSE, ...) {
|
||||
if (!checkmate::test_null(id_list)) {
|
||||
return(lapply(
|
||||
id_list, rmodb:::object, conn_ref = conn_id, withDeleted = withDeleted
|
||||
))
|
||||
}
|
||||
|
||||
conn_ref <- modb_conn_ref(args = list(...))
|
||||
|
||||
res <- .Call(c_rmodb_metaobjects, conn_ref, as.logical(withDeleted))
|
||||
|
||||
return(res$object)
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
|
||||
#' @export
|
||||
link_user_group <- function(user, group, ...) {
|
||||
conn_ref <- modb_conn_ref(args = list(...))
|
||||
if (checkmate::test_list(user)) {
|
||||
@@ -21,6 +22,7 @@ link_user_group <- function(user, group, ...) {
|
||||
return(res)
|
||||
}
|
||||
|
||||
#' @export
|
||||
unlink_user_group <- function(user, group, ...) {
|
||||
conn_ref <- modb_conn_ref(args = list(...))
|
||||
if (checkmate::test_list(user)) {
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
|
||||
#' @export
|
||||
user_id <- function(name, ...) {
|
||||
checkmate::assert_string(name)
|
||||
conn_ref <- modb_conn_ref(args = list(...))
|
||||
@@ -6,9 +7,11 @@ user_id <- function(name, ...) {
|
||||
res <- .Call(c_rmodb_userId, conn_ref, name)
|
||||
return(res)
|
||||
}
|
||||
#' @export
|
||||
user_exists <- function(name, ...) {
|
||||
return(!is.na(user_id(name)))
|
||||
}
|
||||
#' @export
|
||||
user_create <- function(name, email, id = NULL, ...) {
|
||||
checkmate::assert_string(name)
|
||||
checkmate::assert_string(email)
|
||||
@@ -22,6 +25,7 @@ user_create <- function(name, email, id = NULL, ...) {
|
||||
res <- .Call(c_rmodb_createUser, conn_ref, as.integer(id), name, email)
|
||||
return(res)
|
||||
}
|
||||
#' @export
|
||||
user_delete <- function(id, ...) {
|
||||
checkmate::assert_int(id)
|
||||
conn_ref <- modb_conn_ref(args = list(...))
|
||||
@@ -29,6 +33,7 @@ user_delete <- function(id, ...) {
|
||||
res <- .Call(c_rmodb_deleteUser, conn_ref, as.integer(id))
|
||||
return(res)
|
||||
}
|
||||
#' @export
|
||||
user <- function(id, withGroups = TRUE, ...) {
|
||||
checkmate::assert_int(id)
|
||||
checkmate::assert_logical(withGroups)
|
||||
@@ -38,6 +43,7 @@ user <- function(id, withGroups = TRUE, ...) {
|
||||
|
||||
return(res)
|
||||
}
|
||||
#' @export
|
||||
users <- function(withGroups = FALSE, withDeleted = FALSE, ...)
|
||||
{
|
||||
checkmate::assert_logical(withGroups)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
% Generated by roxygen2: do not edit by hand
|
||||
% Please edit documentation in R/Manage.R
|
||||
% Please edit documentation in R/Database.R
|
||||
\name{modb_conn_ref}
|
||||
\alias{modb_conn_ref}
|
||||
\title{MODB Connection References}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
% Generated by roxygen2: do not edit by hand
|
||||
% Please edit documentation in R/Manage.R
|
||||
% Please edit documentation in R/Database.R
|
||||
\name{modb_connect}
|
||||
\alias{modb_connect}
|
||||
\title{MODB Connections}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
% Generated by roxygen2: do not edit by hand
|
||||
% Please edit documentation in R/Manage.R
|
||||
% Please edit documentation in R/Database.R
|
||||
\name{modb_connectionInfo}
|
||||
\alias{modb_connectionInfo}
|
||||
\alias{modb_connectionExists}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
% Generated by roxygen2: do not edit by hand
|
||||
% Please edit documentation in R/Manage.R
|
||||
% Please edit documentation in R/Database.R
|
||||
\name{modb_disconnect}
|
||||
\alias{modb_disconnect}
|
||||
\title{MODB Connections}
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
PKG_CPPFLAGS=@cflags@
|
||||
PKG_CPPFLAGS=@cflags@ -DDEBUG -DSQL_DEBUG_MAX_LEN=2048
|
||||
PKG_LIBS=@libs@
|
||||
|
||||
all: clean
|
||||
|
||||
clean:
|
||||
rm -f $(SHLIB) $(OBJECTS)
|
||||
|
||||
#OBJECTS = $(patsubst %.c,%.o,$(wildcard *.c))
|
||||
OBJECTS = $(DB_OBJECTS) $(MODB_OBJECTS) $(R_OBJECTS) strext.o
|
||||
DB_OBJECTS = $(patsubst %.c,%.o,$(wildcard db_*.c))
|
||||
MODB_OBJECTS = $(patsubst %.c,%.o,$(wildcard modb_*.c))
|
||||
|
||||
@@ -236,3 +236,20 @@ SEXP rmodb_use(SEXP r_conn_ref, SEXP r_name, SEXP r_override)
|
||||
|
||||
return Rf_ScalarLogical(TRUE);
|
||||
}
|
||||
|
||||
|
||||
SEXP rmodb_getLastQuery(SEXP r_conn_ref)
|
||||
{
|
||||
stored_conn *sconn;
|
||||
SEXP r_res;
|
||||
|
||||
if ((sconn = getConnectionByRef(r_conn_ref)) == 0) {
|
||||
Rf_error("invalid connection reference\n");
|
||||
}
|
||||
|
||||
r_res = Rf_allocVector(STRSXP, 1);
|
||||
SET_STRING_ELT(r_res, 0, PROTECT(Rf_mkCharLen(sconn->last_qry, (int)sconn->last_qry_len)));
|
||||
|
||||
UNPROTECT(2);
|
||||
return r_res;
|
||||
}
|
||||
|
||||
@@ -24,4 +24,6 @@ SEXP rmodb_destroy(SEXP r_conn_ref, SEXP r_name);
|
||||
SEXP rmodb_use(SEXP r_conn_ref, SEXP r_name, SEXP r_override);
|
||||
|
||||
|
||||
SEXP rmodb_getLastQuery(SEXP r_conn_ref);
|
||||
|
||||
#endif // H__R_MODB_MANAGE__
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
|
||||
#include "modb_database.h"
|
||||
#include "modb_ref.h"
|
||||
#include "modb_users.h"
|
||||
#include "R_helpers_p.h"
|
||||
#include "R_list_item.h"
|
||||
#include "R_timestamp.h"
|
||||
@@ -12,6 +13,8 @@
|
||||
#include "R_memory-object.h"
|
||||
#include "R_magic.h"
|
||||
|
||||
#include "modb_p.h" // ARGH!
|
||||
|
||||
|
||||
|
||||
SEXP metadataToR(struct metadata_t *metadata)
|
||||
@@ -121,41 +124,68 @@ SEXP metadataExtToR(struct meta_ext_t *ext)
|
||||
struct meta_ext_value_t *ext_value;
|
||||
|
||||
|
||||
r_ext = PROTECT(Rf_allocVector(VECSXP, 1 + (int)ext->n_values));
|
||||
r_ext = PROTECT(Rf_allocVector(VECSXP, 0 + (int)ext->n_values));
|
||||
n_protect++;
|
||||
|
||||
r_attrib_names = PROTECT(Rf_allocVector(STRSXP, 1 + (int)ext->n_values));
|
||||
r_attrib_names = PROTECT(Rf_allocVector(STRSXP, 0 + (int)ext->n_values));
|
||||
n_protect++;
|
||||
|
||||
//printf("MAKING EXT\n");
|
||||
|
||||
for (idx = 0; idx < ext->n_values; idx++) {
|
||||
ext_value = *(ext->values + idx);
|
||||
//printf("%d, %s, %d, %p\n", ext_value->is_null, ext_value->key_c, ext_value->type, ext_value->value.raw);
|
||||
switch(ext_value->type) {
|
||||
case VTYPE_RAW:
|
||||
r_tmp = PROTECT(objectToR(ext_value->value.raw));
|
||||
r_tmp = PROTECT(objectToR(ext_value->value.raw));
|
||||
break;
|
||||
case VTYPE_BOOL:
|
||||
r_tmp = PROTECT(Rf_ScalarLogical(ext_value->value.bool));
|
||||
if (ext_value->is_null) {
|
||||
r_tmp = PROTECT(Rf_ScalarLogical(R_NaInt));
|
||||
} else {
|
||||
r_tmp = PROTECT(Rf_ScalarLogical(ext_value->value.boolVal));
|
||||
}
|
||||
break;
|
||||
case VTYPE_INT32:
|
||||
r_tmp = PROTECT(Rf_ScalarInteger(ext_value->value.int32));
|
||||
if (ext_value->is_null) {
|
||||
r_tmp = PROTECT(Rf_ScalarInteger(R_NaInt));
|
||||
} else {
|
||||
r_tmp = PROTECT(Rf_ScalarInteger(ext_value->value.int32));
|
||||
}
|
||||
break;
|
||||
case VTYPE_DOUBLE:
|
||||
r_tmp = PROTECT(Rf_ScalarReal(ext_value->value.dbl));
|
||||
if (ext_value->is_null) {
|
||||
r_tmp = PROTECT(Rf_ScalarReal(R_NaReal));
|
||||
} else {
|
||||
r_tmp = PROTECT(Rf_ScalarReal(ext_value->value.dbl));
|
||||
}
|
||||
break;
|
||||
case VTYPE_STRING:
|
||||
r_tmp = PROTECT(Rf_allocVector(STRSXP, 1));
|
||||
n_protect++;
|
||||
SET_STRING_ELT(r_tmp, 0, PROTECT(Rf_mkChar(ext_value->value.str)));
|
||||
if (ext_value->is_null) {
|
||||
SET_STRING_ELT(r_tmp, 0, PROTECT(R_NaString));
|
||||
} else {
|
||||
SET_STRING_ELT(r_tmp, 0, PROTECT(Rf_mkChar(ext_value->value.str)));
|
||||
}
|
||||
break;
|
||||
case VTYPE_TIMESTAMP:
|
||||
r_tmp = PROTECT(R_Timestamp(ext_value->value.ts));
|
||||
if (ext_value->is_null) {
|
||||
r_tmp = PROTECT(Rf_ScalarReal(R_NaReal));
|
||||
} else {
|
||||
r_tmp = PROTECT(R_Timestamp(ext_value->value.ts));
|
||||
}
|
||||
break;
|
||||
case VTYPE_ID:
|
||||
r_tmp = PROTECT(Rf_ScalarInteger((int)ext_value->value.id));
|
||||
if (ext_value->is_null) {
|
||||
r_tmp = PROTECT(Rf_ScalarInteger(R_NaInt));
|
||||
} else {
|
||||
r_tmp = PROTECT(Rf_ScalarInteger((int)ext_value->value.id));
|
||||
}
|
||||
break;
|
||||
}
|
||||
SET_VECTOR_ELT(r_ext, 1 + (int)idx, r_tmp);
|
||||
SET_STRING_ELT(r_attrib_names, 1 + (int)idx, PROTECT(Rf_mkChar(ext_value->key_c)));
|
||||
SET_VECTOR_ELT(r_ext, 0 + (int)idx, r_tmp);
|
||||
SET_STRING_ELT(r_attrib_names, 0 + (int)idx, PROTECT(Rf_mkChar(ext_value->key_c)));
|
||||
n_protect += 2;
|
||||
}
|
||||
|
||||
@@ -165,9 +195,367 @@ SEXP metadataExtToR(struct meta_ext_t *ext)
|
||||
return r_ext;
|
||||
}
|
||||
|
||||
SEXP rmodb_metaobjectId(SEXP r_conn_ref, SEXP r_query)
|
||||
SEXP rmodb_metaobjectQuery(SEXP r_conn_ref, SEXP r_query, SEXP r_with_deleted,
|
||||
SEXP r_owner_restrict)
|
||||
{
|
||||
return R_NilValue;
|
||||
stored_conn *sconn;
|
||||
modb_ref modb;
|
||||
SEXP r_query_names;
|
||||
SEXP r_tmp;
|
||||
SEXP r_metadatas;
|
||||
int i;
|
||||
const char *col;
|
||||
const char *tmp_str;
|
||||
where_builder *wb = 0, *wb_in = 0;
|
||||
struct user_t user;
|
||||
struct metadata_t *metadata;
|
||||
struct metadata_t **metadata_list;
|
||||
size_t n_metadatas;
|
||||
size_t idx, n_ids, m_idx;
|
||||
unsigned int *ids;
|
||||
char *table;
|
||||
size_t table_len;
|
||||
|
||||
if ((sconn = getConnectionByRef(r_conn_ref)) == 0) {
|
||||
Rf_error("invalid connection reference\n");
|
||||
}
|
||||
|
||||
if (!modbFindUse(sconn, &modb)) {
|
||||
Rf_error("invalid modb reference\n");
|
||||
}
|
||||
|
||||
bzero(&user, sizeof(struct user_t));
|
||||
user.id = (unsigned int)Rf_asInteger(r_owner_restrict);
|
||||
if (user.id > 0) {
|
||||
wb = where(0, "owner_id", EQ, TYPE_ID, 1, user.id);
|
||||
|
||||
if (!modbFetchUserGroupIds(sconn, &modb, &user)) {
|
||||
Rf_error("invalid user id\n");
|
||||
}
|
||||
if (user.n_groups > 0) {
|
||||
for (idx = 0; idx < user.n_groups; idx++) {
|
||||
if (modbFetchGroupMetadataIds(sconn, &modb, *(user.group_ids + idx), &ids, &n_ids) < 0) {
|
||||
free(user.groups);
|
||||
return R_NilValue;
|
||||
}
|
||||
for (m_idx = 0; m_idx < n_ids; m_idx++) {
|
||||
if (wb_in == 0) {
|
||||
modbTableName(&table, &table_len, &modb, METADATA_TABLE, STR_LEN(METADATA_TABLE));
|
||||
wb_in = whereIn(0, table, "mdo_id", TYPE_ID, 0);
|
||||
modbFreeTableName(&table);
|
||||
}
|
||||
setWhereValue(wb_in, TYPE_ID, 1, *(ids + m_idx));
|
||||
}
|
||||
free(ids);
|
||||
}
|
||||
free(user.groups);
|
||||
|
||||
if (wb_in != 0) {
|
||||
wb = createWhereBuilder(wb);
|
||||
wb = whereAnd(0, whereOr(wb, wb_in));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (Rf_asLogical(r_with_deleted) == 0) {
|
||||
wb = whereAnd(wb, where(0, "deleted", IS_NULL, TYPE_RAW, 0));
|
||||
}
|
||||
r_query_names = Rf_getAttrib(r_query, R_NamesSymbol);
|
||||
for (i = 0; i < LENGTH(r_query); i++) {
|
||||
col = Rf_translateCharUTF8(STRING_ELT(r_query_names, i));
|
||||
r_tmp = VECTOR_ELT(r_query, i);
|
||||
if (Rf_isNull(r_tmp)) {
|
||||
wb = whereAnd(wb, where(0, col, IS_NULL, TYPE_RAW, 0));
|
||||
} else {
|
||||
switch(TYPEOF(r_tmp)) {
|
||||
case LGLSXP:/* logical vectors */
|
||||
wb = whereAnd(wb, where(0, col, EQ, TYPE_BOOL, 1, Rf_asLogical(r_tmp)));
|
||||
break;
|
||||
case INTSXP:/* integer vectors */
|
||||
wb = whereAnd(wb, where(0, col, EQ, TYPE_INT32, 1, Rf_asInteger(r_tmp)));
|
||||
break;
|
||||
case REALSXP:/* real variables */
|
||||
wb = whereAnd(wb, where(0, col, EQ, TYPE_DOUBLE, 1, Rf_asReal(r_tmp)));
|
||||
break;
|
||||
case STRSXP:/* string vectors */
|
||||
r_tmp = STRING_ELT(r_tmp, 0);
|
||||
if (r_tmp == R_NaString) {
|
||||
wb = whereAnd(wb, where(0, col, IS_NULL, TYPE_RAW, 0));
|
||||
} else {
|
||||
tmp_str = Rf_translateCharUTF8(r_tmp);
|
||||
wb = whereAnd(wb, where(0, col, EQ, TYPE_STRING, 2, tmp_str, strlen(tmp_str)));
|
||||
}
|
||||
break;
|
||||
case VECSXP:/* generic vectors */
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
// Screwed if I know how to handle this...
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (modbMetadataQuery(sconn, &modb, wb, &metadata_list, &n_metadatas) <= 0) {
|
||||
freeWhereBuilder(&wb);
|
||||
return R_NilValue;
|
||||
}
|
||||
freeWhereBuilder(&wb);
|
||||
|
||||
r_metadatas = PROTECT(Rf_allocVector(VECSXP, (int)n_metadatas));
|
||||
for (idx = 0; idx < n_metadatas; idx++) {
|
||||
metadata = *(metadata_list + idx);
|
||||
|
||||
if (modbFetchMetadataOwner(sconn, &modb, metadata) < 0) {
|
||||
freeMetadata(&metadata);
|
||||
UNPROTECT(1 + (int)idx);
|
||||
return R_NilValue;
|
||||
}
|
||||
if (modbFetchMetadataGroups(sconn, &modb, metadata, 0) < 0) {
|
||||
freeMetadataList(&metadata_list, n_metadatas);
|
||||
UNPROTECT(1 + (int)idx);
|
||||
return R_NilValue;
|
||||
}
|
||||
// if (modbFetchMetadataExtended(sconn, &modb, metadata) < 0) {
|
||||
// freeMetadataList(&metadata_list, n_metadatas);
|
||||
// UNPROTECT(1 + (int)idx);
|
||||
// return R_NilValue;
|
||||
// }
|
||||
if (modbFetchMetadataObject(sconn, &modb, metadata) < 0) {
|
||||
freeMetadataList(&metadata_list, n_metadatas);
|
||||
UNPROTECT(1 + (int)idx);
|
||||
return R_NilValue;
|
||||
}
|
||||
|
||||
SET_VECTOR_ELT(r_metadatas, (int)idx, PROTECT(metadataToR(metadata)));
|
||||
}
|
||||
freeMetadataList(&metadata_list, n_metadatas);
|
||||
|
||||
UNPROTECT((int)(1 + n_metadatas));
|
||||
return r_metadatas;
|
||||
}
|
||||
|
||||
SEXP rmodb_metadataQuery(SEXP r_conn_ref, SEXP r_query, SEXP r_with_deleted, SEXP r_owner_restrict)
|
||||
{
|
||||
stored_conn *sconn;
|
||||
modb_ref modb;
|
||||
SEXP r_query_names;
|
||||
SEXP r_tmp;
|
||||
SEXP r_metadatas;
|
||||
int i;
|
||||
const char *col;
|
||||
const char *tmp_str;
|
||||
where_builder *wb = 0, *wb_in = 0;
|
||||
struct user_t user;
|
||||
struct metadata_t *metadata;
|
||||
struct metadata_t **metadata_list;
|
||||
size_t n_metadatas;
|
||||
size_t idx, n_ids, m_idx;
|
||||
unsigned int *ids;
|
||||
char *table;
|
||||
size_t table_len;
|
||||
|
||||
if ((sconn = getConnectionByRef(r_conn_ref)) == 0) {
|
||||
Rf_error("invalid connection reference\n");
|
||||
}
|
||||
|
||||
if (!modbFindUse(sconn, &modb)) {
|
||||
Rf_error("invalid modb reference\n");
|
||||
}
|
||||
|
||||
bzero(&user, sizeof(struct user_t));
|
||||
user.id = (unsigned int)Rf_asInteger(r_owner_restrict);
|
||||
if (user.id > 0) {
|
||||
wb = where(0, "owner_id", EQ, TYPE_ID, 1, user.id);
|
||||
|
||||
if (!modbFetchUserGroupIds(sconn, &modb, &user)) {
|
||||
Rf_error("invalid user id\n");
|
||||
}
|
||||
if (user.n_groups > 0) {
|
||||
for (idx = 0; idx < user.n_groups; idx++) {
|
||||
if (modbFetchGroupMetadataIds(sconn, &modb, *(user.group_ids + idx), &ids, &n_ids) < 0) {
|
||||
free(user.groups);
|
||||
return R_NilValue;
|
||||
}
|
||||
for (m_idx = 0; m_idx < n_ids; m_idx++) {
|
||||
if (wb_in == 0) {
|
||||
modbTableName(&table, &table_len, &modb, METADATA_TABLE, STR_LEN(METADATA_TABLE));
|
||||
wb_in = whereIn(0, table, "mdo_id", TYPE_ID, 0);
|
||||
modbFreeTableName(&table);
|
||||
}
|
||||
setWhereValue(wb_in, TYPE_ID, 1, *(ids + m_idx));
|
||||
}
|
||||
free(ids);
|
||||
}
|
||||
free(user.groups);
|
||||
|
||||
if (wb_in != 0) {
|
||||
wb = whereAnd(0, whereOr(wb, wb_in));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (Rf_asLogical(r_with_deleted) == 0) {
|
||||
wb = whereAnd(wb, where(0, "deleted", IS_NULL, TYPE_RAW, 0));
|
||||
}
|
||||
|
||||
r_query_names = Rf_getAttrib(r_query, R_NamesSymbol);
|
||||
for (i = 0; i < LENGTH(r_query); i++) {
|
||||
col = Rf_translateCharUTF8(STRING_ELT(r_query_names, i));
|
||||
r_tmp = VECTOR_ELT(r_query, i);
|
||||
if (Rf_isNull(r_tmp)) {
|
||||
wb = whereAnd(wb, where(0, col, IS_NULL, TYPE_RAW, 0));
|
||||
} else {
|
||||
switch(TYPEOF(r_tmp)) {
|
||||
case LGLSXP:/* logical vectors */
|
||||
wb = whereAnd(wb, where(0, col, EQ, TYPE_BOOL, 1, Rf_asLogical(r_tmp)));
|
||||
break;
|
||||
case INTSXP:/* integer vectors */
|
||||
wb = whereAnd(wb, where(0, col, EQ, TYPE_INT32, 1, Rf_asInteger(r_tmp)));
|
||||
break;
|
||||
case REALSXP:/* real variables */
|
||||
wb = whereAnd(wb, where(0, col, EQ, TYPE_DOUBLE, 1, Rf_asReal(r_tmp)));
|
||||
break;
|
||||
case STRSXP:/* string vectors */
|
||||
r_tmp = STRING_ELT(r_tmp, 0);
|
||||
if (r_tmp == R_NaString) {
|
||||
wb = whereAnd(wb, where(0, col, IS_NULL, TYPE_RAW, 0));
|
||||
} else {
|
||||
tmp_str = Rf_translateCharUTF8(r_tmp);
|
||||
wb = whereAnd(wb, where(0, col, EQ, TYPE_STRING, 2, tmp_str, strlen(tmp_str)));
|
||||
}
|
||||
break;
|
||||
case VECSXP:/* generic vectors */
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
// Screwed if I know how to handle this...
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (modbMetadataQuery(sconn, &modb, wb, &metadata_list, &n_metadatas) <= 0) {
|
||||
freeWhereBuilder(&wb);
|
||||
return R_NilValue;
|
||||
}
|
||||
freeWhereBuilder(&wb);
|
||||
|
||||
r_metadatas = PROTECT(Rf_allocVector(VECSXP, (int)n_metadatas));
|
||||
for (idx = 0; idx < n_metadatas; idx++) {
|
||||
metadata = *(metadata_list + idx);
|
||||
|
||||
if (modbFetchMetadataOwner(sconn, &modb, metadata) < 0) {
|
||||
freeMetadata(&metadata);
|
||||
UNPROTECT(1 + (int)idx);
|
||||
return R_NilValue;
|
||||
}
|
||||
if (modbFetchMetadataGroups(sconn, &modb, metadata, 0) < 0) {
|
||||
freeMetadataList(&metadata_list, n_metadatas);
|
||||
UNPROTECT(1 + (int)idx);
|
||||
return R_NilValue;
|
||||
}
|
||||
// if (modbFetchMetadataExtended(sconn, &modb, metadata) < 0) {
|
||||
// freeMetadataList(&metadata_list, n_metadatas);
|
||||
// UNPROTECT(1 + (int)idx);
|
||||
// return R_NilValue;
|
||||
// }
|
||||
|
||||
SET_VECTOR_ELT(r_metadatas, (int)idx, PROTECT(metadataToR(metadata)));
|
||||
}
|
||||
freeMetadataList(&metadata_list, n_metadatas);
|
||||
|
||||
UNPROTECT((int)(1 + n_metadatas));
|
||||
return r_metadatas;
|
||||
}
|
||||
|
||||
SEXP rmodb_metaobjectIds(SEXP r_conn_ref, SEXP r_query, SEXP r_with_deleted)
|
||||
{
|
||||
stored_conn *sconn;
|
||||
modb_ref modb;
|
||||
SEXP r_query_names;
|
||||
SEXP r_tmp;
|
||||
SEXP r_ids;
|
||||
int i;
|
||||
const char *col;
|
||||
const char *tmp_str;
|
||||
where_builder *wb = 0;
|
||||
struct metadata_t *metadata;
|
||||
struct metadata_t **metadata_list;
|
||||
size_t n_metadatas;
|
||||
size_t idx;
|
||||
|
||||
if ((sconn = getConnectionByRef(r_conn_ref)) == 0) {
|
||||
Rf_error("invalid connection reference\n");
|
||||
}
|
||||
|
||||
if (!modbFindUse(sconn, &modb)) {
|
||||
Rf_error("invalid modb reference\n");
|
||||
}
|
||||
|
||||
if (Rf_asLogical(r_with_deleted) == 0) {
|
||||
wb = where(0, "deleted", IS_NULL, TYPE_RAW, 0);
|
||||
}
|
||||
r_query_names = Rf_getAttrib(r_query, R_NamesSymbol);
|
||||
for (i = 0; i < LENGTH(r_query); i++) {
|
||||
col = Rf_translateCharUTF8(STRING_ELT(r_query_names, i));
|
||||
r_tmp = VECTOR_ELT(r_query, i);
|
||||
if (Rf_isNull(r_tmp)) {
|
||||
wb = whereAnd(wb, where(0, col, IS_NULL, TYPE_RAW, 0));
|
||||
} else {
|
||||
switch(TYPEOF(r_tmp)) {
|
||||
case LGLSXP:/* logical vectors */
|
||||
if (R_IsNA(Rf_asLogical(r_tmp))) {
|
||||
wb = whereAnd(wb, where(0, col, IS_NULL, TYPE_RAW, 0));
|
||||
} else {
|
||||
wb = whereAnd(wb, where(0, col, EQ, TYPE_BOOL, 1, Rf_asLogical(r_tmp)));
|
||||
}
|
||||
break;
|
||||
case INTSXP:/* integer vectors */
|
||||
if (R_IsNA(Rf_asInteger(r_tmp))) {
|
||||
wb = whereAnd(wb, where(0, col, IS_NULL, TYPE_RAW, 0));
|
||||
} else {
|
||||
wb = whereAnd(wb, where(0, col, EQ, TYPE_INT32, 1, Rf_asInteger(r_tmp)));
|
||||
}
|
||||
break;
|
||||
case REALSXP:/* real variables */
|
||||
if (R_IsNA(Rf_asReal(r_tmp))) {
|
||||
wb = whereAnd(wb, where(0, col, IS_NULL, TYPE_RAW, 0));
|
||||
} else {
|
||||
wb = whereAnd(wb, where(0, col, EQ, TYPE_DOUBLE, 1, Rf_asReal(r_tmp)));
|
||||
}
|
||||
break;
|
||||
case STRSXP:/* string vectors */
|
||||
r_tmp = STRING_ELT(r_tmp, 0);
|
||||
if (r_tmp == R_NaString) {
|
||||
wb = whereAnd(wb, where(0, col, IS_NULL, TYPE_RAW, 0));
|
||||
} else {
|
||||
tmp_str = Rf_translateCharUTF8(r_tmp);
|
||||
wb = whereAnd(wb, where(0, col, EQ, TYPE_STRING, 2, tmp_str, strlen(tmp_str)));
|
||||
}
|
||||
break;
|
||||
case VECSXP:/* generic vectors */
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
// Screwed if I know how to handle this...
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (modbMetadataQuery(sconn, &modb, wb, &metadata_list, &n_metadatas) <= 0) {
|
||||
freeWhereBuilder(&wb);
|
||||
return R_NilValue;
|
||||
}
|
||||
freeWhereBuilder(&wb);
|
||||
|
||||
r_ids = PROTECT(Rf_allocVector(INTSXP, (int)n_metadatas));
|
||||
for (idx = 0; idx < n_metadatas; idx++) {
|
||||
metadata = *(metadata_list + idx);
|
||||
SET_INTEGER_ELT(r_ids, (int)idx, (int)metadata->id);
|
||||
}
|
||||
freeMetadataList(&metadata_list, n_metadatas);
|
||||
|
||||
UNPROTECT(1);
|
||||
return r_ids;
|
||||
}
|
||||
|
||||
SEXP rmodb_metaobject(SEXP r_conn_ref, SEXP r_id)
|
||||
@@ -195,15 +583,15 @@ SEXP rmodb_metaobject(SEXP r_conn_ref, SEXP r_id)
|
||||
freeMetadata(&metadata);
|
||||
return R_NilValue;
|
||||
}
|
||||
if (modbFetchMetadataGroups(sconn, &modb, metadata, 0) <= 0) {
|
||||
if (modbFetchMetadataGroups(sconn, &modb, metadata, 0) < 0) {
|
||||
freeMetadata(&metadata);
|
||||
return R_NilValue;
|
||||
}
|
||||
if (modbFetchMetadataExtended(sconn, &modb, metadata) <= 0) {
|
||||
if (modbFetchMetadataExtended(sconn, &modb, metadata) < 0) {
|
||||
freeMetadata(&metadata);
|
||||
return R_NilValue;
|
||||
}
|
||||
if (modbFetchMetadataObject(sconn, &modb, metadata) <= 0) {
|
||||
if (modbFetchMetadataObject(sconn, &modb, metadata) < 0) {
|
||||
freeMetadata(&metadata);
|
||||
return R_NilValue;
|
||||
}
|
||||
@@ -234,15 +622,15 @@ SEXP rmodb_metadata(SEXP r_conn_ref, SEXP r_id)
|
||||
if (modbMetadataById(sconn, &modb, mo_id, &metadata) <= 0) {
|
||||
return R_NilValue;
|
||||
}
|
||||
if (modbFetchMetadataOwner(sconn, &modb, metadata) <= 0) {
|
||||
if (modbFetchMetadataOwner(sconn, &modb, metadata) < 0) {
|
||||
freeMetadata(&metadata);
|
||||
return R_NilValue;
|
||||
}
|
||||
if (modbFetchMetadataGroups(sconn, &modb, metadata, 0) <= 0) {
|
||||
if (modbFetchMetadataGroups(sconn, &modb, metadata, 0) < 0) {
|
||||
freeMetadata(&metadata);
|
||||
return R_NilValue;
|
||||
}
|
||||
if (modbFetchMetadataExtended(sconn, &modb, metadata) <= 0) {
|
||||
if (modbFetchMetadataExtended(sconn, &modb, metadata) < 0) {
|
||||
freeMetadata(&metadata);
|
||||
return R_NilValue;
|
||||
}
|
||||
@@ -320,11 +708,11 @@ SEXP rmodb_metaobjects(SEXP r_conn_ref, SEXP r_with_deleted)
|
||||
UNPROTECT(1 + (int)idx);
|
||||
return R_NilValue;
|
||||
}
|
||||
if (modbFetchMetadataExtended(sconn, &modb, metadata) < 0) {
|
||||
freeMetadataList(&metadata_list, n_metadatas);
|
||||
UNPROTECT(1 + (int)idx);
|
||||
return R_NilValue;
|
||||
}
|
||||
// if (modbFetchMetadataExtended(sconn, &modb, metadata) < 0) {
|
||||
// freeMetadataList(&metadata_list, n_metadatas);
|
||||
// UNPROTECT(1 + (int)idx);
|
||||
// return R_NilValue;
|
||||
// }
|
||||
if (modbFetchMetadataObject(sconn, &modb, metadata) < 0) {
|
||||
freeMetadataList(&metadata_list, n_metadatas);
|
||||
UNPROTECT(1 + (int)idx);
|
||||
@@ -375,11 +763,11 @@ SEXP rmodb_metadatas(SEXP r_conn_ref, SEXP r_with_deleted)
|
||||
UNPROTECT(1 + (int)idx);
|
||||
return R_NilValue;
|
||||
}
|
||||
if (modbFetchMetadataExtended(sconn, &modb, metadata) < 0) {
|
||||
freeMetadataList(&metadata_list, n_metadatas);
|
||||
UNPROTECT(1 + (int)idx);
|
||||
return R_NilValue;
|
||||
}
|
||||
// if (modbFetchMetadataExtended(sconn, &modb, metadata) < 0) {
|
||||
// freeMetadataList(&metadata_list, n_metadatas);
|
||||
// UNPROTECT(1 + (int)idx);
|
||||
// return R_NilValue;
|
||||
// }
|
||||
|
||||
SET_VECTOR_ELT(r_metadatas, (int)idx, PROTECT(metadataToR(metadata)));
|
||||
}
|
||||
@@ -485,20 +873,34 @@ SEXP rmodb_createMetaobject(SEXP r_conn_ref, SEXP r_id,
|
||||
switch(TYPEOF(r_tmp)) {
|
||||
case LGLSXP:/* logical vectors */
|
||||
ext_value->type = VTYPE_BOOL;
|
||||
ext_value->value.bool = Rf_asLogical(r_tmp);
|
||||
ext_value->value.boolVal = Rf_asLogical(r_tmp);
|
||||
if (R_IsNA(Rf_asReal(r_tmp))) {
|
||||
ext_value->is_null = 1;
|
||||
}
|
||||
break;
|
||||
case INTSXP:/* integer vectors */
|
||||
ext_value->type = VTYPE_INT32;
|
||||
ext_value->value.int32 = Rf_asInteger(r_tmp);
|
||||
if (R_IsNA(Rf_asReal(r_tmp))) {
|
||||
ext_value->is_null = 1;
|
||||
}
|
||||
break;
|
||||
case REALSXP:/* real variables */
|
||||
ext_value->type = VTYPE_DOUBLE;
|
||||
ext_value->value.dbl = Rf_asReal(r_tmp);
|
||||
if (R_IsNA(Rf_asReal(r_tmp))) {
|
||||
ext_value->is_null = 1;
|
||||
}
|
||||
break;
|
||||
case STRSXP:/* string vectors */
|
||||
ext_value->type = VTYPE_STRING;
|
||||
ext_value->value.str_c = Rf_translateCharUTF8(STRING_ELT(r_tmp, 0));
|
||||
ext_value->is_const = 1;
|
||||
r_tmp = STRING_ELT(r_tmp, 0);
|
||||
if (r_tmp == R_NaString) {
|
||||
ext_value->is_null = 1;
|
||||
} else {
|
||||
ext_value->value.str_c = Rf_translateCharUTF8(r_tmp);
|
||||
ext_value->is_const = 1;
|
||||
}
|
||||
break;
|
||||
case VECSXP:/* generic vectors */
|
||||
break;
|
||||
@@ -519,9 +921,164 @@ SEXP rmodb_createMetaobject(SEXP r_conn_ref, SEXP r_id,
|
||||
|
||||
return Rf_ScalarReal((double)metadata.id);
|
||||
}
|
||||
SEXP rmodb_updateMetaobject(SEXP r_conn_ref, SEXP r_id, SEXP r_metaobject)
|
||||
SEXP rmodb_updateMetaobject(SEXP r_conn_ref, SEXP r_id,
|
||||
SEXP r_metadata, SEXP r_object, SEXP r_extendedMeta)
|
||||
{
|
||||
return R_NilValue;
|
||||
stored_conn *sconn;
|
||||
modb_ref modb;
|
||||
struct metadata_t metadata;
|
||||
struct object_t object;
|
||||
struct meta_ext_t *metadata_ext;
|
||||
struct meta_ext_value_t *ext_value;
|
||||
struct r_memoryobject_t *memObj;
|
||||
SEXP r_tmp, r_names;
|
||||
int i;
|
||||
|
||||
if ((sconn = getConnectionByRef(r_conn_ref)) == 0) {
|
||||
Rf_error("invalid connection reference\n");
|
||||
}
|
||||
|
||||
if (!modbFindUse(sconn, &modb)) {
|
||||
Rf_error("invalid modb reference\n");
|
||||
}
|
||||
|
||||
memset(&metadata, 0, sizeof(struct metadata_t));
|
||||
metadata.id = (unsigned int)Rf_asInteger(r_id);
|
||||
|
||||
if (!Rf_isNull(r_metadata) && TYPEOF(r_metadata) == VECSXP && LENGTH(r_metadata) == 1 && Rf_isNull(VECTOR_ELT(r_metadata, 0))) {
|
||||
// Nothing to do here
|
||||
} else {
|
||||
r_tmp = R_listItem(r_metadata, "title");
|
||||
if (r_tmp != R_NilValue) {
|
||||
metadata.title_c = Rf_translateCharUTF8(STRING_ELT(r_tmp, 0));
|
||||
}
|
||||
|
||||
r_tmp = R_listItem(r_metadata, "owner_id");
|
||||
if (r_tmp != R_NilValue) {
|
||||
metadata.owner_id = (unsigned int)Rf_asInteger(r_tmp);
|
||||
}
|
||||
|
||||
r_tmp = R_listItem(r_metadata, "created_on");
|
||||
if (r_tmp != R_NilValue) {
|
||||
metadata.created_on = R_TimestampUnix(r_tmp);
|
||||
}
|
||||
r_tmp = R_listItem(r_metadata, "updated_on");
|
||||
if (r_tmp != R_NilValue) {
|
||||
metadata.updated_on = R_TimestampUnix(r_tmp);
|
||||
}
|
||||
r_tmp = R_listItem(r_metadata, "deleted_on");
|
||||
if (r_tmp != R_NilValue) {
|
||||
metadata.deleted_on = R_TimestampUnix(r_tmp);
|
||||
}
|
||||
|
||||
if (!modbMetadataReplace(sconn, &modb, metadata.id, &metadata)) {
|
||||
return Rf_ScalarLogical(FALSE);
|
||||
}
|
||||
|
||||
r_tmp = R_listItem(r_metadata, "group_ids");
|
||||
if (r_tmp != R_NilValue) {
|
||||
if (LENGTH(r_tmp) == 1 && TYPEOF(r_tmp) != VECSXP) {
|
||||
if (modbLink_Metadata_Group(
|
||||
sconn, &modb, metadata.id,
|
||||
(unsigned int)Rf_asInteger(r_tmp)) <= 0) {
|
||||
return Rf_ScalarLogical(FALSE);
|
||||
}
|
||||
} else {
|
||||
for (i = 0; i < LENGTH(r_tmp); i++) {
|
||||
if (modbLink_Metadata_Group(
|
||||
sconn, &modb, metadata.id,
|
||||
(unsigned int)Rf_asInteger(VECTOR_ELT(r_tmp, i))) <= 0) {
|
||||
return Rf_ScalarLogical(FALSE);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!Rf_isNull(r_object) && TYPEOF(r_object) == VECSXP && LENGTH(r_object) == 1 && Rf_isNull(VECTOR_ELT(r_object, 0))) {
|
||||
} else {
|
||||
memObj = robjectToMemory(r_object, R_MAGIC_XDR_V3);
|
||||
object.id = metadata.id;
|
||||
object.data_c = memObj->buf;
|
||||
object.data_len = memObj->buf_size;
|
||||
if (modbObjectUpdate(sconn, &modb, metadata.id, &object) <= 0) {
|
||||
free(memObj->buf);
|
||||
free(memObj);
|
||||
return Rf_ScalarLogical(FALSE);
|
||||
}
|
||||
free(memObj->buf);
|
||||
free(memObj);
|
||||
}
|
||||
|
||||
if (!Rf_isNull(r_extendedMeta) && TYPEOF(r_extendedMeta) == VECSXP && LENGTH(r_extendedMeta) == 1 && Rf_isNull(VECTOR_ELT(r_extendedMeta, 0))) {
|
||||
|
||||
} else {
|
||||
if ((metadata_ext = allocMetaExt()) == 0) {
|
||||
return Rf_ScalarLogical(FALSE);
|
||||
}
|
||||
metadata_ext->id = metadata.id;
|
||||
metadata_ext->n_values = (size_t)LENGTH(r_extendedMeta);
|
||||
metadata_ext->values = allocMetaExtValues(metadata_ext->n_values, 1);
|
||||
if (metadata_ext->values == 0) {
|
||||
freeMetaExt(&metadata_ext);
|
||||
return Rf_ScalarLogical(FALSE);
|
||||
}
|
||||
r_names = Rf_getAttrib(r_extendedMeta, R_NamesSymbol);
|
||||
for (i = 0; i < LENGTH(r_extendedMeta); i++) {
|
||||
ext_value = *(metadata_ext->values + i);
|
||||
ext_value->key_c = Rf_translateCharUTF8(STRING_ELT(r_names, i));
|
||||
r_tmp = VECTOR_ELT(r_extendedMeta, i);
|
||||
if (Rf_isNull(r_tmp)) {
|
||||
ext_value->type = VTYPE_RAW;
|
||||
ext_value->is_null = 1;
|
||||
} else {
|
||||
switch(TYPEOF(r_tmp)) {
|
||||
case LGLSXP:/* logical vectors */
|
||||
ext_value->type = VTYPE_BOOL;
|
||||
ext_value->value.boolVal = Rf_asLogical(r_tmp);
|
||||
if (R_IsNA(Rf_asReal(r_tmp))) {
|
||||
ext_value->is_null = 1;
|
||||
}
|
||||
break;
|
||||
case INTSXP:/* integer vectors */
|
||||
ext_value->type = VTYPE_INT32;
|
||||
ext_value->value.int32 = Rf_asInteger(r_tmp);
|
||||
if (R_IsNA(Rf_asReal(r_tmp))) {
|
||||
ext_value->is_null = 1;
|
||||
}
|
||||
break;
|
||||
case REALSXP:/* real variables */
|
||||
ext_value->type = VTYPE_DOUBLE;
|
||||
ext_value->value.dbl = Rf_asReal(r_tmp);
|
||||
if (R_IsNA(Rf_asReal(r_tmp))) {
|
||||
ext_value->is_null = 1;
|
||||
}
|
||||
break;
|
||||
case STRSXP:/* string vectors */
|
||||
ext_value->type = VTYPE_STRING;
|
||||
r_tmp = STRING_ELT(r_tmp, 0);
|
||||
if (r_tmp == R_NaString) {
|
||||
ext_value->is_null = 1;
|
||||
} else {
|
||||
ext_value->value.str_c = Rf_translateCharUTF8(r_tmp);
|
||||
ext_value->is_const = 1;
|
||||
}
|
||||
break;
|
||||
case VECSXP:/* generic vectors */
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
// Screwed if I know how to handle this...
|
||||
}
|
||||
}
|
||||
}
|
||||
if (modbMetaExtReplace(sconn, &modb, metadata.id, metadata_ext) <= 0) {
|
||||
freeMetaExt(&metadata_ext);
|
||||
return Rf_ScalarLogical(FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
return Rf_ScalarLogical(TRUE);
|
||||
}
|
||||
SEXP rmodb_deleteMetaobject(SEXP r_conn_ref, SEXP r_id)
|
||||
{
|
||||
|
||||
@@ -10,7 +10,10 @@ SEXP metadataToR(struct metadata_t *metadata);
|
||||
SEXP objectToR(struct object_t *object);
|
||||
SEXP metadataExtToR(struct meta_ext_t *ext);
|
||||
|
||||
SEXP rmodb_metaobjectId(SEXP r_conn_ref, SEXP r_query);
|
||||
SEXP rmodb_metaobjectIds(SEXP r_conn_ref, SEXP r_query, SEXP with_deleted);
|
||||
SEXP rmodb_metaobjectQuery(SEXP r_conn_ref, SEXP r_query, SEXP r_with_deleted,
|
||||
SEXP r_owner_restrict);
|
||||
SEXP rmodb_metadataQuery(SEXP r_conn_ref, SEXP r_query, SEXP r_with_deleted, SEXP r_owner_restrict);
|
||||
|
||||
SEXP rmodb_metaobject(SEXP r_conn_ref, SEXP r_id);
|
||||
SEXP rmodb_metadata(SEXP r_conn_ref, SEXP r_id);
|
||||
@@ -21,7 +24,8 @@ SEXP rmodb_metadatas(SEXP r_conn_ref, SEXP r_with_deleted);
|
||||
|
||||
SEXP rmodb_createMetaobject(SEXP r_conn_ref, SEXP r_id,
|
||||
SEXP r_metadata, SEXP r_object, SEXP r_extendedMeta);
|
||||
SEXP rmodb_updateMetaobject(SEXP r_conn_ref, SEXP r_id, SEXP r_metaobject);
|
||||
SEXP rmodb_updateMetaobject(SEXP r_conn_ref, SEXP r_id,
|
||||
SEXP r_metadata, SEXP r_object, SEXP r_extendedMeta);
|
||||
SEXP rmodb_deleteMetaobject(SEXP r_conn_ref, SEXP r_id);
|
||||
|
||||
|
||||
|
||||
@@ -89,7 +89,11 @@ SEXP R_TimestampExt(int64_t ts)
|
||||
|
||||
int64_t R_TimestampUnix(SEXP r_ts)
|
||||
{
|
||||
return (int64_t)(Rf_asReal(VECTOR_ELT(r_ts, 0)) / 1);
|
||||
if (TYPEOF(r_ts) == REALSXP) {
|
||||
return (int64_t)(Rf_asReal(r_ts) / 1);
|
||||
} else {
|
||||
return (int64_t)(Rf_asReal(VECTOR_ELT(r_ts, 0)) / 1);
|
||||
}
|
||||
}
|
||||
|
||||
int64_t R_TimestampExtUnix(SEXP r_ts)
|
||||
|
||||
@@ -323,7 +323,7 @@ int64_t updateQuery(struct stored_conn_t *sconn,
|
||||
|
||||
strbld_str(sb, "UPDATE ", 7);
|
||||
escapeTableName_sb(sb, table, table_len);
|
||||
strbld_str(sb, " SET ", 4);
|
||||
strbld_str(sb, " SET ", 5);
|
||||
strbld_str(sb, set, set_len);
|
||||
compileWhereBuilder_sb(sb, wb, 1);
|
||||
|
||||
|
||||
@@ -19,13 +19,13 @@ int setTimeout(struct stored_conn_t *sconn, unsigned int timeout)
|
||||
{
|
||||
sconn->timeout = timeout;
|
||||
|
||||
if (mysql_optionsv(SQCONN(sconn), MYSQL_OPT_CONNECT_TIMEOUT, (void *)&timeout) != 0) {
|
||||
if (mysql_options(SQCONN(sconn), MYSQL_OPT_CONNECT_TIMEOUT, (void *)&timeout) != 0) {
|
||||
return -1;
|
||||
}
|
||||
if (mysql_optionsv(SQCONN(sconn), MYSQL_OPT_READ_TIMEOUT, (void *)&timeout) != 0) {
|
||||
if (mysql_options(SQCONN(sconn), MYSQL_OPT_READ_TIMEOUT, (void *)&timeout) != 0) {
|
||||
return -1;
|
||||
}
|
||||
if (mysql_optionsv(SQCONN(sconn), MYSQL_OPT_WRITE_TIMEOUT, (void *)&timeout) != 0) {
|
||||
if (mysql_options(SQCONN(sconn), MYSQL_OPT_WRITE_TIMEOUT, (void *)&timeout) != 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
@@ -52,10 +52,17 @@ void db_value_sbva(str_builder *sb, e_column_type type, uint32_t n_args, va_list
|
||||
int nchar;
|
||||
|
||||
if (n_args == 0) {
|
||||
if (type == TYPE_RAW) {
|
||||
strbld_str(sb, "NULL", 4);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (type == TYPE_RAW) {
|
||||
if (n_args == 0) {
|
||||
strbld_str(sb, "NULL", 4);
|
||||
return;
|
||||
}
|
||||
tmp_str = va_arg(args, char *);
|
||||
tmp_len = va_arg(args, size_t);
|
||||
strbld_str(sb, tmp_str, tmp_len);
|
||||
@@ -63,8 +70,10 @@ void db_value_sbva(str_builder *sb, e_column_type type, uint32_t n_args, va_list
|
||||
}
|
||||
|
||||
if (type == TYPE_TIMESTAMP) {
|
||||
if (db_timestampString(va_arg(args, unsigned int), &tmp_str, &tmp_len) == 0) {
|
||||
if (db_timestampString(va_arg(args, int64_t), &tmp_str, &tmp_len) != 0) {
|
||||
strbld_char(sb, '\'');
|
||||
strbld_str(sb, tmp_str, tmp_len);
|
||||
strbld_char(sb, '\'');
|
||||
free(tmp_str);
|
||||
}
|
||||
return;
|
||||
|
||||
@@ -18,6 +18,8 @@ static const R_CallMethodDef callMethods[] = {
|
||||
|
||||
{"rmodb_use", (DL_FUNC) &rmodb_use, 3},
|
||||
|
||||
{"rmodb_getLastQuery", (DL_FUNC) &rmodb_getLastQuery, 1},
|
||||
|
||||
|
||||
{"rmodb_groupId", (DL_FUNC) &rmodb_groupId, 2},
|
||||
|
||||
@@ -41,7 +43,9 @@ static const R_CallMethodDef callMethods[] = {
|
||||
{"rmodb_userRemoveGroup", (DL_FUNC) &rmodb_userRemoveGroup, 3},
|
||||
|
||||
|
||||
{"rmodb_metaobjectId", (DL_FUNC) &rmodb_metaobjectId, 2},
|
||||
{"rmodb_metaobjectIds", (DL_FUNC) &rmodb_metaobjectIds, 3},
|
||||
{"rmodb_metaobjectQuery", (DL_FUNC) &rmodb_metaobjectQuery, 4},
|
||||
{"rmodb_metadataQuery", (DL_FUNC) &rmodb_metadataQuery, 4},
|
||||
|
||||
{"rmodb_metaobject", (DL_FUNC) &rmodb_metaobject, 2},
|
||||
{"rmodb_metadata", (DL_FUNC) &rmodb_metadata, 2},
|
||||
@@ -51,7 +55,7 @@ static const R_CallMethodDef callMethods[] = {
|
||||
{"rmodb_metadatas", (DL_FUNC) &rmodb_metadatas, 2},
|
||||
|
||||
{"rmodb_createMetaobject", (DL_FUNC) &rmodb_createMetaobject, 5},
|
||||
{"rmodb_updateMetaobject", (DL_FUNC) &rmodb_updateMetaobject, 3},
|
||||
{"rmodb_updateMetaobject", (DL_FUNC) &rmodb_updateMetaobject, 5},
|
||||
{"rmodb_deleteMetaobject", (DL_FUNC) &rmodb_deleteMetaobject, 2},
|
||||
|
||||
|
||||
|
||||
@@ -272,7 +272,7 @@ uint64_t createMetaTable(stored_conn *sconn, modb_ref *modb)
|
||||
METADATA_TABLE, STR_LEN(METADATA_TABLE),
|
||||
"("
|
||||
"`mdo_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, "
|
||||
"`type` VARCHAR(255) NOT NULL, "
|
||||
// "`type` VARCHAR(255) NOT NULL, "
|
||||
"`title` VARCHAR(255) NOT NULL, "
|
||||
"`owner_id` INT UNSIGNED NOT NULL, "
|
||||
"`created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, "
|
||||
@@ -289,7 +289,8 @@ uint64_t createObjectsTable(stored_conn *sconn, modb_ref *modb)
|
||||
OBJECTS_TABLE, STR_LEN(OBJECTS_TABLE),
|
||||
"("
|
||||
"`mdo_id` INT UNSIGNED NOT NULL, "
|
||||
"`object` MEDIUMBLOB NULL, "
|
||||
"`length` INT UNSIGNED NOT NULL, "
|
||||
"`object` LONGBLOB NULL, "
|
||||
"PRIMARY KEY (`mdo_id`)"
|
||||
")", 0
|
||||
);
|
||||
@@ -303,7 +304,8 @@ uint64_t createMDOGroupsTable(stored_conn *sconn, modb_ref *modb)
|
||||
"`mdo_id` INT UNSIGNED NOT NULL, "
|
||||
"`group_id` INT UNSIGNED NOT NULL, "
|
||||
"INDEX(`mdo_id`), "
|
||||
"INDEX(`group_id`)"
|
||||
"INDEX(`group_id`), "
|
||||
"UNIQUE(`mdo_id`, `group_id`)"
|
||||
")", 0
|
||||
);
|
||||
}
|
||||
@@ -351,7 +353,8 @@ uint64_t createUserGroupsTable(stored_conn *sconn, modb_ref *modb)
|
||||
"`user_id` INT UNSIGNED NOT NULL, "
|
||||
"`group_id` INT UNSIGNED NOT NULL, "
|
||||
"INDEX(`user_id`), "
|
||||
"INDEX(`group_id`)"
|
||||
"INDEX(`group_id`),"
|
||||
"UNIQUE(`user_id`, `group_id`)"
|
||||
")", 0
|
||||
);
|
||||
}
|
||||
@@ -374,7 +377,7 @@ uint64_t createMetaExtTable(stored_conn *sconn, modb_ref *modb,
|
||||
strbld_str(sb, ", ", 2);
|
||||
columnCreateStr_sb(sb, *(col_data + c));
|
||||
}
|
||||
strbld_str(sb, ", INDEX (`mdo_id`)"
|
||||
strbld_str(sb, ", PRIMARY KEY (`mdo_id`)"
|
||||
")", 0);
|
||||
if (strbld_finalize_or_destroy(&sb, &table_def, &table_def_len) != 0) {
|
||||
return (uint64_t)-1;
|
||||
|
||||
@@ -14,10 +14,12 @@
|
||||
int tableRowsToMetadataList(column_data **col_data, size_t n_cols,
|
||||
struct metadata_t ***metadata_list, size_t *n_metadatas)
|
||||
{
|
||||
column_data *col_id, *col_type, *col_title, *col_owner_id,
|
||||
column_data *col_id, *col_title, *col_owner_id,
|
||||
*col_created, *col_updated, *col_deleted;
|
||||
size_t n_rows, idx;
|
||||
struct metadata_t *metadata;
|
||||
column_data **ext_cols;
|
||||
column_data *col;
|
||||
|
||||
n_rows = (*col_data)->n_values;
|
||||
if (n_rows == 0) {
|
||||
@@ -25,16 +27,32 @@ int tableRowsToMetadataList(column_data **col_data, size_t n_cols,
|
||||
}
|
||||
|
||||
col_id = findColumnByName(col_data, n_cols, "mdo_id");
|
||||
col_type = findColumnByName(col_data, n_cols, "type");
|
||||
//col_type = findColumnByName(col_data, n_cols, "type");
|
||||
col_title = findColumnByName(col_data, n_cols, "title");
|
||||
col_owner_id = findColumnByName(col_data, n_cols, "owner_id");
|
||||
col_created = findColumnByName(col_data, n_cols, "created");
|
||||
col_updated = findColumnByName(col_data, n_cols, "updated");
|
||||
col_deleted = findColumnByName(col_data, n_cols, "deleted");
|
||||
|
||||
size_t n_ext_cols = 0;
|
||||
ext_cols = malloc(n_cols * sizeof(column_data *));
|
||||
if (ext_cols == 0) {
|
||||
fprintf(stderr, "[%d]malloc: (%d) %s\n", __LINE__, errno, strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
size_t tbl_len = STR_LEN(META_EXT_TABLE);
|
||||
for (idx = 0; idx < n_cols; idx++) {
|
||||
col = *(col_data + idx);
|
||||
if (strncmp(col->table + (col->table_len - tbl_len), META_EXT_TABLE, tbl_len) == 0) {
|
||||
*(ext_cols + n_ext_cols) = col;
|
||||
n_ext_cols++;
|
||||
}
|
||||
}
|
||||
|
||||
*metadata_list = (struct metadata_t **)malloc(sizeof(struct metadata_t *) * n_rows);
|
||||
if (*metadata_list == 0) {
|
||||
fprintf(stderr, "[%d]malloc: (%d) %s\n", __LINE__, errno, strerror(errno));
|
||||
free(ext_cols);
|
||||
return -errno;
|
||||
}
|
||||
memset(*metadata_list, 0, sizeof(struct metadata_t *) * n_rows);
|
||||
@@ -43,19 +61,21 @@ int tableRowsToMetadataList(column_data **col_data, size_t n_cols,
|
||||
metadata = allocMetadata();
|
||||
if (metadata == 0) {
|
||||
freeMetadataList(metadata_list, idx - 1);
|
||||
free(ext_cols);
|
||||
return -1;
|
||||
}
|
||||
|
||||
metadata->id = *(col_id->data.ptr_uint32 + idx);
|
||||
|
||||
if (!moveColumnStrPointer(col_type, idx, 1, &metadata->type, &metadata->type_len)) {
|
||||
freeMetadataList(metadata_list, idx);
|
||||
return -1;
|
||||
}
|
||||
metadata->type_c = metadata->type;
|
||||
// if (!moveColumnStrPointer(col_type, idx, 1, &metadata->type, &metadata->type_len)) {
|
||||
// freeMetadataList(metadata_list, idx);
|
||||
// return -1;
|
||||
// }
|
||||
// metadata->type_c = metadata->type;
|
||||
|
||||
if (!moveColumnStrPointer(col_title, idx, 1, &metadata->title, &metadata->title_len)) {
|
||||
freeMetadataList(metadata_list, idx);
|
||||
free(ext_cols);
|
||||
return -1;
|
||||
}
|
||||
metadata->title_c = metadata->title;
|
||||
@@ -70,8 +90,15 @@ int tableRowsToMetadataList(column_data **col_data, size_t n_cols,
|
||||
metadata->deleted_on = *(col_deleted->data.ptr_int64 + idx);
|
||||
}
|
||||
|
||||
if (tableRowToMetaExt(ext_cols, n_ext_cols, idx, &metadata->ext) != 1) {
|
||||
freeMetadataList(metadata_list, idx);
|
||||
free(ext_cols);
|
||||
return -1;
|
||||
}
|
||||
|
||||
*(*metadata_list + idx) = metadata;
|
||||
}
|
||||
free(ext_cols);
|
||||
|
||||
*n_metadatas = n_rows;
|
||||
|
||||
@@ -80,8 +107,8 @@ int tableRowsToMetadataList(column_data **col_data, size_t n_cols,
|
||||
int doMetadataListQuery(stored_conn *sconn, modb_ref *modb, where_builder *wb,
|
||||
struct metadata_t ***metadata_list, size_t *n_metadatas)
|
||||
{
|
||||
char *table;
|
||||
size_t table_len;
|
||||
char *table, *ext_table;
|
||||
size_t table_len, ext_len;
|
||||
char *qry;
|
||||
size_t qry_len;
|
||||
uint64_t qry_ret;
|
||||
@@ -97,14 +124,17 @@ int doMetadataListQuery(stored_conn *sconn, modb_ref *modb, where_builder *wb,
|
||||
return -1;
|
||||
}
|
||||
modbTableName(&table, &table_len, modb, METADATA_TABLE, strlen(METADATA_TABLE));
|
||||
modbTableName(&ext_table, &ext_len, modb, META_EXT_TABLE, strlen(META_EXT_TABLE));
|
||||
|
||||
strbld_str(sb, "SELECT * FROM ", 0);
|
||||
escapeTableName_sb(sb, table, table_len);
|
||||
joinStr_sb(sb, " LEFT", 5, 1, ext_table, ext_len, "mdo_id", 6, table, table_len, "mdo_id", 6);
|
||||
if (wb != 0) {
|
||||
compileWhereBuilder_sb(sb, wb, 0);
|
||||
}
|
||||
strbld_str(sb, " ORDER BY `updated` DESC, `created` DESC", 0);
|
||||
|
||||
modbFreeTableName(&ext_table);
|
||||
modbFreeTableName(&table);
|
||||
if (strbld_finalize_or_destroy(&sb, &qry, &qry_len) != 0) {
|
||||
return -1;
|
||||
@@ -238,9 +268,13 @@ int modbMetadataById(stored_conn *sconn, modb_ref *modb, unsigned int id,
|
||||
{
|
||||
where_builder *wb = 0;
|
||||
int res;
|
||||
char *table;
|
||||
size_t table_len;
|
||||
|
||||
wb = where(0, "mdo_id", EQ, TYPE_ID, 1, id);
|
||||
modbTableName(&table, &table_len, modb, METADATA_TABLE, strlen(METADATA_TABLE));
|
||||
wb = where(table, "mdo_id", EQ, TYPE_ID, 1, id);
|
||||
res = doScalarMetadataListQuery(sconn, modb, wb, metadata);
|
||||
free(table);
|
||||
freeWhereBuilder(&wb);
|
||||
|
||||
return res;
|
||||
@@ -296,6 +330,12 @@ int modbMetadataListByGroupId(stored_conn *sconn, modb_ref *modb, unsigned int g
|
||||
return res;
|
||||
}
|
||||
|
||||
int modbMetadataQuery(stored_conn *sconn, modb_ref *modb, where_builder *wb,
|
||||
struct metadata_t ***metadata_list, size_t *n_metadatas)
|
||||
{
|
||||
return doMetadataListQuery(sconn, modb, wb, metadata_list, n_metadatas);
|
||||
}
|
||||
|
||||
int modbMetadataList(stored_conn *sconn, modb_ref *modb, int with_deleted,
|
||||
struct metadata_t ***metadata_list, size_t *n_metadatas)
|
||||
{
|
||||
@@ -323,9 +363,9 @@ unsigned int modbMetadataCreate(stored_conn *sconn, modb_ref *modb,
|
||||
size_t qry_len;
|
||||
uint64_t qry_ret;
|
||||
|
||||
if (metadata->type_c == 0) {
|
||||
metadata->type_c = metadata->type;
|
||||
}
|
||||
// if (metadata->type_c == 0) {
|
||||
// metadata->type_c = metadata->type;
|
||||
// }
|
||||
if (metadata->title_c == 0) {
|
||||
metadata->title_c = metadata->title;
|
||||
}
|
||||
@@ -337,10 +377,11 @@ unsigned int modbMetadataCreate(stored_conn *sconn, modb_ref *modb,
|
||||
|
||||
strbld_str(sb, "INSERT INTO ", 0);
|
||||
escapeTableName_sb(sb, table, table_len);
|
||||
strbld_str(sb, " (`mdo_id`, `type`, `title`, `owner_id`) VALUES (", 0);
|
||||
// strbld_str(sb, " (`mdo_id`, `type`, `title`, `owner_id`) VALUES (", 0);
|
||||
strbld_str(sb, " (`mdo_id`, `title`, `owner_id`) VALUES (", 0);
|
||||
db_value_sb(sb, TYPE_ID, 1, metadata->id);
|
||||
strbld_char(sb, ',');
|
||||
db_value_sb(sb, TYPE_STRING, 2, metadata->type_c, metadata->type_len);
|
||||
// strbld_char(sb, ',');
|
||||
// db_value_sb(sb, TYPE_STRING, 2, metadata->type_c, metadata->type_len);
|
||||
strbld_char(sb, ',');
|
||||
db_value_sb(sb, TYPE_STRING, 2, metadata->title_c, metadata->title_len);
|
||||
strbld_char(sb, ',');
|
||||
@@ -370,9 +411,9 @@ int64_t modbMetadataReplace(stored_conn *sconn, modb_ref *modb, unsigned int id,
|
||||
size_t table_len, set_len;
|
||||
int64_t qry_ret;
|
||||
|
||||
if (metadata->type_c == 0) {
|
||||
metadata->type_c = metadata->type;
|
||||
}
|
||||
// if (metadata->type_c == 0) {
|
||||
// metadata->type_c = metadata->type;
|
||||
// }
|
||||
if (metadata->title_c == 0) {
|
||||
metadata->title_c = metadata->title;
|
||||
}
|
||||
@@ -380,18 +421,31 @@ int64_t modbMetadataReplace(stored_conn *sconn, modb_ref *modb, unsigned int id,
|
||||
if ((sb = strbld_create()) == 0) {
|
||||
return 0;
|
||||
}
|
||||
columnSetValueStr_sb(sb, "mdo_id", TYPE_ID, 1, id);
|
||||
if (metadata->id != 0 && metadata->id != id) {
|
||||
strbld_char(sb, ',');
|
||||
columnSetValueStr_sb(sb, "mdo_id", TYPE_ID, 1, metadata->id);
|
||||
}
|
||||
if (metadata->type_c != 0) {
|
||||
strbld_char(sb, ',');
|
||||
columnSetValueStr_sb(sb, "type", TYPE_STRING, 2, metadata->type_c, metadata->type_len);
|
||||
}
|
||||
// if (metadata->type_c != 0) {
|
||||
// strbld_char(sb, ',');
|
||||
// columnSetValueStr_sb(sb, "type", TYPE_STRING, 2, metadata->type_c, metadata->type_len);
|
||||
// }
|
||||
if (metadata->title_c != 0) {
|
||||
strbld_char(sb, ',');
|
||||
columnSetValueStr_sb(sb, "title", TYPE_STRING, 2, metadata->title_c, metadata->title_len);
|
||||
}
|
||||
if (metadata->created_on != 0) {
|
||||
strbld_char(sb, ',');
|
||||
columnSetValueStr_sb(sb, "created", TYPE_TIMESTAMP, 1, metadata->created_on);
|
||||
}
|
||||
if (metadata->updated_on != 0) {
|
||||
strbld_char(sb, ',');
|
||||
columnSetValueStr_sb(sb, "updated", TYPE_TIMESTAMP, 1, metadata->updated_on);
|
||||
}
|
||||
if (metadata->deleted_on != 0) {
|
||||
strbld_char(sb, ',');
|
||||
columnSetValueStr_sb(sb, "deleted", TYPE_TIMESTAMP, 1, metadata->deleted_on);
|
||||
}
|
||||
if (metadata->owner != 0) {
|
||||
strbld_char(sb, ',');
|
||||
columnSetValueStr_sb(sb, "owner_id", TYPE_ID, 1, metadata->owner->id);
|
||||
|
||||
@@ -9,9 +9,9 @@
|
||||
struct metadata_t {
|
||||
unsigned int id;
|
||||
|
||||
char *type;
|
||||
const char *type_c;
|
||||
size_t type_len;
|
||||
// char *type;
|
||||
// const char *type_c;
|
||||
// size_t type_len;
|
||||
|
||||
char *title;
|
||||
const char *title_c;
|
||||
@@ -49,6 +49,9 @@ int modbMetadataListByGroupId(stored_conn *sconn, modb_ref *modb, unsigned int g
|
||||
int with_deleted,
|
||||
struct metadata_t ***metadata_list, size_t *n_metadatas);
|
||||
|
||||
int modbMetadataQuery(stored_conn *sconn, modb_ref *modb, where_builder *wb,
|
||||
struct metadata_t ***metadata_list, size_t *n_metadatas);
|
||||
|
||||
int modbMetadataList(stored_conn *sconn, modb_ref *modb, int with_deleted,
|
||||
struct metadata_t ***metadata_list, size_t *n_metadatas);
|
||||
|
||||
|
||||
@@ -8,134 +8,170 @@
|
||||
#include "modb_p.h"
|
||||
|
||||
|
||||
// ##### PUBLIC
|
||||
int tableRowToMetaExt(column_data **col_data, size_t n_cols, size_t row_idx,
|
||||
struct meta_ext_t **ext_ptr)
|
||||
{
|
||||
column_data *col_id, *col;
|
||||
size_t c_idx, v_idx;
|
||||
struct meta_ext_t *ext;
|
||||
struct meta_ext_value_t *ext_value;
|
||||
|
||||
col_id = findColumnByName(col_data, n_cols, "mdo_id");
|
||||
|
||||
if ((ext = allocMetaExt()) == 0) {
|
||||
fprintf(stderr, "[%d]malloc: (%d) %s\n", __LINE__, errno, strerror(errno));
|
||||
return -errno;
|
||||
}
|
||||
*ext_ptr = ext;
|
||||
|
||||
ext->id = *(col_id->data.ptr_uint32 + row_idx);
|
||||
|
||||
if (n_cols > 0) {
|
||||
if ((ext->values = allocMetaExtValues(n_cols - 1, 1)) == 0) {
|
||||
freeMetaExt(ext_ptr);
|
||||
return -1;
|
||||
}
|
||||
ext->n_values = n_cols - 1;
|
||||
}
|
||||
|
||||
for (c_idx = 0, v_idx = 0; c_idx < n_cols; c_idx++, v_idx++) {
|
||||
col = *(col_data + c_idx);
|
||||
if (col == col_id) {
|
||||
v_idx--;
|
||||
continue;
|
||||
}
|
||||
ext_value = *(ext->values + v_idx);
|
||||
|
||||
if (strmemcpy(col->name, col->name_len, &ext_value->key, &ext_value->key_len) != 0) {
|
||||
freeMetaExt(ext_ptr);
|
||||
return -1;
|
||||
}
|
||||
ext_value->key_c = ext_value->key;
|
||||
|
||||
switch(col->type) {
|
||||
case TYPE_RAW:
|
||||
ext_value->type = VTYPE_RAW;
|
||||
break;
|
||||
case TYPE_BOOL:
|
||||
ext_value->type = VTYPE_BOOL;
|
||||
break;
|
||||
case TYPE_INT8:
|
||||
case TYPE_UINT8:
|
||||
case TYPE_INT16:
|
||||
case TYPE_UINT16:
|
||||
case TYPE_INT32:
|
||||
case TYPE_FLOAT:
|
||||
ext_value->type = VTYPE_INT32;
|
||||
break;
|
||||
case TYPE_UINT32:
|
||||
case TYPE_INT64:
|
||||
case TYPE_UINT64:
|
||||
case TYPE_DOUBLE:
|
||||
ext_value->type = VTYPE_DOUBLE;
|
||||
break;
|
||||
case TYPE_STRING:
|
||||
ext_value->type = VTYPE_STRING;
|
||||
break;
|
||||
case TYPE_BLOB:
|
||||
ext_value->type = VTYPE_RAW;
|
||||
break;
|
||||
case TYPE_TIMESTAMP:
|
||||
ext_value->type = VTYPE_TIMESTAMP;
|
||||
break;
|
||||
case TYPE_ID:
|
||||
ext_value->type = VTYPE_ID;
|
||||
break;
|
||||
}
|
||||
|
||||
if (columnRowIsNull(col, row_idx)) {
|
||||
ext_value->is_null = 1;
|
||||
} else {
|
||||
switch(col->type) {
|
||||
case TYPE_RAW:
|
||||
if (!moveColumnBlobPointer(col, row_idx, 1, (char **)&ext_value->value.raw, &ext_value->value_len)) {
|
||||
freeMetaExt(ext_ptr);
|
||||
return -1;
|
||||
}
|
||||
break;
|
||||
case TYPE_BOOL:
|
||||
ext_value->value.int32 = *(col->data.ptr_uint8 + row_idx);
|
||||
break;
|
||||
case TYPE_INT8:
|
||||
ext_value->value.int32 = *(col->data.ptr_int8 + row_idx);
|
||||
break;
|
||||
case TYPE_UINT8:
|
||||
ext_value->value.int32 = *(col->data.ptr_uint8 + row_idx);
|
||||
break;
|
||||
case TYPE_INT16:
|
||||
ext_value->value.int32 = *(col->data.ptr_int16 + row_idx);
|
||||
break;
|
||||
case TYPE_UINT16:
|
||||
ext_value->value.int32 = *(col->data.ptr_uint16 + row_idx);
|
||||
break;
|
||||
case TYPE_INT32:
|
||||
ext_value->value.int32 = *(col->data.ptr_int32 + row_idx);
|
||||
break;
|
||||
case TYPE_UINT32:
|
||||
ext_value->value.dbl = (double)*(col->data.ptr_uint32 + row_idx);
|
||||
break;
|
||||
case TYPE_INT64:
|
||||
ext_value->value.dbl = (double)*(col->data.ptr_int64 + row_idx);
|
||||
break;
|
||||
case TYPE_UINT64:
|
||||
ext_value->value.dbl = (double)*(col->data.ptr_uint64 + row_idx);
|
||||
break;
|
||||
case TYPE_FLOAT:
|
||||
ext_value->value.dbl = (double)*(col->data.ptr_float + row_idx);
|
||||
break;
|
||||
case TYPE_DOUBLE:
|
||||
ext_value->value.dbl = *(col->data.ptr_double + row_idx);
|
||||
break;
|
||||
case TYPE_STRING:
|
||||
if (!moveColumnStrPointer(col, row_idx, 1, &ext_value->value.str, &ext_value->value_len)) {
|
||||
freeMetaExt(ext_ptr);
|
||||
return -1;
|
||||
}
|
||||
break;
|
||||
case TYPE_BLOB:
|
||||
if (!moveColumnBlobPointer(col, row_idx, 1, (char **)&ext_value->value.raw, &ext_value->value_len)) {
|
||||
freeMetaExt(ext_ptr);
|
||||
return -1;
|
||||
}
|
||||
break;
|
||||
case TYPE_TIMESTAMP:
|
||||
ext_value->value.ts = *(col->data.ptr_int64 + row_idx);
|
||||
break;
|
||||
case TYPE_ID:
|
||||
ext_value->value.id = *(col->data.ptr_uint32 + row_idx);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
// ##### PRIVATE
|
||||
int tableRowsToMetaExtList(column_data **col_data, size_t n_cols,
|
||||
struct meta_ext_t ***ext_list, size_t *n_exts)
|
||||
{
|
||||
column_data *col_id, *col;
|
||||
size_t n_rows, r_idx, c_idx, v_idx;
|
||||
struct meta_ext_t *ext;
|
||||
struct meta_ext_value_t *ext_value;
|
||||
size_t n_rows, r_idx;
|
||||
|
||||
n_rows = (*col_data)->n_values;
|
||||
if (n_rows == 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
col_id = findColumnByName(col_data, n_cols, "mdo_id");
|
||||
|
||||
if ((*ext_list = allocMetaExtList(n_rows)) == 0) {
|
||||
fprintf(stderr, "[%d]malloc: (%d) %s\n", __LINE__, errno, strerror(errno));
|
||||
return -errno;
|
||||
}
|
||||
|
||||
for (r_idx = 0; r_idx < n_rows; r_idx++) {
|
||||
if ((ext = allocMetaExt()) == 0) {
|
||||
freeMetaExtList(ext_list, r_idx - 1);
|
||||
if (tableRowToMetaExt(col_data, n_cols, r_idx, (*ext_list) + r_idx) != 1) {
|
||||
freeMetaExtList(ext_list, r_idx);
|
||||
return -1;
|
||||
}
|
||||
*((*ext_list) + r_idx) = ext;
|
||||
|
||||
ext->id = *(col_id->data.ptr_uint32 + r_idx);
|
||||
|
||||
if (n_cols > 0) {
|
||||
if ((ext->values = allocMetaExtValues(n_cols - 1, 1)) == 0) {
|
||||
freeMetaExtList(ext_list, r_idx);
|
||||
return -1;
|
||||
}
|
||||
ext->n_values = n_cols - 1;
|
||||
}
|
||||
|
||||
for (c_idx = 0, v_idx = 0; c_idx < n_cols; c_idx++, v_idx++) {
|
||||
col = *(col_data + c_idx);
|
||||
if (col == col_id) {
|
||||
v_idx--;
|
||||
continue;
|
||||
}
|
||||
ext_value = *(ext->values + v_idx);
|
||||
|
||||
if (strmemcpy(col->name, col->name_len, &ext_value->key, &ext_value->key_len) != 0) {
|
||||
freeMetaExtList(ext_list, r_idx);
|
||||
return -1;
|
||||
}
|
||||
ext_value->key_c = ext_value->key;
|
||||
|
||||
switch(col->type) {
|
||||
case TYPE_RAW:
|
||||
ext_value->type = VTYPE_RAW;
|
||||
if (!moveColumnBlobPointer(col, r_idx, 1, (char **)&ext_value->value.raw, &ext_value->value_len)) {
|
||||
freeMetaExtList(ext_list, r_idx);
|
||||
return -1;
|
||||
}
|
||||
break;
|
||||
case TYPE_BOOL:
|
||||
ext_value->type = VTYPE_BOOL;
|
||||
ext_value->value.int32 = *(col->data.ptr_uint8 + r_idx);
|
||||
break;
|
||||
case TYPE_INT8:
|
||||
ext_value->type = VTYPE_INT32;
|
||||
ext_value->value.int32 = *(col->data.ptr_int8 + r_idx);
|
||||
break;
|
||||
case TYPE_UINT8:
|
||||
ext_value->type = VTYPE_INT32;
|
||||
ext_value->value.int32 = *(col->data.ptr_uint8 + r_idx);
|
||||
break;
|
||||
case TYPE_INT16:
|
||||
ext_value->type = VTYPE_INT32;
|
||||
ext_value->value.int32 = *(col->data.ptr_int16 + r_idx);
|
||||
break;
|
||||
case TYPE_UINT16:
|
||||
ext_value->type = VTYPE_INT32;
|
||||
ext_value->value.int32 = *(col->data.ptr_uint16 + r_idx);
|
||||
break;
|
||||
case TYPE_INT32:
|
||||
ext_value->type = VTYPE_INT32;
|
||||
ext_value->value.int32 = *(col->data.ptr_int32 + r_idx);
|
||||
break;
|
||||
case TYPE_UINT32:
|
||||
ext_value->type = VTYPE_INT32;
|
||||
ext_value->value.dbl = (double)*(col->data.ptr_uint32 + r_idx);
|
||||
break;
|
||||
case TYPE_INT64:
|
||||
ext_value->type = VTYPE_INT32;
|
||||
ext_value->value.dbl = (double)*(col->data.ptr_int64 + r_idx);
|
||||
break;
|
||||
case TYPE_UINT64:
|
||||
ext_value->type = VTYPE_INT32;
|
||||
ext_value->value.dbl = (double)*(col->data.ptr_uint64 + r_idx);
|
||||
break;
|
||||
case TYPE_FLOAT:
|
||||
ext_value->type = VTYPE_INT32;
|
||||
ext_value->value.dbl = (double)*(col->data.ptr_float + r_idx);
|
||||
break;
|
||||
case TYPE_DOUBLE:
|
||||
ext_value->type = VTYPE_DOUBLE;
|
||||
ext_value->value.dbl = *(col->data.ptr_double + r_idx);
|
||||
break;
|
||||
case TYPE_STRING:
|
||||
ext_value->type = VTYPE_STRING;
|
||||
if (!moveColumnStrPointer(col, r_idx, 1, &ext_value->value.str, &ext_value->value_len)) {
|
||||
freeMetaExtList(ext_list, r_idx);
|
||||
return -1;
|
||||
}
|
||||
break;
|
||||
case TYPE_BLOB:
|
||||
ext_value->type = VTYPE_RAW;
|
||||
if (!moveColumnBlobPointer(col, r_idx, 1, (char **)&ext_value->value.raw, &ext_value->value_len)) {
|
||||
freeMetaExtList(ext_list, r_idx);
|
||||
return -1;
|
||||
}
|
||||
break;
|
||||
case TYPE_TIMESTAMP:
|
||||
ext_value->type = VTYPE_TIMESTAMP;
|
||||
ext_value->value.ts = *(col->data.ptr_int64 + r_idx);
|
||||
break;
|
||||
case TYPE_ID:
|
||||
ext_value->type = VTYPE_ID;
|
||||
ext_value->value.id = *(col->data.ptr_uint32 + r_idx);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
*n_exts = n_rows;
|
||||
@@ -424,28 +460,36 @@ int64_t modbMetaExtCreate(stored_conn *sconn, modb_ref *modb, struct meta_ext_t
|
||||
for (idx = 0; idx < meta_ext->n_values; idx++) {
|
||||
ext_value = *(meta_ext->values + idx);
|
||||
strbld_char(sb, ',');
|
||||
switch(ext_value->type) {
|
||||
case VTYPE_RAW:
|
||||
db_value_sb(sb, TYPE_RAW, 2, ext_value->value.raw, ext_value->value_len);
|
||||
break;
|
||||
case VTYPE_BOOL:
|
||||
db_value_sb(sb, TYPE_BOOL, 1, ext_value->value.bool);
|
||||
break;
|
||||
case VTYPE_INT32:
|
||||
db_value_sb(sb, TYPE_INT32, 1, ext_value->value.int32);
|
||||
break;
|
||||
case VTYPE_DOUBLE:
|
||||
db_value_sb(sb, TYPE_DOUBLE, 1, ext_value->value.dbl);
|
||||
break;
|
||||
case VTYPE_STRING:
|
||||
db_value_sb(sb, TYPE_STRING, 2, ext_value->value.str, ext_value->value_len);
|
||||
break;
|
||||
case VTYPE_TIMESTAMP:
|
||||
db_value_sb(sb, TYPE_TIMESTAMP, 1, ext_value->value.ts);
|
||||
break;
|
||||
case VTYPE_ID:
|
||||
db_value_sb(sb, TYPE_ID, 1, ext_value->value.id);
|
||||
break;
|
||||
if (ext_value->is_null) {
|
||||
db_value_sb(sb, TYPE_RAW, 0);
|
||||
} else {
|
||||
switch(ext_value->type) {
|
||||
case VTYPE_RAW:
|
||||
if (ext_value->is_null) {
|
||||
db_value_sb(sb, TYPE_RAW, 0);
|
||||
} else {
|
||||
db_value_sb(sb, TYPE_RAW, 2, ext_value->value.raw, ext_value->value_len);
|
||||
}
|
||||
break;
|
||||
case VTYPE_BOOL:
|
||||
db_value_sb(sb, TYPE_BOOL, 1, ext_value->value.boolVal);
|
||||
break;
|
||||
case VTYPE_INT32:
|
||||
db_value_sb(sb, TYPE_INT32, 1, ext_value->value.int32);
|
||||
break;
|
||||
case VTYPE_DOUBLE:
|
||||
db_value_sb(sb, TYPE_DOUBLE, 1, ext_value->value.dbl);
|
||||
break;
|
||||
case VTYPE_STRING:
|
||||
db_value_sb(sb, TYPE_STRING, 2, ext_value->value.str, ext_value->value_len);
|
||||
break;
|
||||
case VTYPE_TIMESTAMP:
|
||||
db_value_sb(sb, TYPE_TIMESTAMP, 1, ext_value->value.ts);
|
||||
break;
|
||||
case VTYPE_ID:
|
||||
db_value_sb(sb, TYPE_ID, 1, ext_value->value.id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
strbld_char(sb, ')');
|
||||
@@ -461,8 +505,6 @@ int64_t modbMetaExtCreate(stored_conn *sconn, modb_ref *modb, struct meta_ext_t
|
||||
return qry_ret == 0 ? meta_ext->id : 0;
|
||||
}
|
||||
int64_t modbMetaExtReplace(stored_conn *sconn, modb_ref *modb, unsigned int id,
|
||||
struct meta_ext_t *meta_ext);
|
||||
int64_t modbMetaExtUpdate(stored_conn *sconn, modb_ref *modb, unsigned int id,
|
||||
struct meta_ext_t *meta_ext)
|
||||
{
|
||||
str_builder *sb;
|
||||
@@ -480,32 +522,36 @@ int64_t modbMetaExtUpdate(stored_conn *sconn, modb_ref *modb, unsigned int id,
|
||||
for (idx = 0; idx < meta_ext->n_values; idx++) {
|
||||
ext_value = *(meta_ext->values + idx);
|
||||
strbld_char(sb, ',');
|
||||
switch(ext_value->type) {
|
||||
case VTYPE_RAW:
|
||||
columnSetValueStr_sb(
|
||||
sb, ext_value->key_c, TYPE_RAW, 2, ext_value->value.raw, ext_value->value_len
|
||||
);
|
||||
break;
|
||||
case VTYPE_BOOL:
|
||||
columnSetValueStr_sb(sb, ext_value->key_c, TYPE_BOOL, 1, ext_value->value.bool);
|
||||
break;
|
||||
case VTYPE_INT32:
|
||||
columnSetValueStr_sb(sb, ext_value->key_c, TYPE_INT32, 1, ext_value->value.int32);
|
||||
break;
|
||||
case VTYPE_DOUBLE:
|
||||
columnSetValueStr_sb(sb, ext_value->key_c, TYPE_DOUBLE, 1, ext_value->value.dbl);
|
||||
break;
|
||||
case VTYPE_STRING:
|
||||
columnSetValueStr_sb(
|
||||
sb, ext_value->key_c, TYPE_STRING, 2, ext_value->value.str, ext_value->value_len
|
||||
);
|
||||
break;
|
||||
case VTYPE_TIMESTAMP:
|
||||
columnSetValueStr_sb(sb, ext_value->key_c, TYPE_TIMESTAMP, 1, ext_value->value.ts);
|
||||
break;
|
||||
case VTYPE_ID:
|
||||
columnSetValueStr_sb(sb, ext_value->key_c, TYPE_ID, 1, ext_value->value.id);
|
||||
break;
|
||||
if (ext_value->is_null) {
|
||||
columnSetValueStr_sb(sb, ext_value->key_c, TYPE_RAW, 0);
|
||||
} else {
|
||||
switch(ext_value->type) {
|
||||
case VTYPE_RAW:
|
||||
columnSetValueStr_sb(
|
||||
sb, ext_value->key_c, TYPE_RAW, 2, ext_value->value.raw, ext_value->value_len
|
||||
);
|
||||
break;
|
||||
case VTYPE_BOOL:
|
||||
columnSetValueStr_sb(sb, ext_value->key_c, TYPE_BOOL, 1, ext_value->value.boolVal);
|
||||
break;
|
||||
case VTYPE_INT32:
|
||||
columnSetValueStr_sb(sb, ext_value->key_c, TYPE_INT32, 1, ext_value->value.int32);
|
||||
break;
|
||||
case VTYPE_DOUBLE:
|
||||
columnSetValueStr_sb(sb, ext_value->key_c, TYPE_DOUBLE, 1, ext_value->value.dbl);
|
||||
break;
|
||||
case VTYPE_STRING:
|
||||
columnSetValueStr_sb(
|
||||
sb, ext_value->key_c, TYPE_STRING, 2, ext_value->value.str, ext_value->value_len
|
||||
);
|
||||
break;
|
||||
case VTYPE_TIMESTAMP:
|
||||
columnSetValueStr_sb(sb, ext_value->key_c, TYPE_TIMESTAMP, 1, ext_value->value.ts);
|
||||
break;
|
||||
case VTYPE_ID:
|
||||
columnSetValueStr_sb(sb, ext_value->key_c, TYPE_ID, 1, ext_value->value.id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ struct meta_ext_value_t {
|
||||
|
||||
union {
|
||||
void *raw;
|
||||
int bool;
|
||||
int boolVal;
|
||||
int32_t int32;
|
||||
double dbl;
|
||||
char *str;
|
||||
@@ -47,6 +47,10 @@ struct meta_ext_value_t {
|
||||
uint32_t is_const :1;
|
||||
};
|
||||
|
||||
|
||||
int tableRowToMetaExt(column_data **col_data, size_t n_cols, size_t row_idx,
|
||||
struct meta_ext_t **ext_ptr);
|
||||
|
||||
struct meta_ext_t *allocMetaExt(void);
|
||||
void freeMetaExt(struct meta_ext_t **meta_ext);
|
||||
struct meta_ext_t **allocMetaExtList(size_t n_meta_ext_list);
|
||||
|
||||
@@ -233,9 +233,11 @@ int64_t modbObjectCreate(stored_conn *sconn, modb_ref *modb,
|
||||
|
||||
strbld_str(sb, "INSERT INTO ", 0);
|
||||
escapeTableName_sb(sb, table, table_len);
|
||||
strbld_str(sb, " (`mdo_id`, `object`) VALUES (", 0);
|
||||
strbld_str(sb, " (`mdo_id`, `length`, `object`) VALUES (", 0);
|
||||
db_value_sb(sb, TYPE_ID, 1, object->id);
|
||||
strbld_char(sb, ',');
|
||||
db_value_sb(sb, TYPE_UINT32, 1, object->data_len);
|
||||
strbld_char(sb, ',');
|
||||
db_value_sb(sb, TYPE_BLOB, 2, object->data_c, object->data_len);
|
||||
strbld_char(sb, ')');
|
||||
|
||||
@@ -270,6 +272,8 @@ int64_t modbObjectUpdate(stored_conn *sconn, modb_ref *modb, unsigned int id,
|
||||
columnSetValueStr_sb(sb, "mdo_id", TYPE_ID, 1, object->id);
|
||||
}
|
||||
if (object->data_c != 0) {
|
||||
strbld_char(sb, ',');
|
||||
columnSetValueStr_sb(sb, "length", TYPE_UINT32, 1, object->data_len);
|
||||
strbld_char(sb, ',');
|
||||
columnSetValueStr_sb(sb, "object", TYPE_BLOB, 2, object->data_c, object->data_len);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user