コード例 #1
0
ファイル: MssqlConnector.py プロジェクト: raghu999/noora
    def execute(self, executable, properties):
        script = executable['script']

        cp = Properties()
        cp.set_property('database', executable['database'])
        if 'schema' in executable.keys():
            cp.set_property('schema', executable['schema'])
        if 'environment' in properties.keys():
            cp.set_property('environment',
                            properties.get_property('environment'))
        if 'previous' in properties.keys():
            cp.set_property('previous', properties.get_property('previous'))

        stream = PreProcessor.parse(script, cp)

        tmp = File("tmp.sql")
        f = open(tmp.get_url(), 'w')
        f.write(stream)
        f.close()

        #script_reader = open(tmp.get_url())

        feedback = File('feedback.log')
        feedback_writer = open(feedback.get_url(), 'w')
        statement = "sqlcmd -b -S " + executable['host'] + " -U " + executable[
            'username'] + ' -P ' + executable['password'] + " -d " + executable[
                'database'] + " -i " + tmp.get_url()

        call = CallFactory.new_call(statement)
        call['stdout'] = feedback_writer
        call['stderr'] = feedback_writer
        result = Shell.execute(call)
        self.set_result(result)
コード例 #2
0
ファイル: MysqlConnector.py プロジェクト: raghu999/noora
    def execute(self, executable, properties):
        script = executable['script']

        cp = Properties()
        cp.set_property('database', executable['database'])

        if 'environment' in properties.keys():
            cp.set_property('environment',
                            properties.get_property('environment'))
        if 'previous' in properties.keys():
            cp.set_property('previous', properties.get_property('previous'))

        stream = PreProcessor.parse(script, cp)

        tmp = File("tmp.sql")
        f = open(tmp.get_url(), 'w')
        f.write(stream)
        f.close()

        script_reader = open(tmp.get_url())

        feedback = File('feedback.log')
        feedback_writer = open(feedback.get_url(), 'w')

        statement = "mysql --show-warnings --host=" + executable[
            'host'] + " --user="******" --password="******" " + executable['database']
        call = CallFactory.new_call(statement)
        call['stdin'] = script_reader
        call['stdout'] = feedback_writer
        call['stderr'] = feedback_writer
        result = Shell.execute(call)
        self.set_result(result)
コード例 #3
0
ファイル: TestShell.py プロジェクト: raghu999/noora
    def testCheckVersion(self):
        script = File("checkversion.sql")

        properties = Properties()
        properties.set_property('name', 'app_prop')
        properties.set_property('previous', '1.0.0')

        stream = PreProcessor.parse(script, properties)
        tmp = File("tmp.sql")
        f = open(tmp.get_url(), 'w')
        f.write(stream)
        f.close()

        script_reader = open(tmp.get_url())

        feedback = File('feedback.log')
        feedback_writer = open(feedback.get_url(), 'w')

        statement = "mysql --show-warnings --host=localhost --user=apps --password=apps acme"
        call = CallFactory.new_call(statement)
        call['stdin'] = script_reader
        call['stdout'] = feedback_writer
        call['stderr'] = feedback_writer
        result = Shell.execute(call)
        print "result", result
コード例 #4
0
ファイル: MssqlConnector.py プロジェクト: wlongxiang/noora
    def execute(self, executable, properties):
        """
        Execute the script provided by `executable` on the target server.

        :type executable: dict
        :param executable: Should contain the following keys and values:

            * **host**: The address of the server to connect to;
            * **port**: Server port to connect to;
            * **database**: The database name;
            * **schema**: The schema to use;
            * **username**: Database username;
            * **password**: Database user password;
            * **script**: Path to the script to execute.
        :type properties: noora.system.Properties.Properties
        :param properties: A Noora project properties instance
        """
        script = executable['script']

        cp = dict()
        cp['database'] = executable['database']
        if 'schema' in executable.keys():
            cp['schema'] = executable['schema']
        if 'environment' in properties.keys():
            cp['environment'] = properties.get('environment')
        if 'previous' in properties.keys():
            cp['previous'] = properties.get('previous')

        stream = PreProcessor.parse(script, cp)

        tmp = File("tmp.sql")
        f = open(tmp.get_url(), 'w')
        f.write(stream)
        f.close()

        # FIXME: remove?
        #script_reader = open(tmp.get_url())

        feedback = File('feedback.log')
        feedback_writer = open(feedback.get_url(), 'w')
        # FIXME: rewrite with format
        statement = "sqlcmd -b -S {host},{port} -U {user} -P {passwd} -d {db} -i {url}".format(
            host=executable['host'],
            port=executable.get('port') or 1433,
            user=executable['username'],
            passwd=executable['password'],
            db=executable['database'],
            url=tmp.get_url(),
        )

        call = CallFactory.new_call(statement)
        call['stdout'] = feedback_writer
        call['stderr'] = feedback_writer
        result = Shell.execute(call)
        self.set_result(result)
コード例 #5
0
    def execute(self, executable, properties):
        """
        Execute the script provided by `executable` on the target server.

        :type executable: dict
        :param executable: Should contain the following keys and values:

            * **host**: The address of the server to connect to;
            * **port**: Server port to connect to;
            * **database**: The database name;
            * **username**: Database username;
            * **password**: Database user password;
            * **script**: Path to the script to execute.
        :type properties: noora.system.Properties.Properties
        :param properties: A Noora project properties instance
        """
        script = executable['script']

        cp = {
            'database': executable['database'],
            'username': executable['username'].split('@')[0]
        }
        if 'environment' in properties.keys():
            cp['environment'] = properties.get('environment')
        if 'previous' in properties.keys():
            cp['previous'] = properties.get('previous')

        stream = PreProcessor.parse(script, cp)

        tmp = File("tmp.sql")
        f = open(tmp.get_url(), 'w')
        f.write(stream)
        f.close()

        script_reader = open(tmp.get_url())

        feedback = File('feedback.log')
        feedback_writer = open(feedback.get_url(), 'w')

        statement = \
            "PGPASSWORD={passwd} psql -h {host} -p {port} -U {user} -d {db} " \
            "-v ON_ERROR_STOP=1".format(
                host=executable['host'],
                port=executable.get('port'),
                user=executable['username'],
                passwd=executable['password'],
                db=executable['database'],
            )

        call = CallFactory.new_call(statement)
        call['stdin'] = script_reader
        call['stdout'] = feedback_writer
        call['stderr'] = feedback_writer
        result = Shell.execute(call)
        self.set_result(result)
コード例 #6
0
ファイル: Properties.py プロジェクト: wlongxiang/noora
    def __get_config(self):
        """
        Load a myproject.json file and update some extra parameters if this is an actual project
        """
        current_dir = self.__props.get("current.dir")
        project_file = self.__props.get("project.file")

        config_file = File(os.path.join(current_dir, project_file))
        if not config_file.exists():
            noora_dir = self.__props.get("noora.dir")
            config_file = File(os.path.join(noora_dir, project_file))

        # Read project configuration
        with open(config_file.get_url()) as fd:
            data = json.load(fd)

        return data
コード例 #7
0
    def execute(self, arguments, properties):

        properties.set_property('create.dir', os.path.join(properties.get_property('current.dir'), 'create'))
        properties.set_property('alter.dir', os.path.join(properties.get_property('current.dir'), 'alter'))

        version = arguments.v
        Fail.fail_on_no_version(version)
        Fail.fail_on_unknown_version(version, properties)

        default_databases = properties.get_property('databases')
        databases = Ora.nvl(arguments.d, default_databases)
        Fail.fail_on_invalid_database(arguments.d, properties)

        current_dir = properties.get_property('current.dir')
        component_name = properties.get_property('component_name')
        target_dir = os.path.join(current_dir, properties.get_property('component_target_folder'))

        objects = properties.get_property('create_objects')

        build_dir = App.build_dir(version, properties)

        # exclude the file 'version.sql', this file is excluded from the dat listing below.
        component_excluded_files = properties.get_property('component_excluded_files')
        excluded_files = properties.get_property('excluded_files')
        excluded_files.extend(component_excluded_files)

        # create the target folder, if not present.
        if not File(target_dir).exists():
            os.makedirs(target_dir)

        print "building component with version '" + version + "'"

        zip_file = os.path.join(target_dir, component_name + '_' + version + '.zip')
        zip_handle = ZipFile(zip_file, 'w')

        for database in databases:

            for object in objects:

                if not object == 'lib':
                    # global ddl objects
                    folder = File(os.path.join(build_dir, database, 'ddl', object))
                    zip_dir = File(os.path.join(component_name + '_' + version, 'ddl', object))

                    files = Files.list_filtered(folder, properties)
                    for file in files:
                        print file.get_url()
                        target_file = File(os.path.join(zip_dir.get_url(), file.tail()))
                        zip_handle.write(file.get_url(), target_file.get_url(), ZIP_DEFLATED)

            # global dat files
            folder = File(os.path.join(build_dir, database, 'dat'))
            zip_dir = File(os.path.join(component_name + '_' + version, 'dat'))

            files = Files.list_filtered(folder, properties)
            for file in files:
                print file.get_url()
                target_file = File(os.path.join(zip_dir.get_url(), file.tail()))
                zip_handle.write(file.get_url(), target_file.get_url(), ZIP_DEFLATED)

        # create the version script in the dat folder
        version_statement = self.version_statement(version, properties)
        version_statement = version_statement.replace('<version>', version)
        version_statement = version_statement.replace('<name>', component_name)

        f = open('version.sql', 'w')
        f.write(version_statement)
        f.close()

        zip_dir = File(os.path.join(component_name + '_' + version, 'dat'))
        target_file = File(os.path.join(zip_dir.get_url(), 'version.sql'))
        zip_handle.write('version.sql', target_file.get_url())

        # remove the version.sql file.
        os.remove('version.sql')

        # create the checkversion script in the root folder
        # first retrieve the previous version for the checkversion script
        versions = Versions()
        version_loader = VersionLoader(versions)
        version_loader.load(properties)
        versions.sort()
        previous = versions.previous(Version(version))

        component_select_statement = properties.get_property("component_select_statement")
        component_select_statement = component_select_statement.replace('<name>', component_name)
        component_select_statement = component_select_statement.replace('<previous>', previous.get_value())
        print component_select_statement

        f = open('checkversion.sql', 'w')
        f.write(component_select_statement)
        f.close()

        zip_dir = File(os.path.join(component_name + '_' + version))
        target_file = File(os.path.join(zip_dir.get_url(), 'checkversion.sql'))
        zip_handle.write('checkversion.sql', target_file.get_url())

        # remove the version.sql file.
        os.remove('checkversion.sql')

        zip_handle.close()

        print "component with version " + version + " created."
コード例 #8
0
    def execute(self, properties, arguments):
        """
        Build the package after verifying version is valid, and database,
        if provided.

        :param properties: The project properties
        :param arguments: A dict of {
            'version': 'The version to package for'
            'database': 'The database to package for (optional)'
        }
        """
        prepared_args = self._validate_and_prepare(properties, arguments)

        version = prepared_args['version']
        databases = prepared_args['databases']
        current_dir = properties.get('current.dir')
        component_name = properties.get('component_name')
        target_dir = os.path.join(current_dir, properties.get('component_target_folder'))

        objects = properties.get('create_objects')

        if version == properties.get("default_version"):
            build_dir = properties.get("create.dir")
        else:
            build_dir = os.path.join(properties.get("alter.dir"), version)

        # exclude the file 'version.sql', this file is excluded from the dat listing below.
        component_excluded_files = properties.get('component_excluded_files')
        excluded_files = properties.get('excluded_files')
        excluded_files.extend(component_excluded_files)

        # create the target folder, if not present.
        if not File(target_dir).exists():
            os.makedirs(target_dir)

        print("building component with version '{}'".format(version))

        zip_file = os.path.join(target_dir, component_name + '_' + version + '.zip')
        zip_handle = ZipFile(zip_file, 'w')

        for database in databases:
            for obj in objects:
                if not obj == 'lib':
                    # global ddl objects
                    folder = File(os.path.join(build_dir, database, 'ddl', obj))
                    zip_dir = File(os.path.join(component_name + '_' + version, 'ddl', obj))

                    files = Files.list_filtered(folder, properties)
                    for file in files:
                        print(file.get_url())
                        target_file = File(os.path.join(zip_dir.get_url(), file.tail()))
                        zip_handle.write(file.get_url(), target_file.get_url(), ZIP_DEFLATED)

            # global dat files
            folder = File(os.path.join(build_dir, database, 'dat'))
            zip_dir = File(os.path.join(component_name + '_' + version, 'dat'))

            files = Files.list_filtered(folder, properties)
            for file in files:
                print(file.get_url())
                target_file = File(os.path.join(zip_dir.get_url(), file.tail()))
                zip_handle.write(file.get_url(), target_file.get_url(), ZIP_DEFLATED)

        # create the version script in the dat folder
        if version == properties.get("default_version"):
            version_statement = properties.get("component_insert_statement")
        else:
            version_statement = properties.get("component_update_statement")
        version_statement = version_statement.replace('<version>', version)
        version_statement = version_statement.replace('<name>', component_name)

        f = open('version.sql', 'w')
        f.write(version_statement)
        f.close()

        zip_dir = File(os.path.join(component_name + '_' + version, 'dat'))
        target_file = File(os.path.join(zip_dir.get_url(), 'version.sql'))
        zip_handle.write('version.sql', target_file.get_url())

        # remove the version.sql file.
        os.remove('version.sql')

        # create the checkversion script in the root folder
        # first retrieve the previous version for the checkversion script
        versions = Versions()
        version_loader = VersionLoader(versions)
        version_loader.load(properties)
        versions.sort()
        previous = versions.previous(Version(version))

        component_select_statement = properties.get("component_select_statement")
        component_select_statement = component_select_statement.replace('<name>', component_name)
        component_select_statement = component_select_statement.replace(
            '<previous>', previous.get_value())

        print(component_select_statement)

        f = open('checkversion.sql', 'w')
        f.write(component_select_statement)
        f.close()

        zip_dir = File(os.path.join(component_name + '_' + version))
        target_file = File(os.path.join(zip_dir.get_url(), 'checkversion.sql'))
        zip_handle.write('checkversion.sql', target_file.get_url())

        # remove the version.sql file.
        os.remove('checkversion.sql')

        zip_handle.close()

        print("component with version {} created.".format(version))