[darwinbuild-changes] [684] branches/PR-7489777/darwinup

source_changes at macosforge.org source_changes at macosforge.org
Mon Feb 1 10:08:18 PST 2010


Revision: 684
          http://trac.macosforge.org/projects/darwinbuild/changeset/684
Author:   wsiegrist at apple.com
Date:     2010-02-01 10:08:17 -0800 (Mon, 01 Feb 2010)
Log Message:
-----------
Partial implementation of schema creation

Modified Paths:
--------------
    branches/PR-7489777/darwinup/Column.cpp
    branches/PR-7489777/darwinup/Column.h
    branches/PR-7489777/darwinup/Database.cpp
    branches/PR-7489777/darwinup/Database.h
    branches/PR-7489777/darwinup/Table.cpp
    branches/PR-7489777/darwinup/Table.h

Modified: branches/PR-7489777/darwinup/Column.cpp
===================================================================
--- branches/PR-7489777/darwinup/Column.cpp	2010-02-01 17:02:45 UTC (rev 683)
+++ branches/PR-7489777/darwinup/Column.cpp	2010-02-01 18:08:17 UTC (rev 684)
@@ -30,36 +30,41 @@
  * @APPLE_BSD_LICENSE_HEADER_END@
  */
 
+#include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
 #include "Column.h"
 
 Column::Column() {
-	m_name      = strdup("unnamed_column");
-	m_type      = SQLITE_INTEGER;
-	m_is_index  = false;
-	m_is_pk     = false;
-	m_is_unique = false;
+	m_name       = strdup("unnamed_column");
+	m_create_sql = NULL;
+	m_type       = SQLITE_INTEGER;
+	m_is_index   = false;
+	m_is_pk      = false;
+	m_is_unique  = false;
 }
 
 Column::Column(const char* name, uint32_t type) {
-	m_name      = strdup(name);
-	m_type      = type;
-	m_is_index  = false;
-	m_is_pk     = false;
-	m_is_unique = false;
+	m_name       = strdup(name);
+	m_create_sql = NULL;
+	m_type       = type;
+	m_is_index   = false;
+	m_is_pk      = false;
+	m_is_unique  = false;
 }
 
 Column::Column(const char* name, uint32_t type, bool is_index, bool is_pk, bool is_unique) {
-	m_name      = strdup(name);
-	m_type      = type;
-	m_is_index  = is_index;
-	m_is_pk     = is_pk;
-	m_is_unique = is_unique;
+	m_name       = strdup(name);
+	m_create_sql = NULL;
+	m_type       = type;
+	m_is_index   = is_index;
+	m_is_pk      = is_pk;
+	m_is_unique  = is_unique;
 }
 
 Column::~Column() {
 	free(m_name);
+	free(m_create_sql);
 }
 
 const char* Column::name() {
@@ -70,6 +75,23 @@
 	return m_type;
 }
 
+const char* Column::typestr() {
+	switch(m_type) {
+		case SQLITE_INTEGER:
+			return "INTEGER";
+			break;
+		case SQLITE_TEXT:
+			return "TEXT";
+			break;
+		case SQLITE_BLOB:
+			return "BLOB";
+			break;
+		default:
+			fprintf(stderr, "Error: unknown column type: %d \n", m_type);
+			return "UNKNOWN";
+	}
+}
+
 const bool Column::is_index() {
 	return m_is_index;
 }
@@ -82,3 +104,11 @@
 	return m_is_unique;
 }
 
+const char* Column::create() {
+	if (!m_create_sql) {
+		asprintf(&m_create_sql, " %s %s %s %s ", m_name, this->typestr(),
+				(this->is_pk() ? "PRIMARY KEY AUTOINCREMENT" : ""),
+				(this->is_unique() ? "UNIQUE" : ""));
+	}
+	return (const char*)m_create_sql;
+}

Modified: branches/PR-7489777/darwinup/Column.h
===================================================================
--- branches/PR-7489777/darwinup/Column.h	2010-02-01 17:02:45 UTC (rev 683)
+++ branches/PR-7489777/darwinup/Column.h	2010-02-01 18:08:17 UTC (rev 684)
@@ -42,14 +42,17 @@
 	
 	const char*    name();
 	const int      type();
-		
+	const char*    typestr();
+	const char*    create();
+	
 	const bool     is_index();
 	const bool     is_pk();
 	const bool     is_unique();
 	
 protected:
 	char*          m_name;
-	uint32_t       m_type;   // SQLITE_* type definition
+	char*          m_create_sql;
+	uint32_t       m_type; // SQLITE_* type definition
 	bool           m_is_index;
 	bool           m_is_pk;
 	bool           m_is_unique;

Modified: branches/PR-7489777/darwinup/Database.cpp
===================================================================
--- branches/PR-7489777/darwinup/Database.cpp	2010-02-01 17:02:45 UTC (rev 683)
+++ branches/PR-7489777/darwinup/Database.cpp	2010-02-01 18:08:17 UTC (rev 684)
@@ -51,6 +51,9 @@
 	m_tables = (Table**)malloc(sizeof(Table*) * m_table_max);
 	m_db = NULL;		
 	m_path = strdup(path);
+	if (!m_path) {
+		fprintf(stderr, "Error: ran out of memory when constructing database object.\n");
+	}
 }
 
 Database::~Database() {
@@ -62,6 +65,29 @@
 }
 
 
+const char* Database::path() {
+	return m_path;
+}
+
+bool Database::connect() {
+	int res = 0;
+	res = sqlite3_open(m_path, &m_db);
+	if (res) {
+		sqlite3_close(m_db);
+		m_db = NULL;
+		fprintf(stderr, "Error: unable to connect to database at: %s \n", m_path);
+		return false;
+	}	
+	return true;	
+}
+
+bool Database::connect(const char* path) {
+	this->m_path = strdup(path);
+	if (!m_path) fprintf(stderr, "Error: ran out of memory when trying to connect to database.\n");
+	return m_path && this->connect();
+}
+
+
 bool Database::add_table(Table* t) {
 	if (m_table_count >= m_table_max) {
 		m_tables = (Table**)realloc(m_tables, m_table_max * sizeof(Table*) * 4);
@@ -77,36 +103,50 @@
 }
 
 
+
+/**
+ *
+ * Darwinup database abstraction. This class is responsible
+ *  for generating the Table and Column objects that make
+ *  up the darwinup database schema, but the parent handles
+ *  deallocation.
+ *
+ */
 DarwinupDatabase::DarwinupDatabase() {
 	m_path = strdup("");
+	this->init();
 }
 
 DarwinupDatabase::DarwinupDatabase(const char* path) {
 	m_path = strdup(path);
-	
+	this->init();
+}
+
+DarwinupDatabase::~DarwinupDatabase() {
+	// Database (parent) automatically deallocates schema objects
+}
+
+void DarwinupDatabase::init() {
 	Table* archives = new Table("archives");
-	assert(archives->add_column(new Column("serial", SQLITE_INTEGER, false, true, false)));
-	assert(archives->add_column(new Column("uuid", SQLITE_BLOB, true, false, true)));
-	assert(archives->add_column(new Column("name", SQLITE3_TEXT)));
+	//                                                                   index  pk     unique
+	assert(archives->add_column(new Column("serial",     SQLITE_INTEGER, false, true,  false)));
+	assert(archives->add_column(new Column("uuid",       SQLITE_BLOB,    true,  false, true)));
+	assert(archives->add_column(new Column("name",       SQLITE3_TEXT)));
 	assert(archives->add_column(new Column("date_added", SQLITE_INTEGER)));
-	assert(archives->add_column(new Column("active", SQLITE_INTEGER)));
-	assert(archives->add_column(new Column("info", SQLITE_INTEGER)));
+	assert(archives->add_column(new Column("active",     SQLITE_INTEGER)));
+	assert(archives->add_column(new Column("info",       SQLITE_INTEGER)));
 	assert(add_table(archives));
-
+	
 	Table* files = new Table("files");
-	assert(files->add_column(new Column("serial", SQLITE_INTEGER, false, true, false)));
+	//                                                                   index  pk     unique
+	assert(files->add_column(new Column("serial",  SQLITE_INTEGER,       false, true,  false)));
 	assert(files->add_column(new Column("archive", SQLITE_INTEGER)));
-	assert(files->add_column(new Column("info", SQLITE_INTEGER)));
-	assert(files->add_column(new Column("mode", SQLITE_INTEGER)));
-	assert(files->add_column(new Column("uid", SQLITE_INTEGER)));
-	assert(files->add_column(new Column("gid", SQLITE_INTEGER)));
-	assert(files->add_column(new Column("size", SQLITE_INTEGER)));
-	assert(files->add_column(new Column("digest", SQLITE_BLOB)));
-	assert(files->add_column(new Column("path", SQLITE3_TEXT)));
-	assert(add_table(files));
+	assert(files->add_column(new Column("info",    SQLITE_INTEGER)));
+	assert(files->add_column(new Column("mode",    SQLITE_INTEGER)));
+	assert(files->add_column(new Column("uid",     SQLITE_INTEGER)));
+	assert(files->add_column(new Column("gid",     SQLITE_INTEGER)));
+	assert(files->add_column(new Column("size",    SQLITE_INTEGER)));
+	assert(files->add_column(new Column("digest",  SQLITE_BLOB)));
+	assert(files->add_column(new Column("path",    SQLITE3_TEXT)));
+	assert(add_table(files));	
 }
-
-DarwinupDatabase::~DarwinupDatabase() {
-}
-
-

Modified: branches/PR-7489777/darwinup/Database.h
===================================================================
--- branches/PR-7489777/darwinup/Database.h	2010-02-01 17:02:45 UTC (rev 683)
+++ branches/PR-7489777/darwinup/Database.h	2010-02-01 18:08:17 UTC (rev 684)
@@ -45,6 +45,7 @@
 	virtual ~Database();
 
 	const char* path();
+	bool connect();
 	bool connect(const char* path);
 	
 	const char* get_value(const char* table, const char* column, const char* where);
@@ -76,17 +77,20 @@
 
 };
 
+
+
 /**
  *
  * Darwinup database abstraction. This class is responsible
  *  for generating the Table and Column objects that make
- *  up the darwinup database schema. 
+ *  up the darwinup database schema, but the parent handles
+ *  deallocation. 
  *
  */
 struct DarwinupDatabase : Database {
 	DarwinupDatabase();
 	DarwinupDatabase(const char* path);
 	virtual ~DarwinupDatabase();
-	
+	void init();
 };
 

Modified: branches/PR-7489777/darwinup/Table.cpp
===================================================================
--- branches/PR-7489777/darwinup/Table.cpp	2010-02-01 17:02:45 UTC (rev 683)
+++ branches/PR-7489777/darwinup/Table.cpp	2010-02-01 18:08:17 UTC (rev 684)
@@ -41,6 +41,7 @@
 	m_column_count  = 0;
 	m_columns       = (Column**)malloc(sizeof(Column*) * m_column_max);
 	m_name          = strdup("unnamed_table");
+	m_create_sql    = NULL;
 }
 
 Table::Table(const char* name) {
@@ -48,6 +49,7 @@
 	m_column_count  = 0;
 	m_columns       = (Column**)malloc(sizeof(Column*) * m_column_max);
 	m_name          = strdup(name);
+	m_create_sql    = NULL;
 }
 
 Table::~Table() {
@@ -56,9 +58,19 @@
 	}
 	free(m_columns);
 	free(m_name);
+	free(m_create_sql);
 }
 
 
+const char* Table::name() {
+	return m_name;
+}
+
+const Column** Table::columns() {
+	return (const Column**)m_columns;
+}
+
+
 bool Table::add_column(Column* c) {
 	if (m_column_count >= m_column_max) {
 		m_columns = (Column**)realloc(m_columns, m_column_max * sizeof(Column*) * 4);
@@ -73,3 +85,27 @@
 	return true;
 }
 
+
+const char* Table::create() {
+	if (!m_create_sql) {
+		// get creation sql for each column
+		const char* cols[m_column_count];
+		const char* indexes[m_column_count];
+		for (uint32_t i=0; i<m_column_count; i++) {
+			cols[i] = m_columns[i]->create();
+			// get creation sql for any indexes
+			if (m_columns[i]->is_index()) {
+				indexes[i] = m_columns[i]->create();
+			} else {
+				indexes[i] = NULL;
+			}			
+		}
+
+		asprintf(&m_create_sql, "CREATE TABLE %s ( );", m_name);
+	}
+	
+	return m_create_sql;
+}
+
+
+

Modified: branches/PR-7489777/darwinup/Table.h
===================================================================
--- branches/PR-7489777/darwinup/Table.h	2010-02-01 17:02:45 UTC (rev 683)
+++ branches/PR-7489777/darwinup/Table.h	2010-02-01 18:08:17 UTC (rev 684)
@@ -41,6 +41,7 @@
 	
 	const char*    name();
 	const Column** columns();
+	bool           add_column(Column*);
 	
 	// return SQL statements for this table
 	const char*    create();  
@@ -51,14 +52,12 @@
 	const char*    update(const char* set, const char* where, uint32_t &count);
 	const char*    del(const char* where, uint32_t &count);
 	const char*    insert(const char* columns, const char* values);
-	
-	bool           add_column(Column*);
-	
-protected:
-	
 
 	
+protected:
+		
 	char*          m_name;
+	char*          m_create_sql;
 	Column**       m_columns;
 	uint32_t       m_column_count;
 	uint32_t       m_column_max;
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/darwinbuild-changes/attachments/20100201/25db258d/attachment-0001.html>


More information about the darwinbuild-changes mailing list