Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: Anyone want to help make zsh/db/gdbm work?



23.01.2015, 08:20, "Bart Schaefer" <schaefer@xxxxxxxxxxxxxxxx>:
> This module has been sitting around forever, completely undocumented.  The
> basic functions work; I tweaked a couple of things and wrote a short page
> of documentation, which explains about this:

By the way, I just realized that you can write ztie/zuntie on top of zpython. zsh.set_special_hash(varname, hash) does not care which Python object the hash is as long it implements necessary interfaces and it is completely possible (and I think there are already some implementations) to write Python object that will provides access to the database in a needed fashion. It is easier to write database acess code in Python then it is in C, but it will obviously have greater overhead.

if you want to consider merging https://bitbucket.org/ZyX_I/zpython I can convert it back to a patch it used to be once. I introduced it to a list, but it did not get much attention.

>
> schaefer<507> typeset GDBMDB
> schaefer<508> ztie -d db/gdbm -f gdbmdb GDBMDB
> ztie: cannot create the requested parameter GDBMDB
>
> However, there's still this:
>
> schaefer<518> typeset GDBMDB
> schaefer<519> (){ local GDBMDB; unset GDBMDB; ztie -d db/gdbm -f gdbmdb GDBMDB }
>  ../../zsh-5.0/Src/params.c:4914: BUG: in restoring scope of special parameter
> zsh: segmentation fault (core dumped)  Src/zsh
>
> This happens because ztie/zuntie directly manipulate the global paramtab.
> Somebody else may be able to patch that up quicker than I.
>
> diff --git a/Doc/Makefile.in b/Doc/Makefile.in
> index 41af4a3..a420781 100644
> --- a/Doc/Makefile.in
> +++ b/Doc/Makefile.in
> @@ -60,7 +60,7 @@ MODDOCSRC = \
>  Zsh/mod_attr.yo Zsh/mod_cap.yo Zsh/mod_clone.yo \
>  Zsh/mod_compctl.yo Zsh/mod_complete.yo Zsh/mod_complist.yo \
>  Zsh/mod_computil.yo Zsh/mod_curses.yo \
> -Zsh/mod_datetime.yo Zsh/mod_deltochar.yo \
> +Zsh/mod_datetime.yo Zsh/mod_db_gdbm.yo Zsh/mod_deltochar.yo \
>  Zsh/mod_example.yo Zsh/mod_files.yo Zsh/mod_langinfo.yo \
>  Zsh/mod_mapfile.yo Zsh/mod_mathfunc.yo Zsh/mod_newuser.yo \
>  Zsh/mod_parameter.yo Zsh/mod_pcre.yo Zsh/mod_regex.yo \
> diff --git a/Src/Modules/db_gdbm.c b/Src/Modules/db_gdbm.c
> index 9a2a7a5..f079094 100644
> --- a/Src/Modules/db_gdbm.c
> +++ b/Src/Modules/db_gdbm.c
> @@ -39,9 +39,7 @@
>
>  #include <gdbm.h>
>
> -#if 0 /* what is this for? */
>  static char *backtype = "db/gdbm";
> -#endif
>
>  static const struct gsu_scalar gdbm_gsu =
>  { gdbmgetfn, gdbmsetfn, gdbmunsetfn };
> @@ -60,33 +58,38 @@ bin_ztie(char *nam, char **args, Options ops, UNUSED(int func))
>      Param tied_param;
>
>      if(!OPT_ISSET(ops,'d')) {
> -        zwarnnam(nam, "you must pass `-d db/gdbm' to ztie", NULL);
> +        zwarnnam(nam, "you must pass `-d %s'", backtype);
>          return 1;
>      }
>      if(!OPT_ISSET(ops,'f')) {
> -        zwarnnam(nam, "you must pass `-f' with a filename to ztie", NULL);
> +        zwarnnam(nam, "you must pass `-f' with a filename", NULL);
>          return 1;
>      }
>
>      /* Here should be a lookup of the backend type against
>       * a registry.
>       */
> +    if (strcmp(OPT_ARG(ops, 'd'), backtype) != 0) {
> +        zwarnnam(nam, "unsupported backend type `%s'", OPT_ARG(ops, 'd'));
> + return 1;
> +    }
>
>      pmname = ztrdup(*args);
>
>      resource_name = OPT_ARG(ops, 'f');
>
> -    if (!(tied_param = createspecialhash(pmname, &getgdbmnode, &scangdbmkeys, 0))) {
> -        zwarnnam(nam, "cannot create the requested parameter name", NULL);
> - return 1;
> -    }
> -
>      dbf = gdbm_open(resource_name, 0, GDBM_WRCREAT | GDBM_SYNC, 0666, 0);
>      if(!dbf) {
>          zwarnnam(nam, "error opening database file %s", resource_name);
>          return 1;
>      }
>
> +    if (!(tied_param = createspecialhash(pmname, &getgdbmnode, &scangdbmkeys, 0))) {
> +        zwarnnam(nam, "cannot create the requested parameter %s", pmname);
> + gdbm_close(dbf);
> + return 1;
> +    }
> +
>      tied_param->u.hash->tmpdata = (void *)dbf;
>
>      return 0;
> @@ -98,19 +101,25 @@ bin_zuntie(char *nam, char **args, Options ops, UNUSED(int func))
>  {
>      Param pm;
>      GDBM_FILE dbf;
> -
> -    pm = (Param) paramtab->getnode(paramtab, args[0]);
> -    if(!pm) {
> -        zwarnnam(nam, "cannot untie %s", args[0]);
> - return 1;
> +    char *pmname;
> +    int ret = 0;
> +
> +    for (pmname = *args; *args++; pmname = *args) {
> + pm = (Param) paramtab->getnode(paramtab, pmname);
> + if(!pm) {
> +    zwarnnam(nam, "cannot untie %s", pmname);
> +    ret = 1;
> +    continue;
> + }
> +
> + dbf = (GDBM_FILE)(pm->u.hash->tmpdata);
> + gdbm_close(dbf);
> + /* free(pm->u.hash->tmpdata); */
> + pm->u.hash->tmpdata = NULL;
> + paramtab->removenode(paramtab, pm->node.nam);
>      }
>
> -    dbf = (GDBM_FILE)(pm->u.hash->tmpdata);
> -    gdbm_close(dbf);
> -/*    free(pm->u.hash->tmpdata); */
> -    paramtab->removenode(paramtab, pm->node.nam);
> -
> -    return 0;
> +    return ret;
>  }
>
>  /**/



Messages sorted by: Reverse Date, Date, Thread, Author