finished more testing/refactoring subu-mk-0 and subu-rm-0
authorThomas Walker Lynch <thomas.lynch@reasoningtechnology.com>
Wed, 13 Mar 2019 14:40:39 +0000 (15:40 +0100)
committerThomas Walker Lynch <thomas.lynch@reasoningtechnology.com>
Wed, 13 Mar 2019 14:40:39 +0000 (15:40 +0100)
15 files changed:
7_makefile
src/5_scratch/subu.lib.h
src/5_scratch/subudb-init.cli.h
src/5_scratch/subudb-number.cli.h
src/5_scratch/subudb-rel-get.cli.h
src/5_scratch/subudb-subus.cli.h [new file with mode: 0644]
src/5_scratch/subudb.lib.h
src/7_makefile
src/subu.lib.c
src/subudb-init.cli.c
src/subudb-number.cli.c
src/subudb-rel-put.cli.c
src/subudb-subus.cli.c [new file with mode: 0644]
src/subudb.lib.c
tools/bin/gitadd

index 24dfafb..f170e23 100755 (executable)
@@ -4,22 +4,22 @@ subdirectories=src
 
 all :
        $(foreach dir, $(subdirectories), \
-               if [ -f $(dir)/makefile ]; then \
+               if [ -f $(dir)/7_makefile ]; then \
                        make -C $(dir) all && make -C $(dir) install; \
                fi;\
        )
 
 clean :
        $(foreach dir, $(subdirectories), \
-               if [ -f ./$(dir)/makefile ]; then \
+               if [ -f ./$(dir)/7_makefile ]; then \
                        make -C $(dir) clean; \
                fi;\
        )
 
-dist_clean :
+dist-clean :
        $(foreach dir, $(subdirectories), \
-               if [ -f ./$(dir)/makefile ]; then \
-                       make -C $(dir) dist_clean; \
+               if [ -f ./$(dir)/7_makefile ]; then \
+                       make -C $(dir) dist-clean; \
                fi;\
        )
 
index 45c0b81..93c73b9 100644 (file)
@@ -2,7 +2,7 @@
 #undef INTERFACE
 #include <sqlite3.h>
 int subudb_Masteru_Subu_rm(sqlite3 *db,char *masteru_name,char *subuname,char *subu_username);
-int subudb_Masteru_Subu_get(sqlite3 *db,char *masteru_name,char *subuname,char **subu_username);
+int subudb_Masteru_Subu_get_subu_username(sqlite3 *db,char *masteru_name,char *subuname,char **subu_username);
 #include <stdbool.h>
 #include <errno.h>
 int subu_rm_0(char **mess,sqlite3 *db,char *subuname);
@@ -14,22 +14,20 @@ int dispatch_exec(char **argv,char **envp);
 void dispatch_f_mess(char *fname,int err,char *dispatchee);
 #define ERR_DISPATCH -1024
 int dispatch_f_euid_egid(char *fname,int(*f)(void *arg),void *f_arg,uid_t euid,gid_t egid);
-int db_commit(sqlite3 *db);
-int subudb_number_init(sqlite3 *db,char *masteru_name,int n);
-typedef unsigned int uint;
-extern uint First_Max_Subunumber;
-int db_rollback(sqlite3 *db);
-int subudb_number_set(sqlite3 *db,char *masteru_name,int n);
-int subudb_number_get(sqlite3 *db,char *masteru_name,int *n);
-int db_begin(sqlite3 *db);
 int dbprintf(const char *format,...);
 int subu_mk_0(char **mess,sqlite3 *db,char *subuname);
 extern char Subuland_Extension[];
+int db_commit(sqlite3 *db);
+int db_rollback(sqlite3 *db);
+int subudb_number_set(sqlite3 *db,int n);
+int subudb_number_get(sqlite3 *db,int *n);
+int db_begin(sqlite3 *db);
+typedef unsigned int uint;
 extern uint Subuhome_Perms;
 extern char DB_File[];
 void subu_err(char *fname,int err,char *mess);
 #define SUBU_ERR_N 14
-#define SUBU_ERR_CONFIG_SUBU_NOT_FOUND 13
+#define SUBU_ERR_SUBU_NOT_FOUND 13
 #define SUBU_ERR_FAILED_USERDEL 12
 #define SUBU_ERR_FAILED_USERADD 11
 #define SUBU_ERR_BUG_SSS 10
index 36fa2c9..4435103 100644 (file)
@@ -1,7 +1,10 @@
 /* \aThis file was automatically generated.  Do not edit! */
 #undef INTERFACE
 #include <sqlite3.h>
+int db_commit(sqlite3 *db);
+int db_rollback(sqlite3 *db);
 int subudb_schema(sqlite3 *db);
+int db_begin(sqlite3 *db);
 #include <stdbool.h>
 #include <errno.h>
 #define SUBU_ERR_DB_FILE 8
index 3e4e351..c130fbb 100644 (file)
@@ -1,8 +1,8 @@
 /* \aThis file was automatically generated.  Do not edit! */
 #undef INTERFACE
 #include <sqlite3.h>
-int subudb_number_get(sqlite3 *db,char *masteru_name,int *n);
-int subudb_number_set(sqlite3 *db,char *masteru_name,int n);
+int subudb_number_get(sqlite3 *db,int *n);
+int subudb_number_set(sqlite3 *db,int n);
 #include <stdbool.h>
 #include <errno.h>
 #define SUBU_ERR_N 14
index 23c41b1..4f335be 100644 (file)
@@ -1,7 +1,7 @@
 /* \aThis file was automatically generated.  Do not edit! */
 #undef INTERFACE
 #include <sqlite3.h>
-int subudb_Masteru_Subu_get(sqlite3 *db,char *masteru_name,char *subuname,char **subu_username);
+int subudb_Masteru_Subu_get_subu_username(sqlite3 *db,char *masteru_name,char *subuname,char **subu_username);
 #include <stdbool.h>
 #include <errno.h>
 #define SUBU_ERR_DB_FILE 8
diff --git a/src/5_scratch/subudb-subus.cli.h b/src/5_scratch/subudb-subus.cli.h
new file mode 100644 (file)
index 0000000..16310b7
--- /dev/null
@@ -0,0 +1,14 @@
+/* \aThis file was automatically generated.  Do not edit! */
+#undef INTERFACE
+#include <sqlite3.h>
+typedef struct subudb_subu_element subudb_subu_element;
+int subudb_Masteru_Subu_get_subus(sqlite3 *db,char *masteru_name,subudb_subu_element **sa_pt,subudb_subu_element **sa_end_pt);
+struct subudb_subu_element {
+  char *subuname;
+  char *subu_username;
+};
+#include <stdbool.h>
+#include <errno.h>
+#define SUBU_ERR_DB_FILE 8
+extern char DB_File[];
+#define SUBU_ERR_ARG_CNT 1
index 1c854b3..2a9e9b7 100644 (file)
@@ -2,12 +2,19 @@
 #undef INTERFACE
 #include <sqlite3.h>
 int subudb_Masteru_Subu_rm(sqlite3 *db,char *masteru_name,char *subuname,char *subu_username);
-int subudb_Masteru_Subu_get(sqlite3 *db,char *masteru_name,char *subuname,char **subu_username);
+typedef struct subudb_subu_element subudb_subu_element;
+int subudb_Masteru_Subu_get_subus(sqlite3 *db,char *masteru_name,subudb_subu_element **sa_pt,subudb_subu_element **sa_end_pt);
+void subu_element_free(subudb_subu_element *base,subudb_subu_element *end_pt);
+struct subudb_subu_element {
+  char *subuname;
+  char *subu_username;
+};
+int subudb_Masteru_Subu_get_subu_username(sqlite3 *db,char *masteru_name,char *subuname,char **subu_username);
 int subudb_Masteru_Subu_put(sqlite3 *db,char *masteru_name,char *subuname,char *subu_username);
-int subudb_number_rm(sqlite3 *db,char *masteru_name);
-int subudb_number_set(sqlite3 *db,char *masteru_name,int n);
-int subudb_number_get(sqlite3 *db,char *masteru_name,int *n);
-int subudb_number_init(sqlite3 *db,char *masteru_name,int n);
+int subudb_number_set(sqlite3 *db,int n);
+int subudb_number_get(sqlite3 *db,int *n);
+typedef unsigned int uint;
+extern uint First_Max_Subunumber;
 int subudb_schema(sqlite3 *db);
 int db_rollback(sqlite3 *db);
 int db_commit(sqlite3 *db);
index c16155b..5ab5990 100755 (executable)
@@ -14,7 +14,8 @@ SCRATCHDIR= 5_scratch # clean and others put things here
 CC=gcc
 CFLAGS=-std=gnu11 -fPIC -I. -ggdb -Werror -DDEBUG -DDEBUGDB 
 #CFLAGS=-std=gnu11 -fPIC -I. -Werror
-LIB=2_lib/libsubu.a
+LIBDIR=2_lib/
+LIB=$(LIBDIR)libsubu.a
 LINKFLAGS=-L2_lib -lsubu -lsqlite3
 
 #these are the source files that exist
@@ -150,9 +151,9 @@ dist-clean:
        @echo '---- make $@:------------------------------------------------------------'
        @echo `pwd`'>' 
        make clean
-       if [ -d $(APPLICATION) ]; then cd $(APPLICATION); make clean; fi
-       if [ -d 1_tests ]; then cd 1_tests; make dist_clean; fi
-       if [ -d 1_try ] ; then cd 1_try; make dist_clean; fi
+#      if [ -d $(APPLICATION) ]; then cd $(APPLICATION); make clean; fi
+#      if [ -d 1_tests ]; then cd 1_tests; make dist_clean; fi
+#      if [ -d 1_try ] ; then cd 1_try; make dist_clean; fi
        @echo '______end make $@_____'
 
 #
index 9712f42..67160e0 100644 (file)
@@ -121,7 +121,8 @@ void subu_err(char *fname, int err, char *mess){
     perror(fname);
     break;
   case SUBU_ERR_DB_FILE:
-    fprintf(stderr, "db file error: %s", DB_File); // DB_File is in common
+    fprintf(stderr, "error on %s", DB_File); // DB_File is in common
+    fprintf(stderr, ": %s", mess);
     break;
   case SUBU_ERR_MASTERU_HOMELESS:
     fprintf(stderr,"Masteru, \"%s\", has no home directory", mess);
@@ -208,7 +209,19 @@ static int masteru_rmdir_subuhome(void *arg){
 //--------------------------------------------------------------------------------
 // build strings 
 //
-static int mk_subu_user(char **mess, sqlite3 *db, char *masteru_name, int n, char **subu_username){
+static int mk_subu_username(char **mess, sqlite3 *db, char **subu_username){
+  int rc,n;
+  db_begin(db);
+  if(
+    (rc = subudb_number_get(db, &n))
+    ||
+    (rc = subudb_number_set(db, ++n))
+     ){
+    db_rollback(db);
+    return SUBU_ERR_DB_FILE;
+  }
+  db_commit(db);
+
   size_t len = 0;
   FILE* name_stream = open_memstream(subu_username, &len);
   fprintf(name_stream, "s%d", n);
@@ -288,45 +301,15 @@ int subu_mk_0(char **mess, sqlite3 *db, char *subuname){
   }
 
   //--------------------------------------------------------------------------------
-  // lookup the masteru name
   char *masteru_name = 0;
   char *masteru_home = 0;
-  rc = mk_masteru_name(masteru_uid, &masteru_name, &masteru_home);
-  if(rc) return rc;
-  #ifdef DEBUG
-  dbprintf("masteru_name: \"%s\"\n", masteru_name);
-  #endif
-
-  db_begin(db);
-  int n;
-  rc = subudb_number_get(db, masteru_name, &n);
-  if( rc == SQLITE_OK ){
-    n++;
-    rc = subudb_number_set(db, masteru_name, n);
-    if( rc != SQLITE_OK ){
-      db_rollback(db);
-      return SUBU_ERR_DB_FILE;
-    }
-  }else{ // perhaps this masteru's first subu, so we will try init
-    n = First_Max_Subunumber;
-    rc = subudb_number_init(db, masteru_name, n);
-    if( rc != SQLITE_OK ){
-      db_rollback(db);
-      return SUBU_ERR_DB_FILE;
-    }
-  }
-  db_commit(db);
-  #ifdef DEBUG
-  dbprintf("masteru max subunumber: %d\n", n);
-  #endif
-
-  //--------------------------------------------------------------------------------
-  // subu details
   char *subu_username = 0;
   char *subuland = 0;
   char *subuhome = 0; // the name of the directory to put in subuland, not subu_user home dir
   rc =
-    mk_subu_user(mess, db, masteru_name, n, &subu_username)
+    mk_masteru_name(masteru_uid, &masteru_name, &masteru_home)
+    ||
+    mk_subu_username(mess, db, &subu_username)
     ||
     mk_subuland(masteru_home, &subuland)
     ||
@@ -416,7 +399,7 @@ int subu_mk_0(char **mess, sqlite3 *db, char *subuname){
   #endif
   {
     int rc = subudb_Masteru_Subu_put(db, masteru_name, subuname, subu_username);
-    if( rc != SQLITE_DONE ){
+    if( rc != SQLITE_OK ){
       if(mess)*mess = strdup("insert of masteru subu relation failed");
       RETURN(SUBU_ERR_DB_FILE);
     }
@@ -463,6 +446,7 @@ int subu_rm_0(char **mess, sqlite3 *db, char *subuname){
   char *masteru_home = 0;
   char *subuland = 0;
   char *subuhome = 0; // the name of the directory to put in subuland, not subu_user home dir
+  char *subu_username = 0;
   rc =
     mk_masteru_name(masteru_uid, &masteru_name, &masteru_home)
     ||
@@ -480,12 +464,11 @@ int subu_rm_0(char **mess, sqlite3 *db, char *subuname){
 
   db_begin(db);
 
-  char *subu_username = 0;
   rc = subudb_Masteru_Subu_get_subu_username(db, masteru_name, subuname, &subu_username);
   if( rc != SQLITE_OK ){
     if(mess) *mess = strdup("subu requested for removal not found under this masteru in db file");
     rc = SUBU_ERR_SUBU_NOT_FOUND;
-    db_rollback();
+    db_rollback(db);
     RETURN(rc);
   }
   #ifdef DEBUG
@@ -495,7 +478,7 @@ int subu_rm_0(char **mess, sqlite3 *db, char *subuname){
   rc = subudb_Masteru_Subu_rm(db, masteru_name, subuname, subu_username);
   if( rc != SQLITE_OK ){
     if(mess)*mess = strdup("removal of masteru subu relation failed");
-    db_rollback();
+    db_rollback(db);
     RETURN(SUBU_ERR_DB_FILE);
   }
   #ifdef DEBUG
@@ -553,10 +536,11 @@ int subu_rm_0(char **mess, sqlite3 *db, char *subuname){
       }
     #endif
     char *command = "/usr/sbin/userdel";
-    char *argv[3];
+    char *argv[4];
     argv[0] = command;
     argv[1] = subu_username;
-    argv[2] = (char *) NULL;
+    argv[2] = "-r";  
+    argv[3] = (char *) NULL;
     char *envp[1];
     envp[0] = (char *) NULL;
     int dispatch_err = dispatch_exec(argv, envp);
index 429c98e..714c7e4 100644 (file)
@@ -11,10 +11,13 @@ int main(){
     fprintf(stderr, "error exit, could not open db file \"%s\"\n", DB_File);
     return SUBU_ERR_DB_FILE;
   }
+  db_begin(db);
   if( subudb_schema(db) != SQLITE_OK ){
+    db_rollback(db);
     fprintf(stderr, "error exit, opened db file but could not build schema\n");
     return SUBU_ERR_DB_FILE;
   }
+  db_commit(db);
   if( sqlite3_close(db) != SQLITE_OK ){
     fprintf(stderr, "error exit, could not close the db\n");
     return SUBU_ERR_DB_FILE;
index 265e7e9..60304e3 100644 (file)
@@ -9,11 +9,10 @@ Set or get a new maximum subu number. Currently doesn't do the setting part.
 
 int main(int argc, char **argv){
 
-  if( argc < 2 || argc > 3){
-    fprintf(stderr, "usage: %s masteru_name [n]\n",argv[0]);
+  if( argc < 1 || argc > 2){
+    fprintf(stderr, "usage: %s [n]\n",argv[0]);
     return SUBU_ERR_ARG_CNT;
   }
-  char *masteru_name = argv[1];
 
   int rc;
   sqlite3 *db;
@@ -24,9 +23,9 @@ int main(int argc, char **argv){
     return SUBU_ERR_DB_FILE;
   }
 
-  // then arg[2] holds a number to set the max to
-  if(argc == 3){ 
-    long int i = strtol(argv[2], NULL, 10);
+  // then arg[1] holds a number to set the max to
+  if(argc == 2){ 
+    long int i = strtol(argv[1], NULL, 10);
     if( i < 0 ){
       fprintf(stderr, "n must be positive\n");
       sqlite3_close(db);
@@ -37,17 +36,20 @@ int main(int argc, char **argv){
       sqlite3_close(db);
       return SUBU_ERR_N;
     }
-    int n = i;
-    subudb_number_set(db, masteru_name, n);
+    rc = subudb_number_set(db, i);
+    if( rc != SQLITE_OK ){
+      fprintf(stderr, "couldn't set Max_Subunumber: %s\n", sqlite3_errmsg(db));
+      return SUBU_ERR_N;
+    }
   }
 
   // read and print the current max
   int n;
-  rc = subudb_number_get(db, masteru_name, &n);
-  if( rc == SQLITE_DONE ){
+  rc = subudb_number_get(db, &n);
+  if( rc == SQLITE_OK ){
     printf("%d\n", n);
   }else{
-    fprintf(stderr, "lookup failed %s\n", sqlite3_errmsg(db));
+    fprintf(stderr, "couldn't get Max_Subunumber: %s\n", sqlite3_errmsg(db));
     sqlite3_close(db);
     return SUBU_ERR_DB_FILE;
   }
index f679d24..b19896e 100644 (file)
@@ -25,10 +25,9 @@ int main(int argc, char **argv){
     }}
 
   int ret = subudb_Masteru_Subu_put(db, masteru_name, subuname, subu_username);
-  if( ret != SQLITE_DONE ){
+  if( ret != SQLITE_OK ){
     fprintf(stderr, "subudb_Masteru_Subu_put indicates failure by returning %d\n",ret);
     fprintf(stderr, "sqlite3 issues message, %s\n", sqlite3_errmsg(db));
-    printf("put failed\n");
     return SUBU_ERR_DB_FILE;
   }
   ret = sqlite3_close(db);
diff --git a/src/subudb-subus.cli.c b/src/subudb-subus.cli.c
new file mode 100644 (file)
index 0000000..a5c84a0
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+Set or get a new maximum subu number. Currently doesn't do the setting part.
+
+*/
+#include "subudb-subus.cli.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <limits.h>
+
+int main(int argc, char **argv){
+
+  if( argc != 2){
+    fprintf(stderr, "usage: %s masteru_name\n",argv[0]);
+    return SUBU_ERR_ARG_CNT;
+  }
+  char *masteru_name = argv[1];
+
+  int rc;
+  sqlite3 *db;
+  rc = sqlite3_open_v2(DB_File, &db, SQLITE_OPEN_READWRITE, NULL);
+  if( rc != SQLITE_OK ){
+    fprintf(stderr, "error exit, could not open db file\n");
+    sqlite3_close(db);
+    return SUBU_ERR_DB_FILE;
+  }
+
+  subudb_subu_element *sa;
+  subudb_subu_element *sa_end;
+  rc = subudb_Masteru_Subu_get_subus(db, masteru_name, &sa, &sa_end);
+  if( rc == SQLITE_OK ){
+    subudb_subu_element *pt = sa;
+    while( pt != sa_end ){
+      printf("%s\n", *pt);
+    pt++;
+    }
+    rc = sqlite3_close(db);
+    if( rc != SQLITE_OK ){
+      fprintf(stderr, "when closing db, %s\n", sqlite3_errmsg(db));
+      return SUBU_ERR_DB_FILE;
+    }    
+    return 0;
+  }
+  fprintf(stderr, "lookup failed %s\n", sqlite3_errmsg(db));
+  sqlite3_close(db);
+  return SUBU_ERR_DB_FILE;
+
+}
index e4e492a..e37c67d 100644 (file)
@@ -20,6 +20,7 @@ Each of these returns SQLITE_OK upon success
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
+#include <stdbool.h>
 
 //--------------------------------------------------------------------------------
 // sqlite transactions don't nest.  There is a way to use save points, but still
@@ -37,72 +38,60 @@ int db_rollback(sqlite3 *db){
 
 //--------------------------------------------------------------------------------
 int subudb_schema(sqlite3 *db){
-  char sql[] = 
-    "CREATE TABLE Masteru_Subu(masteru_name TEXT, subuname TEXT, subu_username TEXT);"
-    "CREATE TABLE Masteru_Max(masteru_name TEXT, max_subu_number INT);"
-    ;
-  return sqlite3_exec(db, sql, NULL, NULL, NULL);
-}
-
-//--------------------------------------------------------------------------------
-int subudb_number_init(sqlite3 *db, char *masteru_name, int n){
   int rc;
-  char *sql = "INSERT INTO Masteru_Max (masteru_name, max_subu_number) VALUES (?1, ?2);";
-  sqlite3_stmt *stmt;
-  sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
-  sqlite3_bind_text(stmt, 1, masteru_name, -1, SQLITE_STATIC);
-  sqlite3_bind_int(stmt, 2, n);
-  rc = sqlite3_step(stmt);
-  sqlite3_finalize(stmt);
-  if( rc == SQLITE_DONE ) return SQLITE_OK;
-  return rc;
+
+  { // build tables
+    char sql[] = 
+      "CREATE TABLE Masteru_Subu(masteru_name TEXT, subuname TEXT, subu_username TEXT);"
+      "CREATE TABLE Attribute_Int(attribute TEXT, value INT);"
+      ;
+    rc = sqlite3_exec(db, sql, NULL, NULL, NULL);
+    if(rc != SQLITE_OK) return rc;
+  }
+
+  { // data initialization
+    char *sql = "INSERT INTO Attribute_Int (attribute, value) VALUES ('Max_Subunumber', ?1);";
+    sqlite3_stmt *stmt;
+    sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
+    sqlite3_bind_int(stmt, 1, First_Max_Subunumber);
+    rc = sqlite3_step(stmt);
+    sqlite3_finalize(stmt);
+    if( rc != SQLITE_DONE ) return rc;
+  }
+
+  return SQLITE_OK;
 }
 
-int subudb_number_get(sqlite3 *db, char *masteru_name, int *n){
-  char *sql = "SELECT max_subu_number FROM Masteru_Max WHERE masteru_name = ?1;";
+//--------------------------------------------------------------------------------
+int subudb_number_get(sqlite3 *db, int *n){
+  char *sql = "SELECT value FROM Attribute_Int WHERE attribute = 'Max_Subunumber';";
   sqlite3_stmt *stmt;
   sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
-  sqlite3_bind_text(stmt, 1, masteru_name, -1, SQLITE_STATIC);
   int rc = sqlite3_step(stmt);
   if( rc == SQLITE_ROW ){
     *n = sqlite3_column_int(stmt,0);
     rc = sqlite3_step(stmt);
     sqlite3_finalize(stmt);
-    if( rc == SQLITE_DONE ) return SQLITE_OK;
-    return rc;
+    if( rc != SQLITE_DONE ) return rc;
+    return SQLITE_OK;
   }
   // should have a message return, suppose
   sqlite3_finalize(stmt);
   return SQLITE_NOTFOUND; 
 }
 
-// on success returns SQLITE_DONE
-int subudb_number_set(sqlite3 *db, char *masteru_name, int n){
+int subudb_number_set(sqlite3 *db, int n){
   int rc;
-  char *sql = "UPDATE Masteru_Max SET max_subu_number = ?1 WHERE masteru_name = ?2;";
+  char *sql = "UPDATE Attribute_Int SET value = ?1 WHERE attribute = 'Max_Subunumber';";
   sqlite3_stmt *stmt;
   sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
   sqlite3_bind_int(stmt, 1, n);
-  sqlite3_bind_text(stmt, 2, masteru_name, -1, SQLITE_STATIC);
   rc = sqlite3_step(stmt);
   sqlite3_finalize(stmt);
   if( rc == SQLITE_DONE ) return SQLITE_OK;
   return rc;
 }
 
-// returns SQLITE_DONE or an error code
-// removes masteru/max_number relation from table
-int subudb_number_rm(sqlite3 *db, char *masteru_name){
-  char *sql = "DELETE FROM Masteru_Max WHERE masteru_name = ?1;";
-  sqlite3_stmt *stmt;
-  sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
-  sqlite3_bind_text(stmt, 1, masteru_name, -1, SQLITE_STATIC);
-  int rc = sqlite3_step(stmt);
-  sqlite3_finalize(stmt);
-  if( rc == SQLITE_DONE ) return SQLITE_OK;
-  return rc;
-}
-
 //--------------------------------------------------------------------------------
 // put relation into Masteru_Subu table
 int subudb_Masteru_Subu_put(sqlite3 *db, char *masteru_name, char *subuname, char *subu_username){
@@ -114,6 +103,7 @@ int subudb_Masteru_Subu_put(sqlite3 *db, char *masteru_name, char *subuname, cha
   sqlite3_bind_text(stmt, 3, subu_username, -1, SQLITE_STATIC);
   int rc = sqlite3_step(stmt);
   sqlite3_finalize(stmt);
+  if( rc == SQLITE_DONE ) return SQLITE_OK;
   return rc;
 }
 
@@ -136,7 +126,7 @@ int subudb_Masteru_Subu_get_subu_username(sqlite3 *db, char *masteru_name, char
     return rc; // woops this needs to return an error!,  be sure it is not SQLITE_DONE
   }
   rc = sqlite3_step(stmt);
-  sqlite3_finalize(stmt);
+  if( rc == SQLITE_DONE ) return SQLITE_OK;
   return rc;
 }
 
@@ -151,41 +141,43 @@ static void expand(void **base, void **pt, size_t *s){
   free(base);
   *base = new_base;
   *pt = new_base + offset;
-  s = new_s;
+  *s = new_s;
 }
 static bool off_alloc(void *base, void *pt, size_t s){
   return pt == base + s;
 }
 
 // we return and array of subudb_subu_info
-struct subudb_subu_info{
+#if INTERFACE
+struct subudb_subu_element{
   char *subuname;
   char *subu_username;
 };
-static void subu_info_alloc(subudb_subu_info **base, size_t *s){
-  *s = 4 * sizeof(subudb_subu_info);
-  *base = malloc(s)
+#endif
+static void subu_element_alloc(subudb_subu_element **base, size_t *s){
+  *s = 4 * sizeof(subudb_subu_element);
+  *base = malloc(*s);
 }
-static void subu_info_free(subudb_subu_info *base, subu_db_subu_info *end_pt){
-  subudb_subu_info *pt = base;
+void subu_element_free(subudb_subu_element *base, subudb_subu_element *end_pt){
+  subudb_subu_element *pt = base;
   while( pt != end_pt ){
-    pt->free(subuname);
-    pt->free(subu_username);
+    free(pt->subuname);
+    free(pt->subu_username);
   pt++;
   }
   free(base);  
 }
 
-int subudb_Masteru_Subu_get_subu_info
+int subudb_Masteru_Subu_get_subus
 (
  sqlite3 *db,
  char *masteru_name,
- subudb_subu_info **si,
- subudb_subu_info **si_end
+ subudb_subu_element **sa_pt,
+ subudb_subu_element **sa_end_pt
 ){
   char *sql = "SELECT subuname, subu_username"
-              "FROM Masteru_Subu"
-              "WHERE masteru_name = ?1;";
+              " FROM Masteru_Subu"
+              " WHERE masteru_name = ?1;";
   size_t sql_len = strlen(sql);
   sqlite3_stmt *stmt;
   int rc;
@@ -193,13 +185,13 @@ int subudb_Masteru_Subu_get_subu_info
   if( rc != SQLITE_OK ) return rc;
   sqlite3_bind_text(stmt, 1, masteru_name, strlen(masteru_name), SQLITE_STATIC);
 
-  size_t subu_info_size;
-  subudb_subu_info *subu_info;
-  subu_info_alloc(&subu_info, &subu_info_size);
-  subudb_subu_info *pt = subu_info;
+  size_t subu_element_size;
+  subudb_subu_element *subu_element;
+  subu_element_alloc(&subu_element, &subu_element_size);
+  subudb_subu_element *pt = subu_element;
   rc = sqlite3_step(stmt);
   while( rc == SQLITE_ROW ){
-    if( off_alloc(subu_info, pt) ) expand(&subu_info, &pt, &subu_info_size);
+    if( off_alloc(subu_element, pt, subu_element_size) ) expand((void **)&subu_element, (void **)&pt, &subu_element_size);
     pt->subuname = strdup(sqlite3_column_text(stmt, 0));
     pt->subu_username = strdup(sqlite3_column_text(stmt, 1));
   rc = sqlite3_step(stmt);
@@ -209,9 +201,9 @@ int subudb_Masteru_Subu_get_subu_info
   if( rc != SQLITE_DONE ){
     return rc; // woops this needs to return an error!,  be sure it is not SQLITE_DONE
   }
-  *si = subu_info;
-  *si_end = pt;
-  return SQLTIE_OK;
+  *sa_pt = subu_element;
+  *sa_end_pt = pt;
+  return SQLITE_OK;
 }
 
 
@@ -228,5 +220,6 @@ int subudb_Masteru_Subu_rm(sqlite3 *db, char *masteru_name, char *subuname, char
   sqlite3_bind_text(stmt, 3, subu_username, -1, SQLITE_STATIC);
   rc = sqlite3_step(stmt);
   sqlite3_finalize(stmt);
+  if( rc == SQLITE_DONE ) return SQLITE_OK;
   return rc;
 }
index c2f2e02..9355724 100755 (executable)
@@ -1,5 +1,5 @@
 #!/bin/bash
 set -x
-make dist_clean
+make dist-clean
 git add "$@"