-
Notifications
You must be signed in to change notification settings - Fork 0
/
SPDataManagerCreateDbase.py
157 lines (146 loc) · 6.86 KB
/
SPDataManagerCreateDbase.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
# -*- coding: utf-8 -*-
# Copyright (c) 2007-2010 Stas Zykiewicz <[email protected]>
#
# SPDataManagerCreateDbase.py
# This program is free software; you can redistribute it and/or
# modify it under the terms of version 3 of the GNU General Public License
# as published by the Free Software Foundation. A copy of this license should
# be included in the file GPL-3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Library General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#create logger, logger was configured in SPLogging
import os
import logging
module_logger = logging.getLogger("childsplay.SPDataManagerCreateDbase")
from SPConstants import ACTIVITYDATADIR, DBASE, HOMEDIR, WHICHDBASE, CONTENTDBASE
from utils import MyError, read_rcfile
try:
import sqlalchemy as sqla
import sqlalchemy.orm as sqlorm
except ImportError:
module_logger.exception("No sqlalchemy package found")
raise MyError
else:
if sqla.__version__ < '0.5':
module_logger.error("Found sqlalchemy version %s" % sqla.__version__)
module_logger.error("Your version of sqlalchemy is to old, please upgrade to version >= 0.4")
raise MyError
module_logger.debug("using sqlalchemy %s" % sqla.__version__)
try:
import sqlalchemy.exceptions as sqlae
except ImportError:
from sqlalchemy import exc as sqlae
import SQLTables
import SPORMs
# determine which dbase to use, we support mySQL and SQLite
USEMYSQL = False
USESQLITE = False
rc_hash = ''
if WHICHDBASE == 'mysql':
try:
import MySQLdb, _mysql_exceptions
except ImportError:
module_logger.exception("No MySQLdb package found which is needed by sqlalchemy")
module_logger.error("The WHICHDBASE constant is set in SPConstants to 'mysql'")
raise MyError
else:
module_logger.info("Using mySQL for the user dbase")
USEMYSQL = True
# suppress warnings from MySQLdb which seems to use Python warnings iso exceptions
import warnings
warnings.filterwarnings("ignore")
try:
import db_conf as dbrc
rckind = 'db_conf'
except ImportError:
import db_dev as dbrc
rckind = 'db_dev'
rc_hash = dbrc.rc
if rc_hash['default']['production']:
kind = 'production'
else:
kind = 'develop'
rc_hash['kind'] = kind
rc_hash['path'] = rckind
else:
module_logger.info("Using SQLite for the user dbase")
USESQLITE = True
class DbaseMaker:
def __init__(self, theme, debug_sql=False):
self.logger = logging.getLogger("childsplay.SPDataManagerCreateDbase.DbaseMaker")
self.logger.debug("Starting")
self.usersdbasepath= os.path.join(HOMEDIR, theme, DBASE)
self.contentdbasepath = os.path.join(HOMEDIR, theme, CONTENTDBASE)
# We could also use a mysql dbase, local or remote
try:
##### start userdb stuff ########
if USESQLITE:
self.logger.debug("Starting SQLite users dbase, %s" % self.usersdbasepath)
engine = sqla.create_engine('sqlite:///%s' % self.usersdbasepath)
elif USEMYSQL:
self.logger.info("Starting mySQL dbase, %s" % rc_hash['sp_users']['dbasename'])
import MySQLdb, _mysql_exceptions
self.logger.info("Using conffile %s" % rc_hash['path'])
db=MySQLdb.connect(host=rc_hash['sp_users']['host'], \
user=rc_hash['sp_users']['user'], \
passwd=rc_hash['sp_users']['user_pass'])
c = db.cursor()
c.execute('''CREATE DATABASE IF NOT EXISTS %s''' % rc_hash['sp_users']['dbasename'])
db.close()
url = 'mysql://%s:%s@%s/%s' %\
(rc_hash['sp_users']['user'], \
rc_hash['sp_users']['user_pass'], \
rc_hash['sp_users']['host'], \
rc_hash['sp_users']['dbasename'])
engine = sqla.create_engine(url)
else:
self.logger.error("I'm confused about which dbase to use, please check your settings in SPConstants and make sure you have all the dependencies installed")
raise MyError
# The rest is the same for all dbases thanks to sqlalchemy
self.metadata_usersdb = sqla.MetaData(engine)
self.metadata_usersdb.bind.echo = debug_sql
self.sqltb = SQLTables.SqlTables(self.metadata_usersdb)
# returns lookup table to get table objects by name and creates tables
self.orms_userdb = self.sqltb._create_userdb_tables(self.metadata_usersdb)
self.user_engine = engine
self.tables = self.sqltb.tableslist
#self._check_tables_uptodate()
#### end userdb stuff#####
#### start contentdb stuff #####
if USESQLITE:
self.logger.debug("Starting SQLite content dbase, %s" % self.contentdbasepath)
engine = sqla.create_engine('sqlite:///%s' % self.contentdbasepath)
elif USEMYSQL:
engine = sqla.create_engine('mysql://%s:%s@%s/%s' %\
(rc_hash['btp_content']['user'], \
rc_hash['btp_content']['user_pass'], \
rc_hash['btp_content']['host'], \
rc_hash['btp_content']['dbasename']))
self.metadata_contentdb = sqla.MetaData(engine)
self.metadata_contentdb.bind.echo = debug_sql
self.orms_content_db = SQLTables.create_contentdb_orms(self.metadata_contentdb)
self.content_engine = engine
##############################
self.all_orms = {}
self.all_orms.update(self.orms_userdb)
self.all_orms.update(self.orms_content_db)
except (AttributeError, sqlae.SQLAlchemyError) as info:
self.logger.exception("Failed to start the DBase, %s" % info)
raise MyError(info)
def get_engines(self):
return(self.content_engine, self.user_engine)
def get_all_orms(self):
return self.all_orms
def get_orms(self):
return (self.orms_content_db, self.orms_userdb)
def get_metadatas(self):
return (self.metadata_contentdb, self.metadata_usersdb)
def _get_sqltables(self):
return self.sqltb