Right now I am working on some software to educate public speakers. One of the requirements for the software is that it records and stores data gathered in real time during a talk and be able to be accessed later for playback and data analysis. This data needs to be managed in such a way that I can easily search through it given a few tags and pull the corresponding information.
I’m developing in a program called TouchDesigner which uses python 3. In TouchDesigner COMP objects are easily extended using python classes so this is where I will start. Matthew Ragan (https://matthewragan.com) has a tremendously helpful tutorial on ‘Understanding Extensions’ here.
I will post the full code here with some comment but to see it in action download the file on Github: https://github.com/raganmd/TD-Examples/tree/master/shelanskey/Data_Management
import os import string import random import json class DB: def __init__(self): '''Initializes records cache if nothing exists. Looks in current filepath for a DB collection and creates one if it doesn't exist. Preloads DB with json metadata. Args: self: self Output: ''' self.filepath = parent().par.Path + '/db' #grab path from parents custom parameters if not os.path.isdir(self.filepath): #check to see if that path exists os.makedirs(self.filepath) #make new directory if it doesn't f = open(self.filepath+'/cache.txt', "w") #create a file called cache jsonPrescriptData = {} jsonPrescriptData['meta'] = "DB Record Cache" jsonPrescriptData['records'] = [] f.write(json.dumps(jsonPrescriptData)) #load it with metadata f.close() print('> New Database created at: ' + self.filepath) else: print('> Mounting Database at: '+ self.filepath) print("|\n| Number of records: "+ str( len(json.loads(self.unpack())['records'])) ) return def Insert(self, dict): '''Inserts key and name with pointer to folder holding content Args: self: self dict: A dict that is to be inserted into cache Output: returns path to new folder ''' mypath = self.filepath key = self.keygen() #create unique key newFolder = mypath + '/records/' + key if not os.path.isdir(newFolder): #check if it exists os.makedirs(newFolder) #create new dict['Key'] = key #pack cache record with directory name self.pack(dict) print("> Successfully created record!") print("|\n| Unique Identifier: " +key) print("| Record data: \n"+ json.dumps(dict, sort_keys=True, indent=4, separators=(',', ': '))) return newFolder def Query(self, query): '''Queries cache for records that match search parameters Args: self: self query: a dict that is used to lookup and match cache data { "Name": "Ian", "Age": 24 } Output: prints query results. ''' cache = json.loads(self.unpack()) for key in list(query.keys()): data = query[key] cache["records"] = [item for item in cache["records"] if key in item and item[key] == data] print("Query Results: \n" + json.dumps(cache, sort_keys=True, indent=4, separators=(',', ': '))) return def Delete(self): return def pack(self, dict): ''' Packs Json DB Item ''' f = open(self.filepath+'/cache.txt', 'r') cache = json.loads(f.read()) f.close() cache['records'].append(dict) f = open(self.filepath+'/cache.txt', 'w') f.write(json.dumps(cache, sort_keys=True, indent=4, separators=(',', ': '))) f.close() return def unpack(self): ''' Unpacks Json DB Item ''' f = open(self.filepath+'/cache.txt', 'r') data = f.read() f.close() return data def keygen(self, size=6, chars=string.ascii_uppercase + string.digits): ''' Generates key for folder. ''' return ''.join(random.choice(chars) for _ in range(size))